AMQP(Advanced Message Queueing Protocol)协议是一个开放的标准的的协议,它定义了系统之间如何传递消息。AMQP不仅定义了consumer/producer/broker之间如何交互,也定义了消息的格式和命令的交换。因为它定义了消息的格式,AMQP是跨平台的,与具体生产厂商和主机平台无关。由于AMQP是开放的,AMQP有很多活跃的基于多种语言编写的broker和client的项目。这篇文章主要介绍AMQP描述的基本模型。
核心概念
让我们先一起来看看AMQP的核心概念:
Broker:代表着一个中间件应用,负责接收消息生产者的消息,然后将消息发送至消息接受者或者其他的broker。
Virtual host:这是对broker的虚拟化分,主要用于对consumer、producer和他们依赖的AMQP相关结构进行隔离。通常是处于安全因素的考虑。
Connection:代表着producer、consumer和broker之间的物理网络(TCP),connection只有在客户端断开连接或者网络问题的时候会断开。
Channel:代表着producer、consumer和broker之间的逻辑连接,一个Connection可以包含多个Channel。Channel使得基同一连接的不同进程之间与broker之间的交互相互隔离,不干扰。而不需要重新建立连接,channel在发生协议错误的时候会被关闭。
Exchange:这是所有被发送的消息首先到达的目的地,Exchange负责根据路由规则将消息路由到不同的目的地。路由规则包括下面几种:direct(point-to-point)、topic(publish-subscribe)和fanout(multicast)。
Queue:这是消息到达的最终目的地,到达queue的消息是已经准备好被消费的消息,一个消息可以被exchange copy发送至多个queue。
Binding:这是queue和exchange之间的虚拟连接,使得消息从哪个exchange路由到Queue。routing key可以通过binding和exchange routing规则关联。
下面给出AMQP协议的概念模型图:
相关协议
你可以现在已经在使用队列,而且想知道AMQP和其他的协议有什么区别,下面我们快速浏览一下:
Java Message Service(JMS):与AMQP不同的是,JMS只定义了JAVA编程接口协议,而没有定义消息的具体格式。因此,JMS适用范围较小,只能够用于特定的客户端和broker。而且相比AMQP,JMS没有定义命令交互、消息路由。最后,在JMS中,消息发送者需要知道消息目的的拓扑。在AMQP中,路由逻辑被封装在了exchange之中,从而保护了消息的发送者。
MQ Telemetry Transport(MQTT):这是一个极其轻量级的消息队列协议。MQTT只专注于消息发送-消息订阅模型。和AMQP一样,交互性比较强并且适合嵌入式系统,同样它也需要一个broker用于订阅管理和消息路由。RabbitMQ可以和MQTT通信,这是令人兴奋的。
ZeroMQ:它提供了消息的一种语义,不需要中心化的broker(但是没有broker提供的持久化和保证送达机制)。核心思想,它是一个可交互的网络编程库,基于多种语言实现。它是一个构建高可用性和高扩展性系统的一种选择。
Process inboxes:如Erlang这种编程语言或Akka这种平台提供的语义类似,它们依赖集群技术来实现不同进程或actors之间分发消息。尽管它们被嵌入到主机应用,它们不是被设计用来互操作的。
目前已经有多种商业或开源的AMQP实现,同时、已经存在的消息broker提供了AMQP的适配,比如ActiveMQ。
本文翻译自《RabbitMQ Essentials》。