当前位置: 首页 > news >正文

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

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

相关文章:

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

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

【数据结构/C++】线性表_单链表的基本操作

#include <iostream> using namespace std; // 2. 单链表 // ElemType 的定义 typedef int ElemType; typedef struct LNode {ElemType data;struct LNode *next; } LNode, *LinkList; // 初始化单链表 bool InitList(LinkList &L) {L (LNode *)malloc(sizeof(LNode…...

flink1.13.6版本的应用程序(maven版)

问题 想要一个指定flink版本的java计算任务hello world最简工程。 解决 mvn archetype:generate \-DarchetypeGroupIdorg.apache.flink \-DarchetypeArtifactIdflink-quickstart-java \-DarchetypeVersion1.13.6这里直接使用官方mave模版工程&#xff0c;指…...

深度学习之四(循环神经网络Recurrent Neural Networks,RNNs)

概念 循环神经网络(Recurrent Neural Networks,RNNs)是一类专门用于处理序列数据的神经网络,它在处理时考虑了序列数据的顺序和上下文信息。RNNs 在自然语言处理、时间序列分析、语音识别等领域得到广泛应用。 1. 基本结构: RNN 的基本结构包含一个或多个循环单元,每个…...

【论文精读】HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face

HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face 前言Abstract1 Introduction2 Related Works3 HuggingGPT3.1 Task PlanningSpecification-based InstructionDemonstration-based Parsing 3.2 Model SelectionIn-context Task-model Assignment 3…...

安装gitlab

安装gitlab 环境 关闭防火墙以及selinux&#xff0c;起码4核8G 内存至少 3G 不然启动不了 下载环境 gitlab官网&#xff1a;GitLab下载安装_GitLab最新中文基础版下载安装-极狐GitLab rpm包下载地址&#xff1a; [Yum - Nexus Repository Manager (gitlab.cn)](https://pack…...

Nginx模块开发之http handler实现流量统计(1)

文章目录 一、handler简介二、Nginx handler模块开发2.1、示例代码2.2、编写config文件2.3、编译模块到Nginx源码中2.4、修改conf文件2.5、执行效果 三、Nginx的热更新总结 一、handler简介 Handler模块就是接受来自客户端的请求并产生输出的模块。 配置文件中使用location指令…...

JSP编写自己的第一个WebServlet实现客户端与服务端交互

我们在项目中找到java目录 下面有一个包路径 然后 我们在下面创建一个类 我这里叫 TransmissionTest 当然 名字是顺便取的 参考代码如下 package com.example.dom;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet…...

三、Keil安装芯片包、下载固件库、建立STM32工程模板

目录 一、首先在Keil软件上安装好芯片包 二、下载官方固件库 三、建立基于固件库的Keil5工程模板 一、首先在Keil软件上安装好芯片包 STM32有很多系列的芯片&#xff0c;我们平常用的最多的是STM32F1系列的&#xff0c;因此安装F1系列的芯片包在我们初学时&#xff0c;只按照…...

微信相框M1-03花屏抢救照片数据

故障现象 相册屏幕花屏&#xff0c;无法显示&#xff0c;拔掉电源黑屏&#xff08;内部自带锂电池的&#xff09; 问题排查 开始怀疑屏幕故障&#xff0c;拆开看到内部&#xff0c;发现是锂电池时间长鼓包后&#xff0c;顶到PCB&#xff0c;PCB板已经翘曲了&#xff0c;导致花…...

小程序可拖拽按钮

你有没有遇到过在页面中有一个固定在某个位置的按钮&#xff0c;永远的挡住了你想要看的区域&#xff1f; 在小程序的列表页面中&#xff0c;常常会有一个提报的入口固定在右下角&#xff0c;如果这个按钮不可拖动的话&#xff0c;可能会挡住下面的事件&#xff0c;让用户操作起…...

ARM裸机-19(NandFlash和iNand)

1、NandFlash的接口 1.1、Nand的型号与命名 (1)、Nand的型号命名都有含义&#xff0c;就拿K9F2G08来示例分析一下&#xff1a;K9F表示是三星公司的NandFlash系列。2G表示Nand的大小是2Gbit (256MB)。08表示Nand是8位的 (8位就是数据线有8根)。 (2)、Nand命名中可以看出&#x…...

机器学习/sklearn笔记:MeanShift

1 算法介绍 一种基于质心的算法通过更新候选质心使其成为给定区域内点的均值候选质心的位置是通过一种称为“爬山”技术迭代调整的&#xff0c;该技术找到估计的概率密度的局部最大值 1.1 基本形式 给定d维空间的n个数据点集X&#xff0c;那么对于空间中的任意点x的均值漂移…...

opencv-简单图像处理

图像像素存储形式  对于只有黑白颜色的灰度图&#xff0c;为单通道&#xff0c;一个像素块对应矩阵中一个数字&#xff0c;数值为0到255, 其中0表示最暗&#xff08;黑色&#xff09; &#xff0c;255表示最亮&#xff08;白色&#xff09; 对于采用RGB模式的彩色图片&#…...

Linux(Kali\Ubuntu\CentOS\arm-Linux)安装Powershell

文章目录 Linux(Kali\Ubuntu\CentOS\arm-Linux)安装Powershell启动PowershellKaliUbuntuCentOSarm-Linux离线安装参考链接 Linux(Kali\Ubuntu\CentOS\arm-Linux)安装Powershell 启动Powershell pwshKali apt update && apt -y install powershellUbuntu # 更新包列…...

ubuntu20.04安装多版本cuda,切换版本

1. 安装cuda toolkit: 下载网站 https://developer.nvidia.com/cuda-11.3.0-download-archive 选择版本&#xff0c;这里选择11.3 wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run给cuda权限: chmod x…...

网络渗透测试(wireshark 抓取QQ图片)

1.打开wireshark 这里我用的wifi连接 所以点开wifi就好 打开wifi之后就开始在本机上进行抓包了 我们先给我们的QQ发送一张图片&#xff0c;用自己的手机发送给电脑 然后点击左上角的正方形&#xff0c;停止捕获抓包 QQ的关键词是oicq&#xff0c;所以我们直接找 打开oicq …...

gRPC之gRPC负载均衡(客户端负载均衡)(etcd)

1、gRPC负载均衡(客户端负载均衡)(etcd) 本篇将基于etcd的服务发现前提下&#xff0c;介绍如何实现gRPC客户端负载均衡。 1.1 gRPC负载均衡 gRPC官方文档提供了关于gRPC负载均衡方案Load Balancing in gRPC https://github.com/grpc/grpc/blob/master/doc/load-balancing.m…...

语音识别技术paddlespeech的安装和使用

PaddleSpeech 介绍 PaddleSpeech是百度飞桨&#xff08;PaddlePaddle&#xff09;开源深度学习平台的其中一个项目&#xff0c;它基于飞桨的语音方向模型库&#xff0c;用于语音和音频中的各种关键任务的开发&#xff0c;包含大量基于深度学习前沿和有影响力的模型。PaddleSpe…...

【机器学习】034_多层感知机Part.2_从零实现多层感知机

一、解决XOR问题 1. 回顾XOR问题&#xff1a; 如图&#xff0c;如何对XOR面进行分割以划分四个输入 对应的输出 呢&#xff1f; 思路&#xff1a;采用两个分类器分类&#xff0c;每次分出两个输入 &#xff0c;再借助这两个分类从而分出 。 即采用同或运算&#xff0c;当两…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...