1.前言
AMQP作为Rabbitmq的协议,学习它可以一定的了解Rabbitmq的运行原理和其中的组件。AMQP已经有1.0版本,但是Rabbitmq使用的是0-9-1版本,截止笔者写这边博文时,Rabbitmq的官方网站目前是0-9-1,互联网上流传的是AMQP-0-10版本的前三章翻译。此次作为针对网友提供的翻译进行一些学习,同时把笔者认为相对重要的摘录我这篇博文中。
2.服务器三个主要功能模块
- 2.1.“exchange”接收发布应用程序发送的消息,并根据一定的规则将这些消息路由到“消息队列”。
- 2.2.“message queue”存储消息,直到这些消息被消费者安全处理完为止。
- 2.3.“binding”定义了exchange和message queue之间的关联,提供路由规则。
3.三层结构
4.消息交换体系结构
5.术语
AMQP模型(AMQP Model):一个由关键实体和语义表示的逻辑框架,遵从AMQP规范的服务器必须提供这些实体和语义。为了实现本规范中定义的语义,客户端可以发送命令来控制AMQP服务器。连接(Connection):一个网络连接,比如TCP/IP套接字连接。
会话(Session):端点之间的命名对话。在一个会话上下文中,保证“恰好传递一次”。
信道(Channel):多路复用连接中的一条独立的双向数据流通道。为会话提供物理传输介质。
客户端(Client):AMQP连接或者会话的发起者。AMQP是非对称的,客户端生产和消费消息,服务器存储和路由这些消息。
服务器(Server):接受客户端连接,实现AMQP消息队列和路由功能的进程。也称为“消息代理”。
端点(Peer):AMQP对话的任意一方。一个AMQP连接包括两个端点(一个是客户端,一个是服务器)。
搭档(Partner):当描述两个端点之间的交互过程时,使用术语“搭档”来表示“另一个”端点的简记法。比如我们定义端点A和端点B,当它们进行通信时,端点B是端点A的搭档,端点A是端点B的搭档。
片段集(Assembly):段的有序集合,形成一个逻辑工作单元。
段(Segment):帧的有序集合,形成片段集中一个完整子单元。
帧(Frame):AMQP传输的一个原子单元。一个帧是一个段中的任意分片。
控制(Control):单向指令,AMQP规范假设这些指令的传输是不可靠的。
命令(Command):需要确认的指令,AMQP规范规定这些指令的传输是可靠的。
异常(Exception):在执行一个或者多个命令时可能发生的错误状态。
类(Class):一批用来描述某种特定功能的AMQP命令或者控制。
消息头(Header):描述消息数据属性的一种特殊段。
消息体(Body):包含应用程序数据的一种特殊段。消息体段对于服务器来说完全不透明——服务器不能查看或者修改消息体。
消息内容(Content):包含在消息体段中的的消息数据。
交换器(Exchange):服务器中的实体,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
交换器类型(Exchange Type):基于不同路由语义的交换器类。
消息队列(Message Queue):一个命名实体,用来保存消息直到发送给消费者。
绑定器(Binding):消息队列和交换器之间的关联。
绑定器关键字(Binding Key):绑定的名称。一些交换器类型可能使用这个名称作为定义绑定器路由行为的模式。
路由关键字(Routing Key):一个消息头,交换器可以用这个消息头决定如何路由某条消息。
持久存储(Durable):一种服务器资源,当服务器重启时,保存的消息数据不会丢失。
临时存储(Transient):一种服务器资源,当服务器重启时,保存的消息数据会丢失。
持久化(Persistent):服务器将消息保存在可靠磁盘存储中,当服务器重启时,消息不会丢失。
非持久化(Non-Persistent):服务器将消息保存在内存中,当服务器重启时,消息可能丢失。
消费者(Consumer):一个从消息队列中请求消息的客户端应用程序。
生产者(Producer):一个向交换器发布消息的客户端应用程序。
虚拟主机(Virtual Host):一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。客户端应用程序在登录到服务器之后,可以选择一个虚拟主机。
6.功能组件
7.消息流程
8.消息生命周期
如果消息无法路由,交换器可能会根据生产者的要求,直接丢弃或者拒绝这些消息,或者将它们路由给其他交换器。
当消息到达某个消息队列时,消息队列立即尝试将它通过AMQP协议传递给客户端应用程序。如果消息无法传递,消息队列会保存这条消息,并且等待消费者的订阅。
可被送达的消息将会从内部缓冲区被删除。删除动作可能会立即发生,或者在订阅者成功处理且明确接受消息之后发生。订阅者决定在什么时候如何接受消息,也可以将消息放回到队列中,或者在无法处理消息的时候拒绝它。
9.生产者视角
AMQP模型采用与电子邮件系统相同的原理:所有消息被发送到交换器,交换器根据规则信息检查消息,然后将它们路由给其他组件,交换器的这两个动作对于用户来说都是透明的。
10.虚拟主机
虚拟主机由它自己的名字空间和一组交换器、消息队列和所有关联的对象组成。每个连接必须和某个虚拟主机关联。
11.三种重要交换器
直接式交换器类型 (Direct Exchange)
所有使用各自消息队列名称作为绑定关键字的消息队列必须自动和无名交换器绑定在一起。
广播式交换器类型(Fanout Exchange) 广播式交换器类型提供了这样的路由机制:不论消息的路由关键字是什么,这条消息都会被路由到所有与该交换器绑定的队列中。
主题式交换器类型(Topic Exchange)
主题式交换器类型提供了这样的路由机制:通过消息的路由关键字和绑定关键字的模式匹配,将消息路由到被绑定的队列中。
消息头式交换器类型(Headers Exchange)
系统交换器类型(System Exchange)
自定义交换类型(Implementation-defined Exchange)
12.消息队列
消息队列可以是持久的、临时的或者自动删除的。
只要用户(客户端)拥有相应的权限,任何队列都可以被显式删除。
消息队列将消息保存在内存、硬盘,或者这两种介质的组合之中。
消息队列会跟踪消息的获取情况,消息要出队就必须被获取(acquire和consume是两个动作,先执行acquire,相当于对消息加锁)。这阻止了多个客户端同时获取和消费同一条消息,也可以被用来做单个队列多个消费者之间的负载均衡。
如果消息被客户端释放或者最初被发送的消息没有被获取,一个队列中的消息可能会被发送给多个客户端。为了允许客户端能够安全的浏览队列中的内容,消息队列可能会将未被获取的消息分发给客户端。
13.消息
消息可以有优先级,在同一个消息队列中的高优先级消息可能会比低优先级的消息更早被发送给客户端。当消息必须被丢弃时,服务器会先丢弃低优先级消息。服务器不会更改消息体,但是可能会在转发消息给消费者应用程序之前更改某些消息头属性。