深入拆解消息队列 47 讲
许文强
前腾讯云 Kafka 技术负责人
5385 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
深入拆解消息队列 47 讲
15
15
1.0x
00:00/00:00
登录|注册

10|从基础功能拆解RabbitMQ的架构设计与实现

你好,我是文强。
在基础篇开篇的时候,我们说过最基础的消息队列应该具备通信协议网络模块存储模块生产者消费者五个模块。在之前的课程中,我们详细分析了这五个模块的选型、设计和实现思路,接下来我们从消息和流的角度,用四节课的篇幅分别讲一下消息方向的消息队列 RabbitMQ、RocketMQ,流方向的消息队列 Kafka、Pulsar,在这五个模块的实现思路和设计思想。这节课我们先讲 RabbitMQ。

RabbitMQ 系统架构

在正式讲解之前,我们先来看一下 RabbitMQ 的系统架构。
如上图所示,RabbitMQ 由 Producer、Broker、Consumer 三个大模块组成。生产者将数据发送到 Broker,Broker 接收到数据后,将数据存储到对应的 Queue 里面,消费者从不同的 Queue 消费数据。
那么除了 Producer、Broker、Queue、Consumer、ACK 这几个消息队列的基本概念外,它还有 Exchange、Bind、Route 这几个独有的概念。下面我来简单解释下。
Exchange 称为交换器,它是一个逻辑上的概念,用来做分发,本身不存储数据。流程上生产者先将消息发送到 Exchange,而不是发送到数据的实际存储单元 Queue 里面。然后 Exchange 会根据一定的规则将数据分发到实际的 Queue 里面存储。这个分发过程就是 Route(路由),设置路由规则的过程就是 Bind(绑定)。即 Exchange 会接收客户端发送过来的 route_key,然后根据不同的路由规则,将数据发送到不同的 Queue 里面。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

RabbitMQ是一个基于消息队列的架构设计与实现的重要工具。文章详细介绍了RabbitMQ的系统架构,包括Producer、Broker、Consumer三个大模块,以及Exchange、Bind、Route等独特概念。强调了RabbitMQ基于TCP协议通信,遵循AMQP规范,并使用Mnesia进行元数据存储,以及消息数据存储的细节。此外,还介绍了RabbitMQ的网络模块设计简单,基于IO复用、异步I/O的思路,以及消息数据的存储结构和过期时间(TTL)机制。文章还提到了RabbitMQ对HTTP协议的支持和管控操作,通过开启Management插件实现HTTP接口的生产、消费、集群的配置、资源的创建、删除等操作。总结RabbitMQ的七个方面,包括协议层基于AMQP标准开发、网络层核心数据流基于TCP协议通信、存储层基于多个Queue数据统一到一个文件存储的思路设计等。最后,提出了思考题,要求完整描述RabbitMQ从生产到消费的全过程。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解消息队列 47 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • aoe
    老师在文中用「邮局」举例非常好! 才发现「邮局」这个模式应用及其广泛:小到个人网购,大到国之重器「东风快递」 联想到「漂流瓶」可能是「邮局」的前身

    作者回复: 谢谢~

    2023-07-16归属地:浙江
    1
  • cykuo
    channel为何可以降低实际TCP的数量?

    作者回复: 你好,可以看一下文中的图,RabbitMQ中channel是一个逻辑概念,一条TCP里面可以创建很多个channel。 此时,本来需要建立多个TCP连接进行通信的场景,只需要创建一个TCP连接,在TCP连接里面创建多条channel进行通信就可以了。可以简单理解,channel就是虚拟的TCP连接,而通信都是在这些虚拟的TCP连接(Channel)里面通信的。

    2023-07-12归属地:北京
    4
  • 奔腾ing
    请问老师,针对Mnesia数据损坏的问题,有修复的方法吗?我们项目上经常遇到因服务器断电导致的rmq(目前是3.8.19版本,单机部署)启动不了的情况。目前处理方案都是备份然后删除Mnesia。研究了下rmq官方的文档以及git上issue上问题,没看到明确的修复方案,目前倾向于升级到3.11.20版本,来看看有没有解决此问题。
    2023-08-11归属地:浙江
    1
    2
  • TKF
    老师,既然rabbitmq的数据存储是顺序写到一个文件中的,那发送到queue的意义是不是仅仅构建一下相应的索引?
    2023-08-16归属地:上海
  • 贝氏倭狐猴
    老师,有个问题:“在 AMQP 协议中,是没有定义 Topic 和消费分组的概念的,所以在消费端没有消费分区分配、消费分组 Rebalance 等操作,消费者是直接消费 Queue 数据的。”那消费模式是类似pulsar的shared么?
    2023-07-12归属地:江苏
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部