AMQP(Advanced Message Queuing Protocal,高级消息队列协议)是一个提供统一异步消息传递服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件而设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品、不同开发语言等条件的限制。
通常消息中间件的主要功能是消息的路由(Routing)和缓存(Buffering)。AMQP作为消息中间件中提供类似功能的两种域模型:Exchange(Routing)和Message queue(Buffering),如图8-1所示。
图8-1 AMQP组成
AMQP由3部分组成,分别是:
1)Exchange接收发布应用程序发送的消息,并根据一定的规则将这些消息路由到消息队列。
2)Message Queue存储消息,直到这些消息被消费者安全处理完为止。
3)Binding定义了Exchange和Message Queue之间的关联和路由规则。
Exchange本身不保持消息,只是起到路由的作用,Exchange接收消息生产者(Message Producer)发送的消息根据不同的路由算法将消息发送往Message Queue。Message Queue会在消息不能被正常消费时缓存这些消息,具体的缓存策略由实现者决定,当Message Queue与消息消费者(Message consumer)之间的连接通畅时,Message Queue会将消息转发到consumer。
一个Broker(AMQP服务器)中会存在多个Message Queue?Exchange怎样知道它要把消息发送到哪个Message Queue中去呢?图8-1中的Binding就是通过绑定Exchange与Message Queue来解决这个问题。消息应用者(Client Application)控制Exchange与某个特定Message Queue绑定,并将这个Message Queue接受何种特定消息的条件绑定到Exchange,这个条件也叫Binding key或Criteria。
AMQP协议的架构如图8-2示意。
图8-2 AMQP协议的架构
下面详细解释一下AMQP的工作原理:
从图8-2的AMQP架构图看,Message是AMQP所操纵的基本单位,它由Producer产生,经过Broker被Consumer所消费。它的基本结构有两部分:Header和Body。Header是由Producer添加上的各种属性的集合,这些属性有:控制Message是否可被缓存,接收的Queue是哪个,优先级是多少等。Body是真正需要传送的数据,它是对Broker不可见的二进制数据流,在传输过程中不应该受到影响。
一个Exchange在与多个Message Queue通过绑定后,Exchange中就会存在一个路由表,这个表中存储着每个Message Queue所需要消息的限制条件。Exchange就会检查它接收到的每个Message的Header及Body信息,来决定将Message路由到哪个Queue中去。每个Message的Header中应该有个属性叫Routing Key,它由Message发送者产生,提供给Exchange路由这条信息的标准。Exchange根据不同路由算法有不同有Exchange Type。
1)Direct类型,需要Binding Key等于Routing Key。
2)Topic类型,Binding Key与Routing Key符合一个带通配符的等式关系。
3)根据Message包含的某些属性来判断。
4)Fanout类型,忽略Binding Key和Routing Key,消息传递到所有绑定的Message Queue。
这些基础的路由算法由AMQP提供,当然Client Application也可以自定义各种自己的扩展路由算法。
当Exchange按照一定的路由算法把消息发到Message Queue后,作为消息的存储和分发实体,Message Queue会把消息缓存到内存或硬盘中,并且按照顺序把这些消息发给一个或者多个消息的消费者。
图8-2中的虚拟主机(Virtual Host)用来指Exchange和Message Queue组成的集合。它是一个虚拟概念,一个虚拟主机可以是一台服务器,还可以是由多台服务器组成的集群,还可以是一些虚拟机组成的集群,上面运行一些Exchange和Message Queue。