RocketMQ-架构与设计

news2024/10/5 19:12:31

RocketMQ架构与设计

  • 一、简介
  • 二、框架概述
    • 1.设计特点
  • 三、架构图
    • 1.Producer
    • 2.Consumer
    • 3.NameServer
    • 4.BrokerServer
  • 四、基本特性
    • 1.消息顺序性
      • 1.1 全局顺序
      • 1.2 分区顺序
    • 2.消息回溯
    • 3.消息重投
    • 4.消息重试
    • 5.延迟队列(定时消息)
    • 6.重试队列
    • 7.死信队列
    • 8.消息语义
    • 9.事务消息
    • 10.消息过滤
    • 11.流量控制
  • 五、设计原理
    • 1.消息重试
    • 2.延迟队列(定时消息)
    • 3.事务消息
    • 4.消费订阅模式
      • 4.1 广播模式
      • 4.2 集群模式
  • 总结
  • 参考链接


一、简介

RocketMQ是阿里巴巴开发的纯Java的分布式、队列模型的开源消息中间件,其架构简单、业务场景丰富,支持分布式事务、是一款金融级别可靠业务消息中间件。

二、框架概述

1.设计特点

  • 架构简单、不依赖外部组件
  • 支持事务消息
  • 支持特定固定间隔的延迟队列
  • 支持上千消息主题

三、架构图

Apache RocketMQ部署架构图如下:
在这里插入图片描述

1.Producer

消息发布者向Broker集群进行消息投递,支持分布式集群方式部署。

2.Consumer

消息消费者从Broker集群进行消息消费;支持push和pull两种模式对消息消费;支持集群和广播方式进行消费。

3.NameServer

消息主题管理中心,支持Broker的动态注册和发现;支持集群部署,但各个实例间互相不进行通信;每个实例保存完整的Broker路由信息;

4.BrokerServer

负责消息的存储、投递和查询;支持集群部署;Broker采用主从部署,一个Master对应一个Slave,采用同步复制或者异步复制;管理客户端和维护Consumer的Topic订阅信息;

四、基本特性

1.消息顺序性

1.1 全局顺序

指定Topic只使用一个队列,单个生产者和单个消费者。性能要求不高。

1.2 分区顺序

指定Topic根据sharding key进行分区,可以保证分区内数据顺序性。性能比较高。

2.消息回溯

支持按照时间回溯消息,时间维度精确到毫秒

3.消息重投

消息投递失败,会进行重新投递

4.消息重试

消费失败之后,会利用延迟队列进行重试,令消息再消费一次。

5.延迟队列(定时消息)

RocketMQ支持固定延迟时间的延迟队列,总共18个延迟等级。延迟消息先保存到Broker的SCHEDULE_TOPIC_XXXX中,等到了特定时间会投递到真正的Topic中。

6.重试队列

重试队列是指一个与原消息队列相关的一个队列,此队列用于存放消费失败的消息。

7.死信队列

重试次数达到一定次数后,会将消息投递此队列。

8.消息语义

RocketMQ支持At least Once(至少一次),消息至少被写入一次。producer保存发送失败消息再次发送,服务端不保证消息去重。

9.事务消息

事务消息是指应用本地事务和发送消息操作定义到全局事务中,要么同时成功,要没同时失败。RocketMQ事务消息提供了分布事务能力,通过事务消息达到分布式事务的最终一致性。

10.消息过滤

支持根据Tag或者自定义属性对消息进行过滤。过滤功能由Broker端实现,减少无用消息到达Consumer端。

11.流量控制

如果broker处理能力达到瓶颈会对生产者消息投递进行限流处理;如果消费能力达到瓶颈会对消费者拉取频率进行限流处理。

五、设计原理

1.消息重试

RocketMQ会为每个消费组创建重试队列和死信队列;其中重试队列名称格式为RETRY+consumerGroup,死信队列名称格式为DLQ+consumerGroup

  • 重试投递延迟随着次数逐步增大,与延迟队列支持的延迟时间等级一致
  • Broker先将重试消息保存到延迟队列中,然后在对应Delay时候后重新投递到重试队列中
  • 如果超过最大重试次数,则会保存到死信队列中

2.延迟队列(定时消息)

