AMQP协议: AMQP全称“Advanced Message Queuing Protocol”即高级消息队列协议,用于提供一个消息服务的应用层的高级消息队列协议,面向消息的中间件设计。基于此协议可实现不同客户端与不同中间件之间的消息传递,使其不受开发语言和中间件产品等条件的限制。
术语:
术语 | 描述 |
---|---|
AMQP模型(AMQP Model) | 一个由关键实体和语义表示的逻辑框架,遵从AMQP规范的服务器必须提供这些实体和语义。通过实现该规范中的语义,客户端可通过命令控制AMQP服务器。 |
连接(Connections) | 一个网络连接,类似于TCP/IP套接字连接。 |
端点(Peer) | AMQP对话中的任意一方,一个AMQP连接包含两个端点(客户端和服务端)。 |
会话(Session) | 端点之间的命名对话,在一个会话上下文中,保证“只传递一次”。 |
信道(Channel) | 多路复用连接中的一条独立双向数据流通道,为会话提供物理传输介质。 |
客户端(Client) | AMQP连接或者会话的发起者,AMQP是非对称的,客户端负责生产和消费消息,服务端负责存储和路由消息。 |
服务端(Server) | 接收客户端的连接,实现AMQP消息队列和路由功能的进程,也称为"消息代理"。 |
搭档(Partner) | 当两个端点进行交互过程中,使用该术语来表示另一个端点的简记法。比如端点A和端点B,端点A是端点B的搭档,反之同理。 |
消息头(Header) | 描述消息数据属性的一种特殊段。由一系列可选属性组成,包括 |
消息体(Body) | 包含应用程序数据的一种特殊段。消息体段对于服务器来说完全透明——服务器不能查看或者修改消息体。 |
消息内容(Content) | 包含在消息体段中的的消息数据。 |
交换器(Exchange) | 服务器中的实体,用来接收生产者发送的消息并将这些消息路由给服务器中对应的队列。 |
交换器类型(Exchange Type) | 基于不同路由语义的交换器类。 |
消息队列(Message Queue) | 一个命名实体,用来保存消息直到发送给消费者 |
绑定器(Binding) | 消息队列和交换器之间的关联。 |
绑定器关键字(Binding Key) | 消息队列和交换器之间绑定的名称,一些交换器类型可能使用这个名称作为绑定器路由行为的模式。 |
路由关键字(Routing Key) | 一个消息头,交换器可以用这个消息头决定如何路由某条信息。 |
持久存储(Durable) | 一种服务器资源,当服务器重启后,保存的消息不会丢失。 |
临时存储(Transient) | 一种服务器资源,当服务器重启后,保存的消息会丢失。 |
持久化(Persistent) | 服务器将消息保存在可靠磁盘中,当服务器重启后,消息不会丢失。 |
非持久化(Non-Persistent) | 服务器将消息保存内存中,当服务器重启后,消息会丢失。 |
生产者(Producer) | 一个向交换器发送消息的客户端应用程序 |
消费者(Consumer) | 一个向消息队列中获取消息的客户端应用程序 |
虚拟主机(Virtual Host) | 一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。客户端应用登录到服务器之后,可以选择一个虚拟主机。 |
片段集(Assembly) | 段的有序集合,形成一个逻辑工作单元。 |
段(Segment) | 段的有序集合,形成一个逻辑工作单元。 |
帧(Frame) | 帧的有序集合,形成片段集中一个完整子单元。 |
控制(Control) | 单向指令,AMQP规范假设这些指令的传输是不可靠的。 |
命令(Command) | 需要确认的指令,AMQP规范规定这些指令的传输是可靠的。 |
异常(Exception) | 在执行一个或者多个命令时可能发生的错误状态。 |
类(Class) | 一批用来描述某种特定功能的AMQP命令或者控制。 |
RabbitMQ概念:
通常情况下的消息服务由三个概念组成,分别是生产者->消息队列->消费者。而RabbitMQ在这个概念上,加入了一层抽象。在生产者到消息队列之间加入了交换器。这里生产者和消息队列之间没有直接联系,而是通过与交换器建立信道,将消息发送到交换器,由交换器根据调度策略(路由规则)将消息转发给对应的消息队列。消息队列将消息进行存储,等待消费者取出。消费者则需要和消息队列建立信道,从消息队列中获取消息。
Exchange消息调度策略: 调度策略(路由规则)是指生产者发送消息到交换器之后,交换器依据什么规则将消息转发到对应的一个或者多个的消息队列中。与调度策略相关的三个因素:Exchange Type、Binding Key、Routing Key。Exchange通过消息的Routing Key和Exchange绑定Queue的Binding Key 根据Exchange Type进行匹配进而分配消息。生产者向交换器发送的消息时,通过其Routing Key决定了消息的去向。
-
Fanout (订阅模式/广播模式) 订阅模式类型的交换器会把发送到该交换器的消息分发到与此交换器绑定的所有消息队列中,这里与Routing Key 和 Binding Key是否匹配无关。相当于子网广播,Fanout转发消息是所有类型中最快的。
-
Direct (路由模式) 路由模式属于一种精确匹配的方式。需要消息的Routing Key和Exchange绑定Queue之间的Binding Key完全匹配,交换器才会将此消息转发到其绑定的消息队列中。Direct是Exchange的默认模式。 RabbitMQ 提供了一个默认的无名Exchange,类型为Direct,名字是空字符串。该无名Exchange绑定到所有的Queue中,这里的无名Exchange和Queue之间的Binding Key是Queue的名字。 (当这种情况下,如果Routing Key的命名一样时,可能会感觉到没有交换器的存在。其实只是使用了RabbitMQ提供的默认Exchange而已)
-
Topic (通配符模式) 通配符模式属于一种按正则表达式的模糊匹配。需要消息的Routing Key和Exchange绑定Queue之间的Binding Key模糊匹配成功,交换器才会将此消息转发到其绑定的消息队列中。 Routing Key和Binding Key可以是一个句点 “ . ” 分割的字符串(将被句点 “ . ” 分割的每一段独立字符串称之为单词)。Binding Key中可以存在两种特殊字符 “ * ” 和 “ # ” 用于做模糊匹配,其中 “ * ” 用于匹配单个单词, “ # ” 用于匹配多个单词(可以是零个)。
-
Headers (键值对模式) 键值对模式不依赖于Routing Key 和 Binding Key的匹配规则来转发消息,交换器的路由规则是通过消息的消息头的Headers属性来进行匹配转发,类似于HTTP请求的请求头Headers。