关于RocketMQ的高性能设计,你真的了解吗?

RocketMQ性能优化:全网最全的一篇 通过监控 RocketMQ 的性能指标和运行状态,可以及时发现问题并进行优化调整。操作系统的配置对 RocketMQ 的性能有显著影响。通过合理的操作系统调优,可以更好地发挥硬件性能,提升 RocketMQ 的消息处理能力。RocketMQ 的写入和消费性能直接影响系统的整体吞吐量和响应时间。通过优化写入和消费策略,可以进一步提升 RocketMQ 的性能。合理选择和配置硬件资源,可以为 RocketMQ 提供更高的吞吐量和更低的延迟。通过优化消息存储策略和数据结构设计,可以提升消息存储和检索的效率。 阅读详情

今天继续跟大家聊一聊RocketMQ的高性能设计吧!

其实经过了很多年的阿里巴巴的双十一的验证,RocketMQ除了稳定以外,也保持着极高的性能(不然阿里早就不用啦)。这也是很多企业在技术选型的时候会把RocketMQ纳入考虑范围的原因。

先说结论,它的高性能设计主要体现在三个方面:

  • 数据存储设计
  • 动态伸缩能力
  • 消息实时投递

先说说数据存储设计吧,数据存储设计主要包括了RocketMQ的顺序写盘,消费队列的设计,消息跳跃读,数据零拷贝。

是不是看到这头都大了?

我刚开始看的时候也是觉得,这些术语看的我比上数学课都犯困,还学习?怎么学?

不急,我们还是拆开一点点来分解一下。

数据存储设计

RocketMQ的数据存储的核心主要由两个部分组成,CommitLog(数据存储文件)和ConsumeQueue(消费队列文件)。

简单来说,我们按步骤分解一下:

  1. Producer会先把消息发送到Broker服务器
  2. Broker会把所有收到的消息都存储在CommitLog文件中
  3. CommitLog文件会将消息转发到ConsumeQueue文件
  4. ConsumeQueue文件提供给各个Consumer消费

为了方便理解,画个图咱们了解一下:

顺序写盘

在说顺序写盘之前,我们先回顾一下子盘读写要经历的三个动作:

  • 寻道:磁头移动到指定磁道,需要找到数据在哪个物理位置,时间很长。
  • 旋转延迟:等待指定扇区旋转至磁头下,机械硬盘和每分钟多少转有关,时间很短。
  • 数据传输:数据通过系统总线从磁盘传输到内存,时间很短。

其中,磁盘读写最慢的动作是寻道,缩短寻道时间就能有效提升磁盘读写的速度,那最优的方式就是不用寻道啦。

  • 随机写:随机写会导致磁头不停的更换磁道,时间都花在寻道上了。
  • 顺序写:顺序写几乎不用换磁道,当然也不是完全不换,总之,其寻道时间在这里可以忽略不计。

前面我们说了CommitLog文件,它是负责存储消息数据的文件,所有Topic的消息都会先存在CommitLog文件中,消息数据写入CommitLog文件是加锁串行追加写入。

RocketMQ为了保证消息发送的高吞吐量,使用了单个文件存储所有的Topic的消息,也就是说,每个CommitLog文件存储了多个Topic的消息,这样虽然保证了消息存储的时候是完全的顺序写,但是又会给读取的时候带来困难。

那RocketMQ是怎么解决的呢?

RocketMQ的做法很简单,当消息到达CommitLog文件后,会通过异步线程几乎实时的将消息发送给消费队列文件(ConsumeQueue),每个CommitLog文件的默认大小是1GB,当写满后再写新的文件。

这样就导致了大量的I/O都顺序写在同一个CommitLog文件。重点来了,其文件名是按照该文件起始的总的字节偏移量offset命名,文件名固定的长度为20位,不足的前面补0,如:

  • 第一个文件起始偏移量是0,文件名为:00000000000000000000。
  • 第二个文件起始偏移量是1024 x 1024 x 1024 = 1073741824 (1 GB = 1073741824B),那第二个文件名为0000000001073741824。

这样加的好处是,在消费消息时能够根据偏移量offset来快速定位到消息存储在某个CommitLog文件,从而加快了检索的速度。

消费队列设计

其实前面我们已经发现了,消费Broker中的消息,本质上就是读取文件,但是问题在于消息数据文件中所有的Topic的消息是混合在一起的,但是消费消息的时候又是区分Topic来消费的。

这就导致如果消费消息的时候也读取CommitLog文件的话,会导致消费消息就变得性能差,吞吐量低。

那怎么解决的呢?

