Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >科普 — 关于Rabbit MQ与AMQP协议概念,你想了解的都在这里...

科普 — 关于Rabbit MQ与AMQP协议概念,你想了解的都在这里...

作者头像
腾讯云中间件团队
发布于 2021-11-10 11:12:43
发布于 2021-11-10 11:12:43
1.8K0
举报

导语

本文从AMQP协议(Advanced Message Queuing Protocol,高级消息队列协议)、消息功能消费模型金融级用法其他功能点对比等概念介绍对RabbitMQ做了科普, 希望对各位深入理解RabbitMQ有帮助。

AMQP协议概念

AMQP协议自身定义了很多概念,下面先对这些概念进行剖析,会更侧重从每个概念实体的作用域、职责范围、从属关系等维度进行介绍。

AMQP协议概念实体图

Connection

  • 对应底层一个AMQP-Client到RabbitMQ-Broker的一个TCP连接。
  • 这边要考虑两个端点问题,在TCP连接建立完成后,如下图所示,连接的目标Broker就已经确定是集群中的一台了,由于是长连接,除非断连重建,否则对端节点不可变。
  • 所以从这里可以看出RabbitMQ相比Pulsar、RocketMQ不一样的地方在于,其是一种服务端寻址模型,以Client的视角来看,想要连接任意Exchange、Queue,只要连上任意一台Broker就行。

Channel

  • 信道,可以理解为一种逻辑连接,体现了多路复用的设计思路。
  • 支持串行执行,包括收和发的指令,可以理解为一种半双工模式的“虚拟网络通道”。
  • 所有Exchange、Queue、Binding的操作都是在Channel之上进行的。

Vhost

  • 等价于一种租户隔离概念,不同Vhost下可以创建同名Exchange、Queue,这样可以进行业务隔离。
  •  RabbitMQ的权限隔离和权限控制的机制是在Vhost级别的。
  • Rabbit官方原生的全局Policy控制在Vhost级别。

Exchange

  • 一个虚拟实体,声明不同消息的路由策略,自身不存储消息。
  • 一个路由器,基于消息头部的RoutingKey和Header将消息路由到符合条件的具体的Queue。
  • 支持单播和广播。

Queue

  • 消息存储实体,是消息底层存储的容器,类似Pulsar的Topic。
  • 单订阅模式,其下的Consumer分别消费到一部分消息。
  • 和存储关联,因此有容量上限、ttl等存储层的特性。
  • 支持多消费和独占消费,取决于你订阅时设置的参数。由于它是存储消息系统的消息,所以内部基于一个消费位点控制持久化消费进度,记录最后被消费并Ack的位置。
  • 面向Consumer。

Binding

  • 衔接Exchange和Queue的桥梁,本质是一个规则的声明。
  •  一个Exchange下可以有多个Binding。
  • 一个Queue也可以被多个Binding关联。
  • 一个Exchange到一个Queue也可以声明多个Binding。

消息功能

下面介绍RabbitMQ官方所提供的的开源原生功能,我们知道,AMQP协议可以看做成一种可编程式的消息队列协议,可以基于其提供的基础模型,通过自己的巧妙搭配组合,构造出多种多样的业务模型。

消息结构

每个消息分为三个部分,在网络层面即三个独立数据帧:

  • PublishInfo: 消息路由声明信息,可以联想成写电子邮件时填写的目标邮箱、是否接收回执等前置声明。
  • HeaderBody: 消息头部,用于存储RabbitMQ自身事先定义的声明,可以联想层HTTP协议的Header一样,此处可以放置一些对业务透明的上下文信息用于提供某种功能,比如分布式链路追踪的TraceId。
  • ContentBody: 消息体,无差别二进制数据块,服务端不感知其是否压缩、是否加密等,只进行透明的存储和读取投递。

work queue 工作队列

  • 它是一种模型简化,发送消息时指定Exchange为空,RoutingKey为QueueName,Broker以后会直接把这个消息发送至目标Queue,这样对用户来说相当于没Exchange,他认为是直接用Queue来消费,就比较简单。
  • 工作队列只适用于单订阅的场景,因为Queue只适用于单订阅。

