【RocketMq系列-02】RocketMq的架构解析和高性能设计

news2024/7/30 10:52:33

RocketMq系列整体栏目


内容链接地址
【一】RocketMq安装和基本概念https://zhenghuisheng.blog.csdn.net/article/details/134486709
【二】RocketMq的架构解析和高性能设计/font>https://zhenghuisheng.blog.csdn.net/article/details/134559514

RocketMq的架构解析和高性能设计

  • 一,RocketMq的架构解析和高性能设计
    • 2,rocketmq底层原理
      • 2.1,事务的底层实现
      • 2.2,如何保证消息不丢失
      • 2.3,rocketmq积压问题
      • 2.4,如何保证顺序消费
      • 2.5,rocketmq的持久化
      • 2.6,死信队列
      • 2.7,消息的幂等性
    • 3,rocketmq高性能的设计
      • 3.1,零拷贝技术
      • 3.2,顺序写技术
      • 3.3,刷盘机制

一,RocketMq的架构解析和高性能设计

在rocketMq中,其整体架构如下,在RocketMqServer中,主要有NameServer,Broker,MessageQueue,Message等组件,并且存在Topic这种逻辑组件,表示一种主题

在这里插入图片描述

NameServer是topic的注册中心,NameServer会和topic建立长连接,将broker的信息通过topic注册到NameServer中,然后生产者和消费者都会先通过这个NameServer获取相关信息,再和对应的broker建立长连接。

在微服务中,有Nacos,zookeeper等作为注册中心:

但是zk很明显不适合作为这种高可用的注册的这中心,因为内部可能会因为选举出现脑裂问题,并且因为这个问题可能会导致整个服务出现一定时间的不可用的问题,而rocketmq主要就是高吞吐量,低延迟的特性,因此不可能去选择zk作为注册中心的;

而nacos和eureka也不适合作为rocketmq的注册中心,如nacos中会记录很多信息,如心跳信息,端口,host等信息,而Nameserver中只需要记录这个Broker的信息,如果使用nacos来做的话,有点大材小用了。并且如果引用nacos,还要考虑版本冲突这些,做一些适配器等,相对来说是更加复杂的

在topic中的Consumer配置中,每个topic都会对应一个或者多个消费者组,topic主题和消费者组是多对多的关系,一个consumer消费者组,代表的是一组逻辑相同的消费者,一个message消息,只能被消费者组中的一个消费者消费,这个和kafka中的消息消费是一样的

上面提到了消费者组的概念,在生产者中,也有生产者组。在事务机制中,当生产者给broker发送数据之后,broker需要给生产者一个数据回调,那么就需要指定生产者名字,那么此时生产者组就能发挥其作用

生产者producer在本地会有一个缓存存储Nameserver中存储的broker,在往broker投递之前,会向注册中心中发起一个请求判断是否需要拉取最新的配置,然后再往对应的broker发送数据

2,rocketmq底层原理

2.1,事务的底层实现

rocketmq的事务实现,相当于一个简单的分布式事务,主要是保证生产者本地事务和发送到broker事务的原子性。而broker到consumer端是一定可以保证消息消费成功的,如果一个消费者失败,那么可以往别的消费者里面推送,如果最终依旧失败,那么可以先重试,最后加入到死信队列里面

事务消息的底层实现如下图,首先生产者会发送一个half消息给Broker,Broker在接收到这个half消息之后,就会向broker返回一个确认的标志,然后事务的发送者就会执行本地事务,通过这个execute去执行本地事务。如果本地事务执行成功,那么生产者会返回一个提在交的状态给Broker,随后Broker将消息投递到消费者中;如果是回滚状态,那么消息会直接丢掉;如果是在4的时候,本地事务需要的时间过长,那么本地会先返回一个unknow的未知状态,然后broker会等一段时间,随后再回生产者中定时回查,消息生产者会去检查事务,默认是回查15次,如果是15次之后检查还是没有完成,那么消息就会直接丢弃掉

half消息有点类似于建立tcp连接,主要是做为一种嗅探机制,判断当前broker服务是否正常,如果broker服务挂了,那么连本地事务,也可以直接不执行了。

在这里插入图片描述

如一个订单场景,30s检查一次是否支付,那么就可以直接通过这种事务去实现,通过execute方法去执行本地事务,然后通过这个check的方式去银行进行对账。如果最终超时,那么最终将消息放入到死信队列中,在私信队列中写对应的逻辑,如将库存加回等。

