导语
本文从AMQP协议(Advanced Message Queuing Protocol,高级消息队列协议)、消息功能、消费模型、金融级用法及其他功能点对比等概念介绍对RabbitMQ做了科普, 希望对各位深入理解RabbitMQ有帮助。
AMQP协议概念
AMQP协议自身定义了很多概念,下面先对这些概念进行剖析,会更侧重从每个概念实体的作用域、职责范围、从属关系等维度进行介绍。
AMQP协议概念实体图
Connection
Channel
Vhost
Exchange
Queue
Binding
消息功能
下面介绍RabbitMQ官方所提供的的开源原生功能,我们知道,AMQP协议可以看做成一种可编程式的消息队列协议,可以基于其提供的基础模型,通过自己的巧妙搭配组合,构造出多种多样的业务模型。
消息结构
每个消息分为三个部分,在网络层面即三个独立数据帧:
work queue 工作队列
官方讲解:https://www.rabbitmq.com/tutorials/tutorial-two-python.html
Publish/Subscribe 发布订阅模式
Queue不支持多订阅,通过转换思路实现:
官方讲解:
https://www.rabbitmq.com/tutorials/tutorial-three-python.html
Routing 路由模式
官方讲解:https://www.rabbitmq.com/tutorials/tutorial-four-python.html
Topic 通配符模式
官方讲解:https://www.rabbitmq.com/tutorials/tutorial-five-python.html
Header模式
RPC模式
官方讲解:https://www.rabbitmq.com/tutorials/tutorial-six-python.html
消费模型
消费模型也是使用一个消息系统所需要特别关心的一环,在业务的使用过程中,更多地会关注一条消息从生产到投递至消费者整个过程中都经历了什么,整个消息的声明周期是如何闭环的?
下面主要从TDMQ RabbitMQ版的实现来剖析RabbitMQ协议的消息生命周期。
从消息的生命周期看待消费模型
从内部核心组件看消费模型
从这张图可以获取那些信息?
Basic指令集: https://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.qos
Consumer Prefetch:
https://www.rabbitmq.com/consumer-prefetch.html
金融级用法
功能点对比
经过上述说明,你应该能利用RabbitMQ的功能点,结合自己的业务场景组织一个相对合理的生产消费拓扑。除了上面提到的功能点,RabbitMQ本身还提供了很多其他功能,下面主要列举一部分对比,可供参考和借鉴。
通道类
功能点 | 说明 | TDMQ支持情况 |
---|---|---|
认证和授权 | 基于User/Password的登录鉴权机制。 | 整合pulsar自身的JWT(role+token)机制进行对齐 |
连接协商机制 | 连接握手协商连接通信参数。 | 完全对齐RabbitMQ原生 |
认证和授权 | Vhost维度配置和User的权限关系。 | AMQP SDK使用层面完全对齐 |
限流协商机制(QoS) | 基于Unack数进行配额限制。 | 完全对齐RabbitMQ原生 |
注意:QoS机制RabbitMQ的实现是和标准AMQP协议有出入的,我们选择对齐RabbitMQ而不是AMQP规范,我们也认为RabbitMQ的模式较合理,详见https://www.rabbitmq.com/consumer-prefetch.html
Exchange类
功能点 | 说明 | TDMQ支持情况 |
---|---|---|
Exchange绑定Exchange | RabbitMQ在AMQP协议上的扩展,使Exchange不局限于只绑定Queue,借此可以构建出更加复杂的拓扑逻辑基于User/Password的登录鉴权机制。 | 暂未支持,排期中 |
死信Exchange | Queue的扩展参数,用于Queue中丢弃消息时转发至死信Exchange。 | 完全对齐RabbitMQ原生 |
备选Exchange | Exchange的扩展参数,用于消息发送至Exchange时,无法匹配任何路由规则到下游Queue,转发至备选Exchange。 | 完全对齐RabbitMQ原生 |
Queue类
功能点 | 说明 | TDMQ支持情况 |
---|---|---|
优先队列 | 消息可设置优先级,同时到达的消息可根据优先级投递,是一种局部性破坏先入先出机制的功能。 | 暂未支持,排期中 |
独占队列 | 声明队列只能被声明的Connection实体所连接,通常和临时队列配合使用。 | 暂未支持,排期中 |
临时队列 | 随机生成一个临时队列名,可用于当前进程专用,通常配合独占队列和AutoDelete一起使用。 | 暂未支持,排期中 |
回复队列 | 用于声明消息Producer处理完成后,向Producer进行回包的队列,以此实现一问一答的通信模型。 | 暂未支持,排期中 |
TTL | 针对消息设置TTL(time to live),过期未投递的消息将会被丢弃 or 进入死信。 | 目前支持vhost级别的TTL机制 |
镜像队列 | RabbitMQ为了解决单点储存问题而引入的,为了实现队列消息多副本存储。 | TDMQ天然多副本分布式存储,不需要该功能 |
收发机制类
功能点 | 说明 | TDMQ支持情况 |
---|---|---|
消息确认 | 消息在Broker成功存储后,回包Producer,进行发送成功确认。 | 完全对齐RabbitMQ原生 |
事务消息 | 消息确认功能出现前的发送确认机制,性能很差,不建议使用。 | 暂未支持,待定 |
延迟消息 | 消息发送成功后,延迟一定时间后才进行投递。 | 完全对齐RabbitMQ原生 |
RPC | 基于回复队列封装出的一问一答模型,使用场景较少,建议用主流RPC框架。 | 暂未支持,待定 |
参考
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf
https://www.rabbitmq.com/admin-guide.html
https://www.rabbitmq.com/amqp-0-9-1-reference.html
https://www.rabbitmq.com/getstarted.html
https://github.com/rabbitmq/rabbitmq-tutorials
后记
通过这篇文章,希望能对RabbitMQ进行一定程度的科普,也从一个从0到1设计一个RabbitMQ Broker的开发的角度,浅析了一些RabbitMQ的一些消费模型细节,补充点当前网络上对这部分细节的缺漏,希望可以起到一些启发作用。
后续,我们将会着重分享,如何在apache pulsar生态上构建出一套完全对齐RabbitMQ协议的高性能、高可用、云原生消息队列,相比原生RabbitMQ,我们有何优势,以及我们在过程中遇到的问题,产生的思考。
敬请期待~
扫描下方二维码关注本公众号,
了解更多微服务、消息队列的相关信息!
解锁超多鹅厂周边!