前面我们已经知道了,RocketMQ设计了ConsumeQueue来解决这个问题,它负责存储消费队列文件,在消息写入CommitLog文件的时候,通过异步线程转发到ConsumeQueue文件,然后提供给Consumer消费。

这里我们看之前的图应该就能知道,ConsumeQueue文件中并不存储具体的消息数据,只存储了CommitLog的offset偏移量,消息大小,消息Tag Hashcode。

每个Topic在某个Broker下是对应多个队列的,默认是四个,每一条记录的大小是20B,默认一个文件会存储30万个记录,文件名和CommitLog一样,也是按照字节偏移量来命名,文件名的默认长度是20位,不足补0。

  • 第一个文件起始偏移量是0,文件名是000000000000000000000,与CommitLog一样。
  • 第二个文件其实偏移量是20 x 30w = 6000000,第二个文件名是00000000000006000000。

如果是在集群的模式下,Broker会记录客户端对每个消费队列的消费偏移量,定位到ConsumeQueue里相应的记录,并通过CommitLog的Offset定位到CommitLog文件里的该条消息。

消息跳跃读取

RocketMQ中还是用了操作系统中的Page Cache机制(一种缓存机制), RocketMQ读取消息依赖操作系统的PageCache,PageCache命中率越高,那么RocketMQ的读取性能就越高,操作系统会尽量预读取数据,使应用直接访问磁盘的概率变低。

消息队列文件的读取流程:

  • 检查要读取的数据是否在上次预读取的Cache中。
  • 如果没有命中Cache,操作系统从磁盘中读取对应的数据页,并将该数据页之后的连续几页一起读取到Cache中,在将应用需要的数据返回,这种方式就叫做跳跃读取。
  • 如果命中的Cache,上次缓存的数据有效,操作系统认为在顺序读盘,则继续扩大混存的数据范围,将之前缓存的数据页之后的几页数据再读取到Cache中。

这里我们小小的扩展一下,在计算机中,CPU,RAM(内存),DISK(硬盘)的速度是不相同的,相信大家都知道的,按照速度高低排列一下:CPU>RAM>DISK。

还有一点是,它们之间的速度和容量差距是指数级别的,为了折中一下,就有了在CPU和RAM之间使用CPU Cache来提高访存速度,在RAM和DISK之间使用Page Cache提高系统对文件的访问速度。

数据零拷贝

这个相信各位也应该有所耳闻了,在网络通信的过程中呢,通常情况下对文件的读写要多经历一次数据拷贝,例如写文件数据要从用户态拷贝到内核态,再由内核态写入物理文件。

所谓的零拷贝指的就是用户态与内核态之间不存在拷贝。

在Java 的NIO中会提到相同的东西,到时候细说一下。

RocketMQ中的文件读写主要通过Java NIO中的 MappedByteBuffer来进行文件映射。利用了Java NIO中的FIleChannel模型,可以直接将物理文件映射到缓冲区的PageCache,少了一次数据拷贝的过程,提高了读写的速度。

动态伸缩能力

所谓动态伸缩呢,我们可以想象一下类似双11和618的时候,我们需要增加服务器(伸)来应对暴增的流量,但并不是所有的时候都有这么大的流量,所以当流量回归到正常水平的时候,为了避免服务器的资源(成本)浪费,此时就需要减少服务器(缩)。

我们从两个方面来说一下:

  • 消息队列扩容/缩容:一个Consumer实例同时消费多个消息队列中的消息。如果一个Topic的消息量特别大,但是Broker集群的水位压力还是很低,就可以对该Topic进行扩容,Topic的消息队列数跟消费速度是成正比的。消息队列的数可以在创建Topic的时候指定,也可在运行中修改。相反,就可以缩容。
  • Broker集群扩容/缩容:同样的, 如果一个Topic的消息量特别大,但是Broker集群的水位很高,此时就需要对Broker机器扩容,扩容的方式也很简单,直接加机器部署Broker就行了。新的Broker启动后会向NameServer注册,Producer和Consumer通过NameServer发现新的Broker并更新路由信息,反之亦然。

消息实时投递

消息的高性能除了以上说到的,还体现在消息发送到存储之后能否立即被客户端消费,这就涉及到了消息的实时投递,Consumer消费消息的实时性与获取消息的方式有很大的关系。

我们知道,任何一款消息中间件都会有两种获取消息的方式,Push推模式和Pull拉模式。这两种模式呢,不能是谁好谁不好,只是他们适用于不同的场景:

  • Push推模式:
    • 优点:Consumer能实时的接收到新的消息数据。
    • 缺点:Consumer消费不过来,缓冲区溢出。而且一个Topic往往对应多个ConsumerGroup,服务端一条消息会产生多次推送,给服务端造成不小的压力。
  • Pull拉模式:
    • 优点:可以根据消费速度选择合适的时机拉去消息消费。
    • 缺点:拉取的间隔时间不好控制。

