AMQP

面向消息的中间件设计的一个标准的应用层二进制通信协议

消息交互标准


JMS(Java Message Service)同样是消息通信标准,但是它是API标准,这是说在代码层面可以用同一套代码适配不同的消息产品。但是仅仅是调用接口相同,各产品在信息格式和传输上各不相同,不能跨产品通信。AMQP可以看作是实现的标准,它定义了数据格式。遵从这一标准,消息具备了互操作性,无论来自哪种操作系统、CPU架构、产品以语言实现。

AMQP架构[1]


AMQP中的主要概念

  • Broker: 一个中间件,负责接收生产者的消息并传递给消费者
  • Virtual Host: 相当于命名空间,进行组件隔离
  • Exchange:所有消息的集散地,路由到消息队列
  • Queue: 消息的目的地,存储等候消费者处理
  • Binding: 路由规则,定义如何路由消息

AMQP的特点是消息生产者不是直接把消息发到队列上,而是都发送到Exchange上,由Exchange根据Binding规则决定消息路由到哪些队列上。可以自定义规则使得路由更加灵活。

Exchange模式[2]


AMQP的消息包含消息头和消息体。消息头包含目的地,路由关键字(Routing key),优先级等描述信息,消息体是真正传输的二进制数据。
每个Queue可以有一个绑定关键字(binding key)。这两个key可以作为路由的依据。

典型的路由方式

  • Fanout: 消息会传到所有队列
  • Direct:消息会传到routing key和binding key相等的队列
  • Topic: 消息会传到满足binding key通配符规则的队列
  • Header: 查询Header中的其他属性值作为路由依据
  • Custom: 自定义的路由规则

  1. 参考 Messaging with RabbitMQ - in Java

  2. 参考 Red Hat Messaging User Guide