RabbitMQ必知必会

什么是RabbitMQ

RabbitMQ是一个消息队列(MQ=Message Queue),它实现了高级消息队列协议(AMQP=Advanced Message Queue Protocol)。所谓的AMQP就是,用于统一面向消息中间件实现的一套标准协议,这种消息协议,可使符合要求的客户端与符合要求的消息代理进行通信。

实现原理

交换机(exchange)

AMQP的实体将消息发送到交换机。交换机接受消息并将其路由到对应的队列。除了4中交换机类型,交换机还有一些特殊的属性。交换机可以是持久的或者临时的。消息代理重启后,具有持久化属性的交换机可以保证消息不丢失,临时的则不行。

交换机相关名词

路由键(routing key)

消息中自带的属性,主要用于直连、主题等交换机。

信道(channels)

保持大量的TCP连接,成本比较高,会消耗较多的系统资源,AMQP协议采用了可共享单个TCP连接的轻量级连接,简称为信道。

虚拟主机(Virtual Hosts)

单个消息代理可以隔离用户组,交换机,队列等,相当于有着自己的独立环境。

消息确认(Message Acknowledgements)
  1. 消息自动确认机制,消息代理发送消息到应用后,例如调用AMQP协议中的方法basic.deliver或basic.get-ok。
  2. 消息显式确认机制,调用AMQP协议中的方法basic.ack。

交换机的类型

默认(Direct)

实际上也是Direct类型的交换机,默认为无名称预定义的消息代理。它有一个特殊的属性,使它在简单的应用中非常有用:每一个队列自动创建一个名称与队列名称一致的路由键为并绑定到相同名称的队列。

直连(Direct)

直接转发相关的消息到指定的队列。直连交换机通过路由键来传递消息到队列。
1. 队列通过路由键 K 绑定到交换机
2. 消息带有一个路由键 R会发送到该直连路由,当K=R时,直连交换机将消息发送到该队列。

广播(Fanout)

大多数人喜欢翻译为扇出,我觉得这个概念可能和广播类似,直接将消息广播到所有绑定的队列。

主题(Topic)

基于主题的队列,实现消息的路由键的精准匹配或者模糊匹配。每一个匹配条件是或的关系。

通过对消息的路由键进行匹配:
1. * 星号匹配一个单词
2. # 井号匹配0到多个单词。

匹配关系如下面的表格:

路由键 *.orange.* *.*.rabbit lazy.#
quick.orange.rabbit
lazy.orange.elephant
quick.orange.fox
lazy.brown.fox
lazy.pink.rabbit
quick.brown.fox
orange
quick.orange.male.rabbit
lazy.orange.male.rabbit
头交换机(Headers)

根据消息的headers参数动态的路由相关消息。当采用headers交换机时,路由键就失效了。可以利用参数x-match的值(any/all)来确认是匹配全部还是部分。

交换机特殊的属性

名称(Name)

每一个交换机需要定义个名称,作为唯一标识。

持久性(Durability)

标识该交换机里的消息,是否需要进行持久化,即使消息代理重新启动了。

自动删除

当最后一个队列取消绑定时删除掉交换机。

为什么选择RabbitMQ

大多数人可能会拿RabbitMQ vs Kafka作对比,我只想说,性能只是消息队列里众多的特性之一。大多数情况下,RabbitMQ采用3-7个节点就可以获得很好的性能。下面列举一个表格对比这这者之间的差异:

特性/场景 RabbitMQ Kafka
没有复杂的路由
最大吞吐量100k/s
至少按照分区顺序传送一次
流处理
事件溯源
兼容复杂的协议
指定的消息确认
复杂的路由规则
开发体验 官方提供11个客户端 官方提供Java客户端,第三方补充
安全和操作性 HTTP API 管理CLI由shell脚本构成
管理监控Web UI
良好的 CLI工具
Zookeeper依赖 依赖ZK提供HA,大约比例为3个Kafka+5台ZK
性能 20k/s 容易 最高100k/s

RabbitMQ最佳实践

cloudamqp写了4篇关于RabbitMQ的文章,讲述了RabbitMQ的最佳实践,非常值得一看。
1. Part 1: RabbitMQ Best Practice
2. Part 2 – Best Practice for High Performance
3. Part 3 – Best Practice for High Availability
4. Part 4 – 13 common RabbitMQ mistakes

参考链接

  1. 高级消息队列协议
  2. AMQP 0-9-1 Model Explained
  3. RabbitMQ Tutorial
  4. AMQP 0-9-1 读后感
  5. Understanding When to use RabbitMQ or Apache Kafka
  6. rabbitmq 实现原理
  7. 深入了解RabbitMQ工作原理及简单使用
  8. RabbitMQ – Best Practices For Designing Exchanges, Queues And Bindings?
打赏作者

您的支持将鼓励我们继续创作!

[微信] 扫描二维码打赏

[支付宝] 扫描二维码打赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注