其实这两种获取消息方式的缺点都很明显,单一的方式很难应对复杂的消费场景。

所以呢,RocketMQ提供了一种推/拉结合的长轮询机制来平衡这哥俩的缺点。

长轮询本质上其实是对普通Pull模式的优化,所以呢,还是以Consumer轮询的方式主动发送拉取请求到服务端Broker,Broker检测到有新的消息就返回给Consumer,如果没有就不返回,挂起当前请求缓存到本地,Broker有个线程去检查挂起请求,等到新消息产生时再返回Consumer。

对了,平常我们使用的DefaulMQPushConsumer的实现就是推拉结合的。

说白了,也就是消费者会不断地问Broker:“有新的消息可以给我消费了没?”

然后Broker要么回答:“有了!马上发给你。”

要么一直不说话,等到有新消息了再回答你。

后记

本来之前想着RocketMQ的高性能设计不需要太长的篇幅就可以讲完的,没想到整理了一下,有点小多。

那就后续再写RokcetMQ的高可用部分吧。

今天就不emo了,emo不起来了。

本来想写一点自己怎么入坑的这个行业,写了快一万字了,才刚到一半,有点小累。

好啦,今天就到这里啦!

欲知后事如何,且听下回分解。

关于RocketMQ的性能优化 Kafka也是一款高性能的消息中间件,在大数据的场景中经常会使用,但是因为Kafka不支持消息失败重试,定时消息,事物消息,它的顺序消息也有明显的缺陷的,在复杂的业务场景下难以支撑。为了方便大家去阅读源码,我简单的跟大家说一下。在分布式服务(SOA)的架构中,我们是不允许任何中间件是单点的,服务发现机制也是必备的。:消息队列,组成Topic的最小单元,一个Topic可以有多个消息队列,Topic是逻辑上的概念,而Queue是物理存储,在Consumer消费Topic时底层实际拉取的是Queue的消息。 阅读详情

相关推荐

RocketMQ 为何性能高

*消费时首先获取 MessageQueue 对应的 objectLock,保证当前进程内只有一个线程在处理对应的的 MessageQueue, 从 ProcessQueue 的 msgTreeMap 中按 offset 从低到高的顺序取消息,从而保证了消息的顺序性。消息属性长度未超限;**Broker:负责接收消息的生产和消费请求,并进行消息的持久化和消息的读取。**所有的消息写入转为顺序写(相比于 Kafka,RocketMQ 即使对于 1w+ 以上的 Topic 也能够应付自如)**读写文件分离。

Wis57的博客 1119

RocketMQ:高性能、可靠的消息中间件

RocketMQ是由阿里巴巴开源的一款分布式消息中间件,由阿里巴巴集团开发并于2012年首次发布,它最初作为阿里内部消息中间件服务的核心组件,后来于2016年底开源。它支持多种消息模型,包括发布/订阅模型、点对点模型等。RocketMQ具有高可用、高可靠、高并发和低延迟等特点,广泛应用于金融、电商、物流等多个领域。RocketMQ作为一款高性能、可靠、易扩展的消息中间件,在分布式系统中发挥着至关重要的作用。通过对RocketMQ的深入了解,我们可以更好地应用它来解决各种实际问题。

qq_34321710的博客 1078

RocketMQ高手之路系列之十一:RocketMQ如何实现高性能读写

4、经过逻辑处理后,用户程序需要将处理后的数据通过write()方法进行系统调用,此时系统上下文切换为内核态;5、CPU通过调度将用户缓冲区的数据拷贝到socket缓冲区中;6、将socket缓冲区中的数据拷贝至网卡io,系统上下文切换为用户态。内核主要的作用总结起来就是对硬件来说进行统一对硬件管理,对上层应用来说提供统一对系统调用。由于硬件资源很敏感需要被保护起来,那么内核就起到了用户程序与硬件交互的桥梁作用。通过区分内核空间和用户空间的设计,隔离了操作系统代码与应用程序代码。

2401_86402375的博客 1182

RocketMq架构高性能设计思路

本文主要介绍Mq在性能方面做的相关优化 RocketMq架构 经常会提到RocketMq,其性能多么多么好,那么各位有没想过,其性能为什么好? 先从RocketMq架构层面入手,先上一张架构图 RocketMQ 架构上由 Broker、NameServer、Producer 和 Consumer 组成,各个组件功能如下 NameServer:注册中心和配置中心,管理集群的元数据,包括 Topi...