官方讲解:https://www.rabbitmq.com/tutorials/tutorial-two-python.html

Publish/Subscribe 发布订阅模式

Queue不支持多订阅,通过转换思路实现:

  • 一个Fanout类型的Exchange:相当于多订阅场景的Topic。
  • 多个不同的Queue:绑定到该Exchange,相当于多订阅场景下的Subscription。
  • 多个Consumer消费同一个Queue:常规场景多订阅。
  • 每个Consumer各自消费一个Queue:实例级别广播。

官方讲解:

https://www.rabbitmq.com/tutorials/tutorial-three-python.html

Routing 路由模式

  • 路由模式是用Rabbit最常用的一种模式。
  • Producer发布了一个Exchange,这个Exchange的类型是Direct,在Message中指定RoutingKey,并设置一个非空的值,接下来声明一些Queue,这些 Queue在声明和绑定Exchange的时候,需要指定Binding,消息在路由的时候判断消息里的RoutingKey和BindingKey是不是equal,如果是对等的就可以路由过来。
  • 类似tag过滤的消息分发场景。

官方讲解:https://www.rabbitmq.com/tutorials/tutorial-four-python.html

Topic 通配符模式

  • 路由模式的升级版,支持通配符匹配。
  • Exchange类型为Topic。
  • 匹配规则不是正则表达式,是AMQP自己的语法。

官方讲解:https://www.rabbitmq.com/tutorials/tutorial-five-python.html

Header模式

  • 不常用,匹配规则不基于RoutingKey,而是基于 HeaderBody.Properties.Headers中的键值对。
  • 支持完全匹配所有键值对。
  • 支持只匹配一个键值对。

RPC模式

  • RPC模式并不常用,基于回复队列。
  • 生产者和消费者采用一问一答的模式。
  • 等价于RPC的Request-Response模型。

官方讲解:https://www.rabbitmq.com/tutorials/tutorial-six-python.html

消费模型

消费模型也是使用一个消息系统所需要特别关心的一环,在业务的使用过程中,更多地会关注一条消息从生产到投递至消费者整个过程中都经历了什么,整个消息的声明周期是如何闭环的?

下面主要从TDMQ RabbitMQ版的实现来剖析RabbitMQ协议的消息生命周期。

从消息的生命周期看待消费模型

  • 已投递未Ack:Consumer独占,直到Consumer触发Ack或者Consumer断开。
  • Ack消息:标记已消费,位点前进。
  • Nack消息:底层操作等价于Ack,会根据配置转发到死信Exchange,否则丢弃。
  • Requeue:消息放回队头,待下次投递。

从内部核心组件看消费模型

  • Queue:负责存储原始消息数据,按序存储。
  • RedeliveryTracker:负责记录Consumer端Requeue的消息,并触发重新投递,标识投递次数。
  • Dispatcher:负责管理连接Queue的所有Consumer,负责消息的负载均衡、分发、进度管理等。
  • Limiter:QoS限流器,基于Unack数限流,而不是QPS,呼应上方消息生命周期。
  • Unack Tracker:跟踪当前Channel中已投递未Ack的消息。

从这张图可以获取那些信息?

  • 一个Queue可以被不同Connection连接、被同一个Connection的不同channel连接。
  • 一个Channel中可以启动两个Consumer连接同一个Queue。
  • QoS限流作用域为Channel,即一个Channel中创建的多个Consumer享有相同的配额。
  • 如果BasicQoS Global设置为true,那么同一个Channel中的Consumer用尽配额,该Channel下的所有Consumer全部阻塞,无法接收新消息。
  • Unack追踪器也是Channel作用域,故一个Channel关闭,被该Channel独占的所有未Ack消息全部回收到Queue级别的跟踪器,进行全局重投递。

Basic指令集: https://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.qos

Consumer Prefetch:

https://www.rabbitmq.com/consumer-prefetch.html