2.2,如何保证消息不丢失

在mq中,消息丢失主要有四个地方,分别是生产者到broker、broker到消费者,broker的master到slave以及操作系统自身的缓存。

  • 生产者到broker的解决方案可以如下:可以选择最简单的同步+多次试错的方式,或者可以直接选择事务消息
  • broker到消费者之间:消费者本身具有重试功能,消费者不应答就会往别的消费者投递
  • 操作系统主要是因为数据在缓存,如果出现断电而未来得及刷盘导致,因此应该采用同步刷盘解决
  • broker到的master到slave之间:也可以采用同步的方式,来一条消息就往slave写入,或者通过Dledger集群

操作系统和主从之间保证消息不丢失,主要是通过同步的方式解决,但是在保证安全的情况下,会在一定的程度上影响吞吐量和性能

2.3,rocketmq积压问题

在rocketmq中,其处理数据积压问题时比其他mq的能力强的,如果出现积压,那么可以直接通过控制台上面的topic,通过内部的代理者位点和消费者位点所产生的差值查看,如果差值为0,则表示有消息积压未处理。

在这里插入图片描述

在rocketmq内部,一个MessageQueue队列的消息只能由一个消费者组中的一个消费者去消费,其底层实现和kafka是一样的,因此如果出现消息积压,那么首先可以查看消费者组中的消费者个数和队列的个数是否相同,如果消费者个数小于队列的个数,那么可以增加消费者个数,直到和队列的个数一致,如默认队列的个数为4,那么将消费者组中的消费者个数设置成4

当然,消费者个数调大是没有用的,因为最大只能和topic中的队列一致,那么就可以通过重写一个topic,调大topic中队列的数量,如原来的队列个数只有4,那么可以创建一个新的topic,设置队列的个数为8,并且原来的消费者对消息不消费,而是做一个转发功能,将4个队列的topic的数据转发到8个队列的topic中,那么在消费者组中,其个数就可以设置成8,那么这样子就很好的处理消息积压的问题了。

数据的搬运可以在具体的消费者代码里面去编写,主要功能有接收四个topic队列的数据,然后转发到八个topic的队列中,最后再写一个消费者去消费八个队列topic的消息

2.4,如何保证顺序消费

这里的顺序消息只能保证局部有序,而不是全局有序。在rocketmq内部,在生产者端,消息会根据id做一个取模运算,会将同一个区取模运算的值放入一个队列里面,在消费者端,会锁定队列消费,就是会先消费完一个队列再消费下一个队列,从而保证单个队列消费的有序性

2.5,rocketmq的持久化

rocketmq为了保证消息的安全性,在broker内部都会做一个持久化的操作,首先当生产者将消息发送到broker之后,会现将消息存储到 coimmit 文件中,每个topic都会有对应的commit文件,每个文件大小为1g,如果消息满了则会创建新的文件,文件的格式为二进制格式。

在消费者中,会有一个 comsumeQueue 文件,改文件不存数据,只存索引信息,如存一些偏移量等,在消费时可以更快的定位到commit文件中的数据,随后去消费里面的数据,并且可以通过Tag标签去过滤消息

在这里插入图片描述

除了上面两个文件之外,还有维护一个index文件,内部会记录Commit日志的偏移量等

2.6,死信队列

当broker和consumer之间重试16次之后,消息依旧没能被消费,那么消息就会加入到死信队列中。一个私信队列会对应一个消费者组,其perm对应的权限值为2。死信队列的消息默认不会被消费,而是需要开发者自身去处理该队列中的数据。

并且私信队列中消息的有效期也是三天,可以在broker.conf配置文件设置,当超过这个时间,消息都会被删除。

2.7,消息的幂等性

在rocketmq中,消息的幂等性为 at least once 至少被消费一次。官方建议使用里面的key去做幂等性,key是一个唯一值,就是一个唯一id。除了这些方式之外,在分布式场景下,也可以开率分布式锁这些做幂等。

3,rocketmq高性能的设计

3.1,零拷贝技术

零拷贝是操作系统层面的一种加速文件读写的操作机制,可以通过这种零拷贝的形式提升IO操作的性能。在java中,主要是通过这种 fileChannel 的方式实现零拷贝,其具体实现由 mmap和sendFile 两种形式

