AMQP是什么
Advanced Message Queuing Protocol(高级消息队列协议), 一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。 最典型的实现是以Erlang开发的RabbitMQ
AMQP 模型
Exchange(交换机):接收发布者发送的消息,并且根据对应交换机的路由规则,将消息路由到队列中
Queue(队列):存储消息,并将消息发送给订阅该队列的消费者
Binding:定义
Exchange
和Queue
的关系,提供交换机到队列的路由关系
交换机 Exchange
交换机,生产者将消息发送到交换机,交换机根据路由规则将消息路由一个或多个队列中。而路由规则受 Exchange 的类型和绑定(binding) 关系的影响。AMQP 0-9-1 broker 提供了如下 四个 exchange 类型:
类型 | 功能 |
---|---|
Direct Exchange | 直连交换机,任何绑定在交换器上的队列,只要它的路由键和发布消息时的一致,它就能收到消息。 |
Fanout Exchange | 所有发往fanout交换器的消息会被投递到所有绑定到该交换器上的队列中。 |
Topic Exchange | topic交换器会将消息路由至匹配路由键的任一队列中。但是通过采用句点分隔的形式,队列可以通过使用基于通配符的模式匹配的方式来绑定到路由键上。 |
Headers Exchange | 绑定至headers交换器的队列会向Queue.Bind参数中传入键值对数组以及x-match参数。x-match参数是字符串类型,可以设置为any或者all。如果将其设置为any,同时headers表中的值匹配了任何一个绑定值的话,消息就会被路由过去。如果将x-match设置为all的话,那么所有传入Queue.Bind中的参数值必须全部匹配才行。 |
队列 Queue
AMQP模型中的队列有以下几个重要概念
- Name:队列名
- Durable:是否持久,如果设置为 true,即使
broker
重启,该队列依然存在 - Exclusive:队列是否独占,设置为 true 时,表示此队列只能有一个消费者,并且当此队列断开连接时,此队列会被删除
- Auto-delete:设置为 true 时,此队列会在最后一个消费者取消订阅时被删除
队列的绑定 Binding
消息从 publisher
发布消息并不是直接发送到队列的,而是先经过交换机,再由交换机路由到绑定的队列上,根据交换机类型的不同,路由规则也不同,使得消息的发布更加灵活,因此交换机和队列有一个绑定的关系。
一个 exchange 能够将消息路由到某个队列的前提是此队列已经绑定到这个 exchange 中了. 当队列绑定到一个 exchange
中时, 我们还可以设置一个额外的参数, 即 routing key, 这个 key 会被 direct exchange
和 topic exchange
作为额外的路由信息而使用, 换句话说, routing key 扮演着过滤器的角色。
Virtual host
为了在一个 broker 中实现不同的相互隔离的环境(例如每个环境中有不同的用户, 不同的 exchange, 不同的队列等), AMQP 引入了一个叫做 virtual host(vhost)的概念,每一个 vhost 都可以当作一个消息中间件来使用。在连接 broker 时, 客户端可以指定需要使用哪个 vhost。
常见属性
在消息标准化的发展过程中,AMQP消息属性为定义和传输消息元数据提供了一个有用的起点。这些元数据反过来使读者能够在消息发布者和消费者之间建立严格的契约。以下列举常见的基本属性:
- content-type:让消费者直到如何解析消息体
- message-id和correlation-id:标识消息和消息响应,用于在工作流程中实现消息跟踪
- expiration:消息过期时间
- delivery-mode:是否将消息持久化,1表示非持久化消息,2表示持久化消息
- timestamp:消息的创建时间
- headers:headers属性是一个键/值对表,允许用户自定义任意的键和值
参考 深入RabbitMQ 以及若干博客