Broker中有一系列名为SCHEDULE_TOPIC_XXXX的延迟消息暂存队列,共有18个延迟消费队列,每个消费队列中的消息延迟时间一致。整体流程如下:

  • 延迟消息到达Broker后,会将消息的topic和queueId改写,然后写入commitlog
  • ReputMessageServie线程异步将CommitLog中消息按照延迟的时间保存到对应的延迟消息暂存队列
  • 每个队列有单独的ScheduleMessageService定时投递任务,拉取消息判断是否到期,然后将消息topic和queueId恢复,写入commitLog进行重新投递
    在这里插入图片描述

3.事务消息

Rocketmq事务消息是指Producer端发送事件和本地事务事件,同时成功或者同时失败。事务消息会被投递到RMQ_SYS_TRANS_HALF_TOPIC,提交会将消息投递到原Topic,回滚则会删除消息。
整体流程如下:

  • 3.1 生产者发送一个半消息给Broker,此时消息对消费者不可见
  • 3.2 Broker返回后,生产者执行本地事务
  • 3.3 根据本地事务执行情况,执行消息Commit或着Rollback
  • 3.4 如果broker长时间没有收到事务的提交或者回滚,会向生产者发送查询请求
  • 3.5 生产者提供接口,执行查询本地事务的执行状态
    在这里插入图片描述

4.消费订阅模式

4.1 广播模式

一个消息的消费队列被同一个消费组中的所有消费者消费;一个消费队列会把每条消息推送给消费组所有的消费者。

4.2 集群模式

一个消息的消费队列只被同一个消费组中的一个消费者消费;一个消费队列会把消息推送给消费组中的一个消费者。

  • 如果消费组中消费者数量小于消费队列数量,可以增加消费者数量来提高消费能力
  • 如果消费组中消费者数量大于消费队列数量,则多余的消费者无法消费

总结

RocketMQ是一个分布式消息队列,经过阿里巴巴大规模实际应用检验。RocketMQ除了基本的队列功能,还支持事务消息、消息过滤、流量控制等功能特性。由于将所有消息主题保存到同一个文件,所以可以支持大量消息主题,topic从几十到几百,吞吐量只有小幅度下降,所以特别适合消息队列的应用场景(topic众多,但是每个topic消息量比较小)。


参考链接

1.Apache RocketMQ
2.GitHub RocketMQ中文文档
3.Apache RocketMQ开发者指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1469134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧城市与数字孪生:共创未来城市新篇章

一、引言 随着科技的飞速发展,智慧城市与数字孪生已成为现代城市建设的核心议题。智慧城市注重利用先进的信息通信技术,提升城市治理水平,改善市民生活品质。而数字孪生则通过建立物理城市与数字模型之间的连接,为城市管理、规划…

接近于pi的程序

在一个平静的午后,两个神秘的数字悄然相遇了。它们分别是-1031158223和-328227871。这两个数字看起来普普通通,但谁知它们背后隐藏着一段令人惊叹的奇幻之旅。 这两个数字其实是π的两位探险家,它们决定通过一次除法运算来探索π的奥秘。它们…

浅谈密码学

文章目录 每日一句正能量前言什么是密码学对称加密简述加密语法Kerckhoffs原则常用的加密算法现代密码学的原则威胁模型(按强度增加的顺序) 密码学的应用领域后记 每日一句正能量 人生在世,谁也不能做到让任何人都喜欢,所以没必要…

Vue+SpringBoot打造快递管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快递区域模块2.4 快递货架模块2.5 快递档案模块 三、界面展示3.1 登录注册3.2 快递类型3.3 快递区域3.4 快递货架3.5 快递档案3.6 系统基础模块 四、免责说明 一、摘要 1.1 项目介绍 …

【Java程序设计】【C00294】基于Springboot的车辆充电桩管理系统(有论文)

基于Springboot的车辆充电桩管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的车辆充电桩管理系统 本系统前台功能模块分为:首页功能和用户后台管理 后台功能模块分为:管理员功能和…

博途PLC PID仿真(单容水箱液位高度控制含变积分变增益测试)

单容水箱和双荣水箱的微分方程和数值求解,可以参考下面文章链接: https://rxxw-control.blog.csdn.net/article/details/131139432https://rxxw-control.blog.csdn.net/article/details/131139432这篇博客我们利用欧拉求解器在PLC里完成单容水箱的数学建模。PLC也可以和MATL…

Vue模板引用之ref特殊属性

1. 使用实例 <template><input ref"input" name"我是input的name" /><br /><ul><li v-for"arr in array" :key"arr" id"111" ref"itemRefs">{{arr}}</li></ul> </…

我的NPI项目之设备系统启动(八) -- Android14的GKI2.0开发步骤和注意事项