以一个文件的拷贝为例,正常来说,需要从用户态切换到内核态,然后再去执行io操作,并且需要通过cpu的调度,从磁盘中将文件加载到内存,再加载到网卡。而在引入零拷贝技术之后,可以让channel代替cpu去做io操作,cpu只需要给channel对应的权限即可。在操作系统层面,就是利用这种DMA技术,将原来四次的cpu拷贝,变成了两次,从而提高整体性能。

3.2,顺序写技术

本人在写过一个顺序io和随机io的文章:https://zhenghuisheng.blog.csdn.net/article/details/129080088 ,顺序写可以减少磁头的移动去寻址,不管是插入数据还是查询数据,都可以提升其性能,并且可以减少磁盘的碎片。

3.3,刷盘机制

rocketmq为了保证数据的安全性,在broker中会持久化到commitlog中,在刷盘时有两种方式,分别是:同步刷盘和异步刷盘 ,默认采用的刷盘机制时异步刷盘

flushDiskType=ASYNC_FLUSH

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

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

相关文章

[点云分割] 基于最小切割的分割

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <vector>#include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/visualization/cloud_viewer.h> #include <pcl/filters/filter_indices.h> #include…

B站已经部分上线前台实名,如不同意实名,后期账号流量将收影响!

B站部分百万粉丝博主的主页显示账号运营人名字的政策是从10月31日开始的。当天&#xff0c;B站官方发布了《哔哩哔哩关于头部“自媒体”账号前台实名的公告》&#xff0c;表明了其前台实名制的实施计划。 B站部分上线前台实名的过程可以追溯到2021年。当时&#xff0c;中国政府…

报表系统是什么?如何快速帮助企业数字化转型?

在信息洪流中&#xff0c;企业需要应对日益增长的数据量和复杂业务环境&#xff0c;这需要借助科技手段来驾驭数据管理和决策分析。报表系统&#xff0c;作为企业决策的重要工具&#xff0c;就如同航海的罗盘&#xff0c;帮助企业在数据的海洋中快速定位&#xff0c;从而提高管…

最常用的5款报表系统

在这个信息化飞速发展的时代&#xff0c;报表系统已经成为了企业管理和决策的重要工具。随着市场的需求不断增长&#xff0c;报表系统也在不断地更新和完善。如今&#xff0c;市面上有数不尽的报表系统&#xff0c;但是哪款才是最常用的呢&#xff1f;接下来&#xff0c;我们将…

慕尼黑电子展Samtec Demo | 回环测试带来Samtec产品组合优异表现

【摘要/前言】 大家好&#xff01;Electronica虎家展台Demo系列回来咯。 实践出真知&#xff0c;再好的纸面数据都不如来一场实际的测试和演示。Samtec团队始终在努力为客户带来卓越的产品和优质服务。而这其中&#xff0c;Demo演示的存在至关重要。演示过程可以为大家带来了…

AppLink结合金蝶云星空作订单信息同步流程

此次通过AppLink&#xff0c;根据请求数据金蝶云星空做销售订单信息同步拉取 在获取订单信息前需要得到金蝶云星空授权&#xff0c;详细授权步骤可查看&#xff1a;金蝶云星空授权指南 根据请求数据在金蝶云星空保存销售订单 当webhook接收到数据时触发流程 步骤1&#xff…

维护工程师面经

文章目录 前言技能要求数据结构定义分类常用的数据结构 数据库原理数据的三级模式结构事务查询方式视图数据库范式 Java相关知识点总结 前言 本博客仅做学习笔记&#xff0c;如有侵权&#xff0c;联系后即刻更改 科普&#xff1a; 参考网址 技能要求 数据结构 参考网址 定…

虚拟机centos设置网络模式(桥接|NAT)

前言 桥接模式是通过物理网卡直接与外部网络建立联系的&#xff0c;而NAT模式则是通过虚拟网卡VMnet1或VMnet8通过宿主机共享IP与外部建立网络关系当需要将虚拟机资源共享给局域网用户使用时&#xff0c;宜采用桥接模式&#xff1b;当需要保护虚拟机资源&#xff0c;确保只能由…

数据结构【DS】特殊二叉树

