一、简介
AMQP全称是Advanced MessageQueuing Protocol (高级消息队列协议)。其官方网站在[1]。
AMQP是一个应用层的异步消息传递协议,为面向消息的中间件而设计。其目的是通过协议使应用模块之间或应用程序与中间件等进行充分解耦。而在设计初期,AMQP的原始用途只是为金融界提供一个可以彼此协作的消息协议。现在已经有相当一部分遵循AMQP的服务器和客户端供使用。其中RabbitMQ是AMQP的一款开源标准实现。RabbitMQ的官方网站参见[2].
AMQP现在已经成为OASIS的标准之一。
二、概念及技术
1.协议
AMQP的设计理念与数据通信网络中的路由协议有些相似。从应用程序角度,AMQP的应用也是服务器/客户端模式。但是在消息队列中,AMQP通过队列的状态决定生产者(Producer)、消费者(Consumer)之间的连接。
AMQP协议分为三层:ModelLayer,规范服务器和Broker行为;Session Layer定义客户端与服务器端Broker的上下文;Transport Layer传输二进制数据流。
2.Broker模型
AMQP的服务器(Broker)主要由交换器、消息、队列组成(有些文献归类为两项:交换器与消息队列)。Broker的主要功能是消息的路由和缓存。在RabbitMQ中,交换器分为持久交换器、临时交换器、自动删除交换器。对于需要保障可靠性的消息,RabbitMQ可以将消息、队列和交换器的数据写入本地硬盘。而对于响应时间敏感的消息,RabbitMQ可以不配置持久化机制。
交换器(Exchange)接受来自生产者的消息,并根据不同路由算法将消息发送到消息队列。
消息队列(Message Queue)在消息没有被消费者消费时将其缓存,当消费者与消息队列连接时,消息队列会把消息转发给消费者。
消息(Message)是AMQP通信的基本因素。消息由Header和Body组成。与TCP/IP协议类似,Header包含的是各种属性信息,Body是真正传输的数据。
交换器与消息队列的关联通过Binding实现。交换器与多个消息队列Binding后会形成一张“路由表”,其中存储的信息包括消息队列的限制条件既Binding Key。交换器收到消息时会解析其Header中的Routing Key,根据交换类型(Exchange Type)将消息路由到消息队列。流程以RabbitMQ官方的简介为例[4]:
BindingKey由消费者在Binding交换器与消息队列时指定。Routing Key在生产者发送消息时指定。两者的匹配方式由交换类型决定。
交换类型(Exchange Type)分为Direct(单播,又译为直连式),Topic(组播,又译为主题式),Fanout(广播)。对于Direct,Routing Key必须与BindingKey完全一致时匹配才成功;对于Topic,只要Routing Key符合Binding Key指定的模式,既Binding Key可以为一个匹配模式;而对于Fanout,Routing Key和Binding Key不受任何约束。默认情况下交换类型为Direct。
[1] http://www.amqp.org/
[2] http://www.rabbitmq.com/
[3] http://www.amqp.org/product/architecture
[4] http://www.rabbitmq.com/tutorials/amqp-concepts.html