RabbitMQ 是用 Erlang 语言编写的,实现了高级消息队列协议(AMQP)的消息中间件。
AMQP 协议概念
AMQP 是一种链接协议,直接定义网络交换的数据格式,这使得实现了 AMQP 的 provider 本身就是跨平台的。以下是 AMQP 协议模型:
server
- 又称broker
,接收客户端的链接,实现 amqp 实体服务connection
- 链接,应用程序跟 broker 的网络链接channel
- 网络信道,几乎所有的操作都是在 channel 中进行,数据的流转都要在 channel 上进行。channel 是进行消息读写的通道。客户端可以建立多个 channel,每个 channel 代表一个会话任务message
- 消息,服务器与应用程序之间传送的数据。由 properties 和 body 组成。properties 可以对消息进行修饰,比如消息的升级,延迟等高级特性。body 就是消息体的内容virtual host
- 虚拟主机,用于进行逻辑隔离,最上层的消息路由,一个虚拟地址里面可以有多个交换机。exchange 和消息队列 message queneexchange
- 交换机,接收消息,根据路由器转发消息到绑定的队列binding
- 绑定,交换机和队列之间的虚拟链接,绑定中可以包含 routing keyrouting key
- 一个路由规则,虚拟机可以用它来确定如何路由一个特定消息quene
- 消息队列,保存消息并将它们转发给消费者
RabbitMQ 的消息模型
1. 简单模型
- P:生产者
- C:消费者
- 红色部分:quene,消息队列
2. 工作模型
当消息处理比较耗时时,就会出现生产消息的速度远远大于消费消息的速度,这样就会出现消息堆积,无法及时处理。这时就可以让多个消费者绑定一个队列,去消费消息,队列中的消息一旦消费就会丢失,因此任务不会重复执行。
- P:生产者
- C 1、C 2:消费者
- 红色部分:quene,消息队列
3. 广播模型(fanout)
这种模型中生产者发送的消息所有消费者都可以消费。
- P:生产者
- X:交换机
- C 1、C 2:消费者
- 红色部分:quene,消息队列
4. 路由模型(routing)
这种模型消费者发送的消息,不同类型的消息可以由不同的消费者去消费。
- P:生产者
- X:交换机,接收到生产者的消息后将消息投递给与 routing key 完全匹配的队列
- C 1、C 2:消费者
- 红色部分:quene,消息队列
5. 订阅模型(topic)
这种模型和 direct 模型一样,都是可以根据 routing key 将消息路由到不同的队列,只不过这种模型可以让队列绑定 routing key 的时候使用通配符。这种类型的 routing key 都是由一个或多个单词组成,多个单词之间用.分割。
通配符介绍:
*
:只匹配一个单词#
:匹配一个或多个单词
6. RPC 模型
这种模式需要通知远程计算机运行功能并等待返回运行结果。这个过程是阻塞的。
当客户端启动时,它创建一个匿名独占回调队列。并提供名字为 call 的函数,这个 call 会发送 RPC 请求并且阻塞直到收到 RPC 运算的结果。
Reference