完全二叉树 叶子结点只能出现在最下层和次下层, 最下层的叶子结点集中在树的左部完全二叉树中, 度为1的节点数 0个或者1个【计算时可以用这个快速计算, 配合&#x1d45b;0&#x1d45b;21】若n为奇数&#xff0c;则分支节点每个都有左右孩子&#xff1b;若n为偶数&#xff0…

Jmeter 压测实战保姆级入门教程

1、Jmeter本地安装 1.1、下载安装 软件下载地址&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/ 选择一个压缩包下载即可 然后解压缩后进入bin目录直接执行命令jmeter即可启动 1.2 修改语言 默认是英文的&#xff0c;修改中文&#xff0c;点击…

探秘互联网医院系统的技术内幕:代码解析与创新

随着科技的飞速发展&#xff0c;互联网医院系统正日益改变着传统医疗服务的面貌。这些系统的背后&#xff0c;隐藏着精密而创新的技术。本文将深入研究互联网医院系统的技术内幕&#xff0c;透过代码解析&#xff0c;揭示这些系统如何实现医疗服务数字化的伟大使命。 1. 实时…

优质猫罐头有哪些品牌?分享5款宠物店自用值得推荐的猫罐头!

不知不觉已经开宠物店7年啦&#xff0c;店里的猫猫大大小小也算是尝试过很多品牌的猫罐头了。优质猫罐头有哪些品牌&#xff1f;在猫罐头的选购上一开始我也是踩了很多坑&#xff0c;各种踩雷。我深知猫罐头的各种门道&#xff0c;新手一不小心就会着道了。 优质猫罐头有哪些品…

涉密人员离职怎么做好安全管理?

在信息安全领域&#xff0c;涉密人员的离职安全管理具有极其重要的意义。一旦涉密人员离职&#xff0c;可能会对单位的信息安全造成威胁&#xff0c;因此必须采取有效的措施来确保涉密人员离职后的信息安全。 一、涉密人员离职安全管理的现状 目前&#xff0c;许多单位在涉密人…

云流量回溯主要作用是哪些?

云流量回溯&#xff0c;作为网络运营中的一项关键技术&#xff0c;具有重要的作用&#xff0c;为企业提供了更加精准、高效的网络管理手段。本文将探讨云流量回溯的主要作用以及其在网络优化中的关键性。 1. 实时监测与分析&#xff1a;云流量回溯通过实时监测网络流量&#xf…

力扣OJ题讲解——循环队列

今天我们一起来做一道关于队列的OJ题目&#xff0c;这是力扣题目622题&#xff0c;点击题目链接可以直接跳转&#xff0c;https://leetcode.cn/problems/design-circular-queue/ 首先&#xff0c;我们看到要求&#xff0c;需要我们实现哪些功能&#xff1f; 我们需要设置队列长…

ubuntu上编译proj-7.1.0出现tiffio.h找不到的错误

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 在编译ubuntu上编译proj-7.1.0出现下面错误&#xff1a; grids.cpp:41:10: fatal error: tiffio.h: No such file or directory41 | #include "tif…

在iPad pro上安装VSCode,秒变生产力工具提升编程工作效率!

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 本地环境配置二. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.…

地磁传感器在城市交通智能监控系统的作用

地磁传感器的功能作用 地磁传感器的功能是相当强大的&#xff1a;当驾驶员把车辆停在车位上&#xff0c;地磁传感器能自动感应车辆的到来并开始计时&#xff1b;待车辆要离开时&#xff0c;传感器会自动把停车时间传送到中继站进行计费。因此&#xff0c;解决停车收费效率低下…

赛轮集团SAILUN方程式赛车轮胎震撼登场,开启新篇章

11月初&#xff0c;在厦门国际赛车场&#xff0c;SAILUN方程式赛车轮胎展现出令人瞩目的实力&#xff0c;成功完成了首次震撼亮相。这一引人注目的表现为未来的赛车轮胎技术发展打开了崭新的一页。 在这次首次亮相的测试中&#xff0c;职业车手巧妙操控着SAILUN方程式赛车轮胎&…

吴恩达《机器学习》9-7-9-8:综合起来、自主驾驶

在神经网络的使用过程中&#xff0c;需要经历一系列步骤&#xff0c;从网络结构的选择到训练过程的实施。以下是使用神经网络时的主要步骤的小结&#xff1a; 一、网络结构的选择 输入层&#xff1a; 第一步是选择网络结构&#xff0c;即确定神经网络的层数以及每层的单元数。…