金融级用法

  • 消息确认:发送反馈,给予Producer发送成功的确认。
  • 备选Exchange:发送成功的消息无法匹配任何binding的场景。
  • 消息回退:消息无法匹配任何Binding时退回到Producer。
  • 重投递:网络错误、Consumer端宕机、业务处理偶发错误等场景,重试消费恢复。
  • 死信Exchange:业务多次重试、长时间无法成功,放入死信,待人工处理或者下一步的自动化修正or告警系统。

功能点对比

经过上述说明,你应该能利用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框架。

暂未支持,待定

参考

  • RabbitMQ协议官方文档:

https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf

  • RabbitMQ官方功能介绍:

https://www.rabbitmq.com/admin-guide.html

  • RabbitMQ协议指令集:

https://www.rabbitmq.com/amqp-0-9-1-reference.html

  • RabbitMQ官方教程:

https://www.rabbitmq.com/getstarted.html

  • RabbitMQ官方Demo:

https://github.com/rabbitmq/rabbitmq-tutorials

后记

通过这篇文章,希望能对RabbitMQ进行一定程度的科普,也从一个从0到1设计一个RabbitMQ Broker的开发的角度,浅析了一些RabbitMQ的一些消费模型细节,补充点当前网络上对这部分细节的缺漏,希望可以起到一些启发作用。

后续,我们将会着重分享,如何在apache pulsar生态上构建出一套完全对齐RabbitMQ协议的高性能、高可用、云原生消息队列,相比原生RabbitMQ,我们有何优势,以及我们在过程中遇到的问题,产生的思考。

敬请期待~

扫描下方二维码关注本公众号,

了解更多微服务、消息队列的相关信息!