GKI是什么&#xff1f; Google为什么要推行GKI&#xff1f; GKI全称General Kernel Image。GKI在framework和kernel之间提供了标准接口&#xff0c;使得android OS能够轻松适配/维护/兼容不同的设备和linux kernel。 Google引入GKI的目的是将Framework和Kernel进一步的解耦。因…

汇编反外挂

在软件保护领域&#xff0c;尤其是游戏保护中&#xff0c;反外挂是一个重要的议题。外挂通常指的是一种第三方软件&#xff0c;它可以修改游戏数据、操作游戏内存或提供其他作弊功能&#xff0c;从而给玩家带来不公平的优势。为了打击外挂&#xff0c;游戏开发者会采取一系列措…

【数据结构和算法初阶(C语言)】时间复杂度(衡量算法快慢的高端玩家,搭配例题详细剖析)

目录 1.算法效率 1.1如何衡量一个算法的好坏 1.2 算法的复杂度 2.主菜-时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.2.1算法的最好&#xff0c;最坏和平均的情况 3.经典时间复杂度计算举例 3.1计算冒泡排序的时间复杂度 3.2计算折半查找的时间复杂度 3.…

SQL 中如何实现多表关联查询?

阅读本文之前请参阅----MySQL 数据库安装教程详解&#xff08;linux系统和windows系统&#xff09; 在SQL中&#xff0c;多表关联查询是通过使用JOIN操作来实现的&#xff0c;它允许你从两个或多个表中根据相关列的值来检索数据。以下是几种常见的JOIN类型&#xff1a; …

C语言:指针的进阶讲解

目录 1. 二级指针 1.1 二级指针是什么&#xff1f; 1.2 二级指针的作用 2. 一维数组和二维数组的本质 3. 指针数组 4. 数组指针 5. 函数指针 6. typedef的使用 7. 函数指针数组 7.1 转移表 1. 二级指针 如果了解了一级指针&#xff0c;那二级指针也是可以很好的理解…

(每日持续更新)jdk api之ObjectStreamException基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

联想开天昭阳N4620Z笔记本如何恢复出厂麒麟操作系统(图解)

联想开天昭阳N4620Z笔记本简单参数&#xff1a; 中央处理器&#xff1a;KX-6640MA G2 内存&#xff1a;8GB 固态硬盘&#xff1a;512GB SSD 显示器&#xff1a;14.0”FHD 电池&#xff1a;4Cell 操作系统&#xff1a;麒麟KOS中文RTM&#xff08;试用版&#xff09; 此款笔…

[深度学习]yolov9+bytetrack+pyqt5实现目标追踪

【简介】 目标追踪简介 目标追踪是计算机视觉领域中的一个热门研究方向&#xff0c;它涉及到从视频序列中实时地、准确地跟踪目标对象的位置和运动轨迹。随着深度学习技术的快速发展&#xff0c;基于深度学习的目标追踪方法逐渐展现出强大的性能。其中&#xff0c;YOLOv9&…

深入浅出:探究过完备字典矩阵

在数学和信号处理的世界里&#xff0c;我们总是在寻找表达数据的最佳方式。在这篇博文中&#xff0c;我们将探讨一种特殊的矩阵——过完备字典矩阵&#xff0c;这是线性代数和信号处理中一个非常有趣且实用的概念。 什么是过完备字典矩阵&#xff1f; 首先&#xff0c;我们先…

Github 2024-02-24 开源项目日报Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-24统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目5TypeScript项目2C项目1Rust项目1JavaScript项目1HTML项目1Jupyter Notebook项目1 Python - 100天…

【黑马程序员】2、TypeScript介绍_黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程

课程地址&#xff1a;【黑马程序员前端TypeScript教程&#xff0c;TypeScript零基础入门到实战全套教程】 https://www.bilibili.com/video/BV14Z4y1u7pi/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 2、TypeScript初体验 2.1 安装编译TS的工…

C# WPF 桌面应用程序使用 SQlite 数据库

我们在开发 WPF 桌面应用程序时&#xff0c;数据库存的使用是必不可少的&#xff0c;除非你的应用没有数据存储的需求&#xff0c;有了数据存储需求&#xff0c;我们就会面临使用什么样的数据库的选择问题&#xff0c;我的选择方案是&#xff0c;单机版的应用我优先选择 Sqlite…

Spring篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、Spring IoC 的实现机制。二、什么是 spring bean?三、spring 提供了哪些配置方式?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享…