hosaos的博客 4406

RocketMQ-RocketMQ高性能核心原理与源码剖析(下)

而RocketMQ的这种快速落盘的方式,在多Topic的场景下,优势就比较明显了。如果是这样的话,那显然会极大的浪费网络带宽以及服务器的性能,并且,当有新的消息进来时,RocketMQ也没有办法尽快通知客户端,而只能等客户端下一次来拉取消息了。​ 在executeOnTimeup方法中,就会去扫描SCHEDULE_TOPIC_XXXX这个Topic下的所有messageQueue,然后扫描这些MessageQueue对应的ConsumeQueue文件,找到没有处理过的消息,计算他们的延迟时间。

weixin_43874650的博客 1370

RocketMQ高手之路系列之十一:RocketMQ如何实现高性能读写(1)

分享一份自己整理好的Java面试手册,还有一些面试题pdf。

2401_84010176的博客 1069

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

深入理解rocketmq的架构解析和高性能设计

zhenghuishengq的博客 2309

90+个各种疾病相关医疗数据集

含新冠、传染病、医学图像等

2万+

RocketMQ吐血总结

RocketMQ吐血总结 架构   概念模型 最基本的概念模型与扩展后段概念模型  存储模型   RocketMQ吐血总结 User Guide RocketMQ是一款分布式消息中间件,最初是由阿里巴巴消息中间件团队研发并大规模应用于生产系统,满足线上海量消息堆积的需求, 在2016年底捐赠给Apache开源基金会成为孵化项目,经过不到一年时间正式成为了A...

武汉红喜 15万+

【数据分析生命周期全揭秘】从零开始打造你的数据科学项目 | 最全指南

在当今数据驱动的世界中,数据科学正在颠覆传统行业,成为企业决策和价值创造的重要引擎。然而,如何科学、系统地开展一个数据分析项目?这是很多人关心的核心问题。本篇文章基于经典数据分析课程内容,深入解读数据分析生命周期的每个阶段,让你快速掌握从“发现问题”到“落地应用”的完整流程。如果你正在学习或准备从事数据分析领域,这篇文章一定会对你大有帮助!数据分析生命周期的六大阶段数据分析生命周期的六个阶段相辅相成,每个阶段都至关重要:发现问题:明确需求,提出假设。数据准备:清洗、转换和可视化数据。

AI手套的博客 1740

【R语言】富集分析可视化代码(整理版)

分别介绍了如何使用DAVID在线分析工具对基因进行GO/KEGG功能富集分析、使用R ggplot包对获得的基因GO/KEGG功能富集结果进行可视化、使用R clusterProfiler包和R AnnotationHub包对基因进行GO/KEGG功能富集分析、OrgDb包制作以及结果可视化等。故,我重新整理了一波,并补充了可对多个分组的富集结果进行可视化以及富集结果绘制圈图等的代码。关注“在打豆豆的小潘学长”公众号,发送“富集分析3”获得完整代码包和演示数据。一、单组富集结果可视化。

weixin_54004950的博客 1万+

rocketMq高性能存储设计

消息中间价存储一般都是利用磁盘,在廉价的PC机上一般是使用机械硬盘,但机械硬盘的速度比访问内存慢了n个数量级,但一款优秀的消息中间件必然会将硬件资源压榨到极致,接下来看看rocketMq是如何做到高效存储的。 1、rocketMq存储结构 rocketMq存储 这张流程图简单介绍了rocketMq的存储实现,先简单说明下各自的含义 MappedFile 所有的topic数据都写到同一个文件中,文件的大小默认为1G,使用mmap与磁盘文件做映射,初始化时使用mlock将内存锁定,防止pagec

guoxu0514的博客 2083

密码学与信息安全面试题及参考答案(2万字长文)

密码学是一门研究信息安全的学科,它涉及加密、解密以及保护数据免受非授权访问的技术和方法。这门学科的核心在于设计并分析各种协议,使通信双方即使在存在潜在敌手的环境中也能安全地传输信息。保密性:确保信息只能被预期的接收方读取,阻止未经授权的第三方获取信息的真实内容。完整性:保证数据在传输过程中不被篡改,确保接收方接收到的信息与发送方发送的信息完全一致。认证性:验证信息的来源,即确认信息确实是由声称的发送方发出的。不可否认性:确保发送方不能在事后否认曾经发送过某条信息。访问控制。

大模型大数据攻城狮的专栏 1994

RocketMq高性能架构设计