解锁超多鹅厂周边!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云中间件 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
精选RabbitMQ面试题[45题]
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
一行Java
2022/04/07
1.7K0
精选RabbitMQ面试题[45题]
程序员必须掌握的消息中间件-RabbitMQ
RabbitMQ 是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用中间共享数据,RabbitMQ 是使用 Erlang 语言来编写的,并且 RabbitMQ 是基于 AMQP 协议的。
架构狂人
2023/08/16
3720
程序员必须掌握的消息中间件-RabbitMQ
必知必会 RabbitMQ面试题 33道(附答案)
今天我们来分享RabbitMQ消息队列。 其中,MQ(Message Queue)翻译过来就是消息队列的意思。RabbitMQ作为消息队列中的优秀平台且开源,被很多公司使用。RabbitMQ服务器是用Erlang语言编写的,基于AMQP,本篇给大家总结了29道RabbitMQ知识点或者说面试题,可以收藏一波了,持续更新中...
田维常
2021/04/22
29.8K0
必知必会 RabbitMQ面试题 33道(附答案)
RabbitMQ与AMQP协议
AMQP(Advanced Message Queuing Protocol, 高级消息队列协议)是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。 RabbitMQ是一个实现了AMQP协议标准的开源消息代理和队列服务器。 1、基本概念 在服务器中,三个主要功能模块连接成一个处理链完成预期的功能: 1)“exchange”接收发布应用程序发送的消息,并根
用户1225216
2018/03/05
1.7K0
RabbitMQ与AMQP协议
消息队列-RabbitMQ
交换机有四种类型:direct exchange、topic exchange、fanout exchange、headers exchange。
lpe234
2021/03/04
1.7K0
RabbitMQ 高频考点
比如有一个订单系统,还要一个库存系统,用户下订单后要调用库存系统来处理,直接调用话,库存系统出现问题咋办呢?
sowhat1412
2022/09/20
7530
RabbitMQ 高频考点
消息队列探秘-RabbitMQ消息队列介绍
RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等联合制定了 AMQP 的公开标准。
高广超
2018/12/12
3.6K0
快速入门RabbitMQ并且加入项目实战
📣 📣 📣 📢📢📢 ☀️☀️你好啊!小伙伴,我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 📒 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️,擅长使用Java技术开发web项目和工具 📒 文章内容丰富:覆盖大部分java必学技术栈,前端,计算机基础,容器等方面的文章 📒 如果你也对Java感兴趣,关注小冷吧,一起探索Java技术的生态与进步,一起讨论Java技术的使用与学习 ✏️高质量技术专栏专栏链接: 微服务,数据结构,netty,单点登录,SSM ,SpringCloud
冷环渊
2022/11/12
1.2K0
快速入门RabbitMQ并且加入项目实战
rabbitmq常见面试题「建议收藏」
1.解耦,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!
全栈程序员站长
2022/09/09
1.5K0
rabbitmq常见面试题「建议收藏」
程序员的20大RabbitMQ面试问题及答案
RabbitMQ 是一款开源的,Erlang 编写的,基于 AMQP 协议的,消息中间件;
鱼找水需要时间
2023/12/25
1.1K0
消息中间件Rabbit Mq的了解与使用
MQ(消息队列)作为现代比较流行的技术,在互联网应用平台中作为中间件,主要解决了应用解耦、异步通信、流量削锋、服务总线等问题,为实现高并发、高可用、高伸缩的企业应用提供了条件。
sucl
2019/08/07
8380
消息中间件Rabbit Mq的了解与使用
Rabbit MQ基本概念介绍
RabbitMQ是一个消息中间件,是一个很好用的消息队列框架,这里有几个关键的名词:
烂猪皮
2018/10/18
9210
Rabbit MQ基本概念介绍
在 Windows 上安装Rabbit MQ 指南
rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。他遵循Mozilla Public License开源协议。采用 Erlang 实现的工业级的消息队列(MQ)服务器。      RabbitMQ的官方站:http://www.rabbitmq.com/        AMQP(高级消息队列协议) 是一个异步消息传递所使用的应用层协议规范,作为线路层协议,而不是API(例如JMS),AMQP 客户端能够无视消息的来源任意发送和接受信息。AMQP的原始用途只是为金融界提供一个可以彼
张善友
2018/01/26
2.4K0
MQ选型之RabbitMQ
MQ 是什么?队列是什么,MQ 我们可以理解为消息队列(message queue),队列我们可以理解为管道。以管道的方式做消息传递。        
sunsky
2020/08/20
6760
rabbit mq使用_rabbitmq部署
原文转载:http://blog.csdn.net/whycold/article/details/41119807
全栈程序员站长
2022/11/09
4020
rabbit mq使用_rabbitmq部署
RabbitMQ消息队列入门及解决常见问题
两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发送邮件可以同时与多个人收发邮件,但是往往响应会有延迟。
不吃紫菜
2023/02/13
2.2K0
RabbitMQ消息队列入门及解决常见问题
rabbitmq基本原理_计算尺使用的是什么原理
RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现;在RabbitMQ官网上主要有这样的模块信息, Work queues消息队列,Publish/Subscribe发布订阅服务,Routing, Topics, RPC等主要应用的模块功能. 几个概念说明: Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输, Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。 Queue:消息的载体,每个消息都会被投到一个或多个队列。 Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来. Routing Key:路由关键字,exchange根据这个关键字进行消息投递。 vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离。 Producer:消息生产者,就是投递消息的程序. Consumer:消息消费者,就是接受消息的程序. **Channel:**消息通道,在客户端的每个连接里,可建立多个channel.
全栈程序员站长
2022/11/09
3450
rabbitmq基本原理_计算尺使用的是什么原理
RabbitMQ快速入门
最近一段项目实践中大量使用了基于RabbitMQ的消息中间件,也积累的一些经验和思考,特此成文,望大家不吝赐教。 本文包括RabbitMQ基本概念、进阶概念、实践与思考等三部分,着重强调相关概念和基于RabbitMQ进行扩展开发的思路,并简要展示RabbitMQ客户端的编码,接下来通过一个思维导图来展示整体思路,红星表示重点部分。
用户1216676
2018/12/26
4.6K0
《RabbitMQ这一篇就够了》
RabbitMQ转载原文【推荐】:https://www.jianshu.com/p/78847c203b76
2020/11/24
8290
RabbitMQ如何保证消息的可靠投递?
github地址: https://github.com/erlieStar/rabbitmq-examples
Java识堂
2020/10/23
6170
相关推荐
精选RabbitMQ面试题[45题]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档