RocketMQ-架构与设计

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开发者指南

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.21C语言学习

Floyd算法原理 Floyd算法是一个经典的动态规划算法,它又被称为插点法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特弗洛伊德命名。Floyd算法是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,算法目标是寻找…

工厂方法模式Factory Method

1.模式定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类 2.使用场景 1.当你不知道改使用对象的确切类型的时候 2.当你希望为库或框架提供扩展其内部组件的方法时 主要优点: 1.将具体产品和创建…

解决NPE的三种方式

解决NPE的三种方式 NullPointerException(空指针异常,NPE)是Java编程中常见的错误。解决NPE的方法可以从以下三个方面考虑: 明确处理空引用情况: 在某些情况下,无法避免使用可能为空的引用对象。此时&…

【漏洞复现】H3C SecParh堡垒机任意用户登录漏洞

Nx01 产品简介 H3C SecParh堡垒机是一款专业用于安全管理的堡垒机产品,它通过强大的访问控制功能和安全审计功能,实现对网络服务器的远程安全管理和监控。 Nx02 漏洞描述 H3C SecParh堡垒机的get_detail_view.php中存在任意用户登录漏洞。攻击者可以构建…

计算机体系架构初步入门

🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础教程 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就是极致重复! 目录 1 计算机五大…

备战蓝桥杯---动态规划(应用2(一些十分巧妙的优化dp的手段))

好久不见,甚是想念,最近一直在看过河这道题(感觉最近脑子有点宕机QAQ),现在算是有点懂了,打算记录下这道又爱又恨的题。(如有错误欢迎大佬帮忙指出) 话不多说,直接看题&…

2024三掌柜赠书活动第十一期:精通区块链开发技术(第2版)

目录 前言关于区块链开发技术关于《精通区块链开发技术(第2版)》编辑推荐内容简介作者简介图书目录书中前言/序言《精通区块链开发技术(第2版)》全书速览结束语 前言 作为开发者经常在技术圈活动,会接触各种前沿技术,比如区块链技术的崛起引发了全球范…

MySQL初识——安装配置

文章目录 1. MySQL卸载2. 获取MySQL官方yum源安装包3. 安装4. 启动MySQL5. 登录6. 配置配置文件 Tips: 本章是Centos 7安装配置myql,配置操作用的是root权限 1. MySQL卸载 首先我们先查看一下系统中是否有mysql服务 ps axj | grep mysql如果有&#xf…

部署安装有道QanyThing

前提条件: 1、win10系统更新到最新的版本,系统版本最好为专业版本 winver 查看系统版本,内部版本要大于19045 2、CPU开启虚拟化 3、开启虚拟化功能,1、2、3每步完成后均需要重启电脑; 注:windows 虚拟…

关于 AC 自动机

什么是 AC 自动机 AC 自动机,全称 Aho-Corasick 自动机,是一种用于字符串搜索的算法,由 Alfred V. Aho 和 Margaret J. Corasick 在 1975 年提出。这个算法是为了解决在一个主文本字符串中查找多个模式字符串(或称为“关键词”&a…

IOT-Reaserch安装ghidra以及IDEA和ghidra的配置

Linux research 5.4.0-91-generic #102~18.04.1-Ubuntu SMP Thu Nov 11 14:46:36 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux java --version IOT自带的java是符合要求的,不需要额外下载 iotresearch:~/install-file$ java --version openjdk 11.0.13 2021-10-19 …

linux platform架构下I2C接口驱动开发

目录 概述 1 认识I2C协议 1.1 初识I2C 1.2 I2C物理层 1.3 I2C协议分析 1.3.1 Start、Stop、ACK 信号 1.3.2 I2C协议的操作流程 1.3.3 操作I2C注意的问题 2 linux platform驱动开发 2.1 更新设备树 2.1.1 添加驱动节点 2.1.2 编译.dts 2.1.3 更新板卡中的.dtb 2.2 …

观察者模式, 发布-订阅模式, 监听器模式

观察者模式, 发布-订阅模式, 监听器模式 观察者模式 观察者模式是一种行为型设计模式, 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 角色模型和结构图 在观察者模式中,只有两种…

⭐北邮复试刷题LCR 018. 验证回文串__双指针 (力扣119经典题变种挑战)

LCR 018. 验证回文串 给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。 本题中,将空字符串定义为有效的 回文串 。 示例 1: 输入: s “A man, a plan, a canal: Panama” 输出: true 解释…

【PX4SimulinkGazebo联合仿真】在Simulink中使用ROS2控制无人机沿自定义圆形轨迹飞行并在Gazebo中可视化

在Simulink中使用ROS2控制无人机沿自定义圆形轨迹飞行并在Gazebo中可视化 系统架构Matlab官方例程Control a Simulated UAV Using ROS 2 and PX4 Bridge运行所需的环境配置PX4&Simulink&Gazebo联合仿真实现方法建立Simulink模型并完成基本配置整体框架各子系统实现原理…

【Vuforia+Unity】AR05-实物3D模型识别功能实现

对于3D物体的识别,可以是虚拟的也可以是实物的,但是对于虚拟的三维模型意义不大,我们完全可以把三维模型放在屏幕上截一张图,以图片识别的方式召唤数字内容,不过在虚拟现实中或许有用。 因此本文探讨的技术路线主要是…

Docker之查看并获取最新Ubuntu镜像(十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

【快速搞定Webpack5】修改输出文件目录及自动清理上次打包文件(五)

介绍 默认情况下webpack打包后,我们的图片和js等文件都会被打包到dist目录下,文件多了混淆在一起一方面不利于文件的查找和管理,另外一方面看上去也不美观。 所以今天我们学习的内容就是控制输出后的文件进入不同的目录。 一、配置 新增4…

Nginx配置组成与性能调优

目录 一、Nginx配置介绍 1. 模块组成 2. 图示 3. 相关框架 二. 配置调优 1. 全局配置 1.1 关闭版本和修改版本 1.2 修改启动的进程数 1.3 cpu与work进程绑定 1.4 pid路径 1.5 nginx进程的优先级(work进程的优先级) 1.6 调试work进程打开的文…

npm run dev和npm run serve两个命令的区别

npm run dev和npm run serve两个命令的区别 前端开发过程中运行Vue项目的时候,有时候使用npm run serve命令可以启动项目,有时候却会报错;有时候使用npm run dev命令可以启动项目,有时候却也会报错。是什么原因造成这种情况呢&am…