分布式架构中,消息中间件要实现三高:高性能、高扩展、高可用特性。RocketMq是怎么实现的呢从RocketMq实现的功能上分析,能够实现高性能的点体现在几个方面:1. Producer尽快的发消息2. Consumer尽快的消费消息3. Broker能保存海量消息,保证消息的不丢失。

qinwenjng120的博客 556

【读代码】SQLBot:开源自然语言转SQL智能助手原理与实践

SQLBot是 DataEase 团队开源的自然语言转 SQL 智能助手,致力于让非技术用户也能通过自然语言与数据库对话,自动生成 SQL 查询,实现自助数据分析、智能BI问答、报表生成等场景。SQLBot 结合了大语言模型(LLM)、数据库元数据解析、SQL解析与执行等多项技术,具备强大的多数据库适配能力和灵活的扩展性。降低数据分析门槛,让业务人员无需掌握SQL即可获取数据洞察支持多种数据库类型,适应企业多样化数据环境提供可扩展的API和插件机制,便于集成到各类BI、数据平台和业务系统。

kakaZhui的博客 829

智能车图像处理21-进阶篇13--正入十字补线2

这篇文章主要的正入十字补线与1基本相同,主要防止图像中双十字的问题。

taiyuezyh的博客 2033

【RocketMQ】一分钟了解RocketMQ

RocketMQ 是一个开源的分布式消息中间件,由阿里巴巴开发并贡献给 Apache 软件基金会。它主要用于高吞吐量、低延迟的消息传递需求。RocketMQ 的优点和功能是比较多的,以下是 一些主要特点和功能:高吞吐量和低延迟:RocketMQ 设计用于处理大量的消息,并提供低延迟的消息传递服务,适合需要高性能的场景。分布式架构:RocketMQ 使用分布式架构来支持大规模的消息传递。它可以水平扩展,以处理更大的数据量和更高的并发需求。

2302_81153890的博客 1192

手把手教你学Simulink——基于Simulink的输入输出线性化精确转矩控制

由于IOFL控制律中实时引入了当前状态的反馈(id​,iq​,ωe​),电感的变化被非线性项自动补偿,转矩仅出现微小幅度的波动(< 2%),展现出极强的参数鲁棒性。:电压方程中的耦合项(ωe​Lq​iq​和 −ωe​Ld​id​)仅通过前馈补偿,当转速 ωe​较高时,微小的前馈误差会导致显著的d-q轴电流交叉耦合;其中,ud​,uq​为定子电压,id​,iq​为定子电流,Rs​为定子电阻,Ls​为定子电感,ωe​为电角速度,ψf​为永磁体磁链,p为极对数。(步长 Ts​=10μs,即100ns?

MHD0815的博客 85

从数据存储分析RocketMQ的高性能设计

RocketMQ的高性能设计主要体现在三个方面,数据存储设计,动态伸缩能力,消息投递设计。动态伸缩主要体现在队列扩容和集群扩容的能力,消息投递主要体现在其长轮询设计(和nacos配置中心的长轮询请求很像,可以去那篇看看,主要是避免了push模式对服务端的压力和pull模式对网络资源的浪费等缺陷)。本篇主要是看数据存储方面的设计。.........

qq_24567113的博客 923

FC7300 Clock介绍

FC7300的时钟架构包括一个高级时钟图和内部时钟需求。它有5个CMU,使用SIRC监控FIRC/SOSC/FOSC,并使用FIRC监控SIRC。此外,CMU4还使用FOSC监Slow Clock。

舊梦的博客 327

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

RocketMQ设计思路

RocketMQ设计思路 一. 概述 RocketMQ作为一款高性能消息中间件,其核心优势是可靠的消息存储、消息发送的高性能与低延迟、强大的消息堆积能力与消息处理能力、严格的顺序消息模式等。RocketMQ的另一个核心思想是懂得取舍。软件设计不可能做到面面俱到,消息中间件的理想状态是一条消息能且只能被消费一次,但要做到这一点,必然需要牺牲性能。RocketMQ的设计者解决这一难题的办法是不去解决,...

weixin_34452850的博客 1385

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

RocketMq详解:一、RocketMQ 介绍及基本概念

RocketMQ 是阿里巴巴开源的分布式消息中间件,现已成为 Apache 软件基金会的顶级项目。支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。它里面有几个区别于标准消息中件间的概念,如Group、Topic、Queue等。系统组成则由Producer、Consumer、Broker、NameServer等组件组成。

zhiyikeji的博客 2万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: 简单易懂的HashMap使用指南:从入门到精通
下一篇: 全网最新上线!【来自于阿里】号称Java八股文天花板,首次开源!
程序员职业指南
博客等级 码龄4年 2136粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值