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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经网络系列---感知机(Neuron)

文章目录 感知机(Neuron)感知机(Neuron)的决策函数可以表示为:感知机(Neuron)的学习算法主要包括以下步骤:感知机可以实现逻辑运算中的AND、OR、NOT和异或(XOR)运算。 感知机(Neuron) 感知机(Neuron)是一种简单而有效的二分类算法,用于将输入…

jmeter下载base64加密版pdf文件

一、何为base64加密版pdf文件 如下图所示,接口jmeter执行后,返回一串包含大小写英文字母、数字、、/、的长字符串,直接另存为pdf文件后,文件有大小,但是打不开;另存为doc文件后,打开可以看到和…

Puppeteer 使用实战:如何将自己的 CSDN 专栏文章导出并用于 Hexo 博客(二)

文章目录 上一篇效果演示Puppeteer 修改浏览器的默认下载位置控制并发数错误重试并发控制 错误重试源码 上一篇 Puppeteer 使用实战:如何将自己的 CSDN 专栏文章导出并用于 Hexo 博客(一) 效果演示 上一篇实现了一些基本功能,…

Maxwell安装部署

1 Maxwell输出格式 database:变更数据所属的数据库table:变更数据所属的表type:数据变更类型ts:数据变更发生的时间xid:事务idcommit:事务提交标志,可用于重新组装事务data:对于inse…

uni-app nvue vue3 setup中实现加载webview,解决nvue中获取不到webview实例的问题

注意下面的方法只能在app端使用, let wv plus.webview.create("","custom-webview",{plusrequire:"none", uni-app: none, width: 300,height:400,top:uni.getSystemInfoSync().statusBarHeight44 }) wv.loadURL("https://ww…

浅析Linux设备驱动:DMA内存映射

文章目录 概述DMA与Cache一致性DMA映射类型一致性DMA映射dma_alloc_coherent 流式DMA映射dma_map_single数据同步操作dma_direct_sync_single_for_cpudma_direct_sync_single_for_device 相关参考 概述 现代计算机系统中,CPU访问内存需要经过Cache,但外…

第6.4章:StarRocks查询加速——Colocation Join

目录 一、StarRocks数据划分 1.1 分区 1.2 分桶 二、Colocation Join实现原理 2.1 Colocate Join概述 2.2 Colocate Join实现原理 三、应用案例 注:本篇文章阐述的是StarRocks-3.2版本的Colocation Join 官网文章地址: Colocate Join | StarRoc…

32单片机基础:GPIO输出

目录 简介: GPIO输出的八种模式 STM32的GPIO工作方式 GPIO支持4种输入模式: GPIO支持4种输出模式: 浮空输入模式 上拉输入模式 下拉输入模式 模拟输入模式: 开漏输出模式:(PMOS无效,就…

【笔记】【开发方案】APN 配置参数 bitmask 数据转换(Android KaiOS)

一、参数说明 &#xff08;一&#xff09;APN配置结构对比 平台AndroidKaiOS文件类型xmljson结构每个<apn>标签是一条APN&#xff0c;包含完成的信息层级数组结构&#xff0c;使用JSON格式的数据。最外层是mcc&#xff0c;其次mnc&#xff0c;最后APN用数组形式配置&am…

(done) 什么是正定矩阵?Positive Definite Matrices

正定矩阵的定义&#xff1a;https://baike.baidu.com/item/%E6%AD%A3%E5%AE%9A%E7%9F%A9%E9%98%B5/11030459 正定矩阵的作用、验证视频&#xff1a;https://www.bilibili.com/video/BV1Ag411M76G/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c…

UE4 C++联网RPC教程笔记(三)(第8~9集)完结

UE4 C联网RPC教程笔记&#xff08;三&#xff09;&#xff08;第8~9集&#xff09;完结 8. exe 后缀实现监听服务器9. C 实现监听服务器 8. exe 后缀实现监听服务器 前面我们通过蓝图节点实现了局域网连接的功能&#xff0c;实际上我们还可以给项目打包后生成的 .exe 文件创建…

【力扣hot100】刷题笔记Day10

前言 一鼓作气把链表给刷完&#xff01;&#xff01;中等题困难题冲冲冲啊啊啊&#xff01; 25. K 个一组翻转链表 - 力扣&#xff08;LeetCode&#xff09; 模拟 class Solution:def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:# 翻转…

C语言中的字体背景颜色汇总

客官请看效果 客官请看代码 #include <stdio.h> #include <stdlib.h> #include <windows.h>int main() {int i;for (i 0; i < 254; i) {SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), i); // 设置当前文本颜色为循环变量对应的颜色printf(…

如何使用移动端设备在公网环境远程访问本地黑群晖

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

LabVIEW燃料电池船舶电力推进监控系统

LabVIEW燃料电池船舶电力推进监控系统 随着全球经济一体化的推进&#xff0c;航运业的发展显得尤为重要&#xff0c;大约80%的世界贸易依靠海上运输实现。传统的船舶推进系统主要依赖于柴油机&#xff0c;这不仅耗能高&#xff0c;而且排放严重&#xff0c;对资源和环境的影响…

128 Linux 系统编程6 ,C++程序在linux 上的调试,GDB调试

今天来整理 GDB 调试。 在windows 上我们使用vs2017开发&#xff0c;可以手动的加断点&#xff0c;debug。 那么在linux上怎么加断点&#xff0c;debug呢&#xff1f;这就是今天要整理的GDB调试工具了。 那么有些同学可能会想到&#xff1a;我们在windows上开发&#xff0c;…

《高质量的C/C++编程规范》学习

目录 一、编程规范基础知识 1、头文件 2、程序的板式风格 3、命名规则 二、表达式和基本语句 1、运算符的优先级 2、复合表达式 3、if语句 4、循环语句的效率 5、for循环语句 6、switch语句 三、常量 1、#define和const比较 2、常量定义规则 四、函数设计 1、参…

python input 输入

input()函数包含四个方面&#xff1a;input()函数的使用/结果的赋值/数据类型/结果的强制转换。是实现人机互动沟通的关键&#xff0c;需要在终端出输入信息。我们可以把input()函数当作一扇链接现实世界与代码世界的门&#xff0c; 如下图 先看一个例子&#xff1a;  运行后终…

Spring Framework

Spring Framework Spring 是一款开源的轻量级 Java 开发框架&#xff0c;旨在提高开发人员的开发效率以及系统的可维护性。 Spring 框架指的都是 Spring Framework&#xff0c;它是很多模块的集合&#xff0c;如下图所示&#xff1a; 一、Core Container Spring 框架的核心模…

【算法 - 动态规划】最长回文子序列

上篇文章中&#xff0c;我们学习一个新的模型&#xff1a; 样本对应模型&#xff0c;该模型的套路就是&#xff1a;以结尾位置为出发点&#xff0c;思考两个样本的结尾都会产生哪些可能性 。 而前篇文章中的 纸牌博弈问题 属于 [L , R]上范围尝试模型。该模型给定一个范围&…