RabbitMQ 是使用 Erlang 语言基于AMQP协议进行开发的,也可以说 RabbitMQ 是 AMQP 协议的一种实现。学习 RabbitMQ 之前需要对 AMQP 协议进行一些了解。
什么是AMQP
AMQP,即Advanced Message Queuing Protocol,AMQP 被设计成为一种开放标准,以解决众多的消息队列需求和拓扑结构问题。基于此协议的客户端与消息中间件可传递消息,并不受不同客户端产品和不同中间件产品的影响,也不受不同的开发语言条件的限制。
AMQP名词解释
Vhost
虚拟主机(Virtual Host),每一个 Vhost 本质上是一个 mini 版的消息队列服务器,它拥有自己的队列、交换器、绑定等,更重要的是它拥有自己的权限机制,Vhost 相当于物理机上的虚拟机。它们各个实例间是逻辑分离的。
队列 Queue
用来存储消息的数据结构,位于硬盘或内存中。每个消息都会被投入到一个或多个队列里。
生产者 Producer
消息生产者,即投递消息的程序。
消费者 Consumer
消息消费者,即接收消息的程序。
连接 Connection
TCP 连接,生产者或消费者与消息队列服务间的物理 TCP 连接。
交换器 Exchange
消息代理服务器中用于把消息路由到队列的组件。生产者将消息发送到交换器,由交换器将消息路由到一个或多个队列中(或者丢弃),交换器按照相应的绑定逻辑将消息路由到队列中。
绑定 Binding 或 绑定键 Binding Key
用于告诉交换器消息应该被存储到哪个队列。它的作用是把交换器和队列按照路由规则绑定起来,换句话说,绑定键是绑定队列到交换器的粘合剂。
路由键 Routing Key
路由键可以是队列名称,也可以是一串用于描述消息、具有特定语法的字符串。当交换器对一条消息进行评估以决定路由到哪些合适的队列时,消息的路由键会和绑定键进行比对。
信道 Channel
在客户端的每个物理 TCP 连接里,可建立多个信道,每个信道代表一个会话任务。就像一条光缆有许多光纤束一样。
为什么引入信道的概念
生产者要发布消息,消费者要消费消息都要跟先和消息中间件建立起连接——TCP 连接,信道是建立在 TCP 连接内的虚拟连接。AMQP 命令都是通过信道发送的,每条信道都会被指派一个唯一的 ID。
使用信道而不是 TCP 连接发送 AMQP 命令的原因在于,操作系统建立和销毁 TCP 会话的开销是大的。假设应用程序从队列消费消息,并根据服务需求合理调度线程,如果只进行 TCP 连接,那么每个线程都需要自行连接到消息中间件,在应用高峰期会有每秒成百上千条 TCP 连接,这会造成 TCP 连接的巨大浪费,何况操作系统每秒也就只能建立这点数量的连接,因此很容易就碰到瓶颈了。如果所有线程只是用一条 TCP 连接就能满足性能方面的要求,并且又能确保每条线程的私密性,就像拥有独立的连接一样,就很完美了是不是。
线程启动后,会在现有连接上创建一条信道,也就获得了连接到消息中间件的私密通道路径,而不会给操作系统的 TCP 栈造成额外的负担,因此即使每秒成百上千的创建信道也不会影响操作系统。在一条 TCP 连接上创建多少条信道是没有限制的。
信道与连接
网友评论