关于RocketMQ那些你可能不知道的性能优化!

RocketMQ代码实战(二):RocketMQ发送带Tag的消息 在代码实战:使用rocketmq-spring-boot-starter发送和消费消息 讲解了使用rocketmq-spring-boot-starter快速搭建生产者消费者服务,本次继续讲解 发送带Tag的消息 Tag(标签)可以看作子主题,它是消息的第二级类型。同一业务模块不同目的的消息就可以用相同 Topic 而不同的 Tag来标识。比如交易消息又可以分为:交易创建消息、交易完成消息等,一条消息可以没有 Tag。 1.发送消息 @RestController public class Rock 阅读详情

RocketMQ Binder集成

RocketMQ也是根据Spring Cloud Stream的规范做了相应的自己的实现,RocketMQ 由于对应的Binder类实现,可以说是集成了消息发送,消息订阅。为了方便大家去阅读源码,我简单的跟大家说一下。

集成消息发送

RocketMQMessageChannelBinder类根据规范完成RocketMQMessageHandler的创建和初始化,RocketMQMessageHandler 是消息处理器MessageHandler的具体实现,其主要作用是转化消息格式并且发送消息,此类中持有RocketMQTemplate对象,RocketMQTemplate是对RocketMQ客户端API的封装。

是不是已经开始有点晕了?

简单来说,这个handler是一个很关键的类,它就是包含消息发送的逻辑处理,解析Message对象头中的参数,调用上面说的RocketMQTemplate中不同的消息发送接口。无论你是发送的顺序消息,事物消息,定时消息还是普通消息,都是由Message对象头(Header)中的属性决定,在我们业务代码创建Message的时候去设置。

划重点咯,如果大家有兴趣,可以把RocketMQMessageHandler这个类当作一个入口,就可以很轻松看到整个消息发送的流程。

 

集成消息订阅

同样,由RocketMQMessageChannelBinder类根据协议完成RocketMQInboundChannelAdapter(简称adapter)的创建和初始化,顾名思义,这个adapter适配器需要适配Spring Framework中的重试和回调机制,它的作用是订阅消息并且转换消息格式。其中的RocketMQListenerBindingContainer对象是对RocketMQ客户端API的封装。

RocketMQ提供了两种消费模式,顺序消费和并发消费,不管是哪种消费模式,其对应的监听器收到消息后都会回调RocketMQListener。RocketMQListener 也是SpringBoot中已支持的RocketMQ组件,在adapter中创建和初始化RocketMQListener的实现类。上面两种消费模式的监听器在监听到消息的时候,会先回调RocketMQListener的onMessage()方法,然后在调用adapter父类中的sendMessage()方法将消息发送到DirectChannel。

以上就是RocketMQ Binder集成的大致过程,我们来总结一下:

  • Spring Cloud Stream 提供了简单易用的消息编程模型,内部是基于发布/订阅模型来实现的。

  • Spring Cloud Stream 的Binder提供标准协议,不同的消息中间件都可以按照标准协议接入。

  • Binder提供bindConsumer和bindProducer接口协议,分别用于构造生产者和消费者。

RocketMQ集群管理

在分布式服务(SOA)的架构中,我们是不允许任何中间件是单点的,服务发现机制也是必备的。咱们的服务实例会有多个,数量也是动态变化的,随时可能存在服务挂掉再重启的可能性。服务发现的意义就在于其提供的服务管理能力,服务调用方在注册中心获取服务提供的的信息,从而进行远程调用。

RocketMQ架构设计

说到RocketMQ的架构设计,就不得不说一下它和Kafka的渊源了。Kafka也是一款高性能的消息中间件,在大数据的场景中经常会使用,但是因为Kafka不支持消息失败重试,定时消息,事物消息,它的顺序消息也有明显的缺陷的,在复杂的业务场景下难以支撑。所以淘宝的中间件团队参考Kafka设计了RocketMQ,所以两者在概念上会有一点点相似。

我们常见的消息中间件,比如RocketMQ,Kafka,RabbitMQ等都是基于发布订阅模型,Producer把消息发送到消息服务器,也就是消息中间件,然后Consumer通过订阅来从消息服务器订阅自己想要的消息。在整个过程中,Producer和Consumer都是客户端,而消息服务器是服务端。客户端和服务端都需要通过注册中心来感知对方的存在。

下面我们就由一张图来看看RocketMQ的架构设计:

RocketMQ的架构主要分为四个部分,全部支持分布式集群部署:

  • Producer:消息发送者,主要负责把消息发送到Broker。

  • Consumer:消息消费者,主要负责从Broker订阅消费消息。

  • Broker:消息存储者,主要负责消息的存储,投递和查询,以及服务高可用的保障。

  • NameServer:服务管理者,主要负责管理Broker集群的路由信息。

多说一下,NameServer是一个简单的Topic路由注册中心,其角色类似于Dubbo中依赖的ZooKeeper,支持Broker的动态注册与发现,它主要由两个功能:

  • 服务注册:接收Broker集群的注册信息,保存下来作为路由信息的基本数据,还会提供心跳检测,检查Broker是否存活。

  • 路由信息管理:由于NameServer保存了Broker集群的路由信息。Producer和Comsumer通过NameServer可以知道Broker集群的路由信息,从而进行消息的投递与消费。

RocketMQ基本概念

说完了RocketMQ的架构设计,我们再来捋一捋它的基本概念,什么是Message,什么是Topic,什么又是Queue?

  • Message:消息,顾名思义,生产和消费数据的最小单位,每条消息必须属于一个Topic,RocketMQ中每条消息拥有一个唯一的MessageID,且可以携带具有业务表示的Key。

  • Topic:主题,表示的是一类消息的集合,每个主题都有若干条消息,我们可以试想一下发邮件的过程,多条邮件可以同属一个主题,只是标识出此邮件的分类信息。Topic是消息订阅的基本单位。

  • Queue:消息队列,组成Topic的最小单元,一个Topic可以有多个消息队列,Topic是逻辑上的概念,而Queue是物理存储,在Consumer消费Topic时底层实际拉取的是Queue的消息。试想我们一个类别的消息,可以有多个消息发送通道就可以理解啦。

  • Tag:为消息设置的标志,用于同一个主题下面区分不同类别消息,这个应该很好理解,比如同一个食物主题下,可以通过Tag来区分是菠萝还是黄瓜,可以根据不同的业务设置不同的Tag。

  • UserProperties:用户自定义的属性集合,属于Message的一部分。

  • ProducerGroup:同一类Producer的集合,这一类Producer发送同一类消息且发送的逻辑一致。值得一提的是,如果发送的是事物消息且发送者在发送消息后崩溃,则Broker会提醒同一个Group下的其他生产者实例以提交或回溯消费。

  • ConsumerGroup:同一类Consumer的集合,有生产者集合当然就有消费者集合啦,同样ConsumerGroup通常消费同一类消息且消费逻辑一致。消费者组使得在消费消息方面,实现负载均衡和容错变得更加容易,需要注意的是,同一消费者组下的消费者必须订阅同一个Topic。

为什么放弃Zookeeper选择NameServer

基本概念也说完啦,下面我们来简单聊一下,既然RocketMQ可以说是Kafka的改进,那为什么抛弃了Kafka使用的Zookeeper注册中心反而选择NameServer呢?

在Kafka中的服务注册与发现通常使用Zookeeper来完成的,RocketMQ其实早期也适用了Zookeeper来做集群的管理,但是后来放弃了转而使用自己开发的NameServer。

那为什么RocketMQ的团队会放弃Zookeeper,选择重复造轮子呢?

简单来说,在Kafka中,Master和Slave是在同一台Broker机器上,Broker机器上有多个分区,每个分区的Master/Slave身份是在运行的过程中通过选举出来的,Broker机器拥有双重身份,既有Master分区,也有Slave分区。

而在RocketMQ中呢,Master和Slave不在同一台Broker机器上,我们可以通过上面的架构图看出来,Broker的Master/Slave身份在Broker配置文件中事先定义好的,在Broker启动之前就已经定好了。

那这个差异会有什么问题呢?

Kafka的Master需要选举,而RocketMQ不需要。

问题其实就出在这个选举上,选举的原理就是少数服从多数,那么Zookeeper的选举机制就必须由Zookeeper集群中的多个实例共同完成,那么这样一来,集群中的多个实例必须相互通信。

当然通信也不是问题,那么如果集群中的实例很多,网络通信就会变得异常复杂且低效。

而NameServer的设计目标是让网络通信变得简单,从而使性能得到极大提升。

为了避免单点故障,NameServer也必须以集群的方式部署,但是集群中各个实例相互之间不会进行通信。NamerServer是无状态的,可以任意部署多个实例。Broker会向每一台NamerServer注册自己,因此每一个NameServer实例都可以保存一份完整的路由信息。值得提一下的是,NameServer与每一台Broker机器保持长连接,间隔30s从路由注册表中将故障机器移除,但不会通知Producer和Consumer。

那么问题来了,这样的条件下,Producer和Comsumer仍然从故障机器获取信息,Producer将消息发送到故障机器,而Comsumer订阅消息失败,如何处理?

其实RocketMQ为了简化NameServer的设计,这两个问题是在客户端来解决的,具体如何解决,后续我们聊高可用的时候,再来详细分析吧。

还有一个问题是,由于NamerServer之间不通信,在某个时刻,NameServer保存的路由信息可能不一致怎么办?

仔细想一下,其实这个问题对发送消息和消费消息不会有什么影响,且我们可以看出来,NameServer是CAP中的AP架构,对吗?

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

相关推荐

RocketMQ性能优化:全网最全的一篇

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

一只小星星 3749

SpringBoot下RocketMQListener如何发起onMessage方法(源码)

示例 通过注解方式监听, 指定了消息的类型, 会自动转换, 当获取到消息后会自动调用onMessage() @Component @RocketMQMessageListener(topic = "topic-A", consumerGroup = "group1") public class RocketMQListenerService implements RocketMQListener<String> { public void onMessage(String messag

跟心爱的人一起浪迹天涯 8081

RocketMQ性能优化【实战笔记】

目录 一、系统优化 1.最大文件数 2.系统参数调整 二、RocketMQ性能调优 1.开启异步刷盘 2.开启堆外内存设置 3.开启文件预热 4.开启Slave读权限 5.关闭堆内存据传输 一、系统优化 1.最大文件数 limits.conf 设置用户能打开的最大文件数 vim /etc/security/limits.conf # ...

qq_24058965的博客 2618

消息驱动的微服务-RocketMQ

一、安装RocketMQ 详见该手记:http://www.imooc.com/article/290089 二、搭建RocketMQ控制台 详见该手记:http://www.imooc.com/article/290092 三、Spring消息编程模型01-编写生产者 1.导入依赖 2.添加配置 3.最后直接在代码中使用即可: 4.在调用了getMemberInfo接口后,可在RocketMQ控制台界面查看到该条信息: 四、Spring消息编程模型02-编写消费者 1.前两步和第三节一致,只不过在

weixin_41997692的博客 950

消息轨迹性能优化:RocketMQ生产环境这样配置才不拖慢业务

本文深入探讨了RocketMQ生产环境中消息轨迹功能的性能优化策略。针对高并发场景下可能拖慢业务的问题,核心建议是采用专用轨迹Broker进行部署隔离,以彻底避免与业务消息竞争资源。文章详细分析了从线程池、批量发送参数到存储Topic配置的精细调优方法,并提供了客户端最佳实践与监控告警方案,旨在确保消息轨迹在提供清晰链路追踪的同时,对业务性能的影响降至最低。

moss5的博客 1406

华为网络实战:5分钟搞定OSPF+VRRP+MSTP多协议联动配置(附完整命令集)

本文深入解析了在企业网络中如何高效协同部署OSPF、VRRP和MSTP三大协议。通过一个典型的双核心网络案例,详细阐述了从规划、配置到验证的完整流程,重点强调了确保MSTP根桥与VRRP主设备一致的设计原则,以实现最优的二层与三层流量转发路径,并提供了完整的命令集和故障排查思路。

weixin_29251337的博客 153

聊聊RocketMQMessageListener的实现机制

本文主要研究一下RocketMQMessageListener的实现机制。

go4it 3444

利用OrthoFinder做泛基因家族聚类分析

这条命令会将 Arabidopsis_thaliana.TAIR10.59_longest_trans.pep.fa 文件中的所有序列ID,去掉ID中的空格后面的部分,只保留 > 后第一个空格之前的基因ID,并将结果保存在 An1.fasta 文件中。muscle 是一种常用的多序列比对工具,用于基因组或蛋白质序列的比对。基因家族(Gene family),是来源于同一个祖先,由一个基因通过基因重复而产生两个或更多的拷贝而构成的一组基因,它们在结构和功能上具有明显的相似性,编码相似的蛋白质产物。

qq_64400864的博客 2748

RocketMQ性能优化篇

通过本文的介绍,我们详细探讨了RocketMQ的性能测试方法和优化实践。性能测试是优化的基础,只有通过科学的测试方法,才能准确评估系统的性能瓶颈,并为优化提供依据。在优化实践中,我们从参数调优、硬件资源优化和网络优化三个方面进行了详细的讲解,并通过一个实战案例展示了如何将这些优化策略应用到实际项目中。在实际应用中,需要根据具体的业务需求和系统环境,灵活运用这些方法和策略,以实现最佳的性能优化效果。希望本文能够帮助Java技术专家更好地理解和应用RocketMQ的性能优化技巧,提升系统的整体性能和可靠性。

Jeremy程序员 1665

卡诺图化简法注意事项+竞争冒险知识点总结

今天反思以下卡诺图化简法中的注意事项。 卡诺图看起来简单,但如果不熟悉的话很容易出错,因此要对画圈的规则比较熟悉。

weixin_42415266的博客 1万+

ENVI 5.6保姆级教程:高分七号DLC影像从打开到融合的完整流程(附避坑指南)

本文详细介绍了ENVI 5.6处理高分七号DLC影像的完整流程,包括环境准备、数据解压、正射校正、图像融合等关键步骤。特别针对国产卫星数据处理的独特挑战,提供了实用的避坑指南和优化技巧,帮助用户高效完成光学影像的预处理和质量提升。

weixin_33269743的博客 382

【消息队列RocketMQ】四、RocketMQ 存储机制与性能优化

本文详细介绍了 RocketMQ 在 CentOS 7 下的存储机制,包括存储文件结构、消息读写原理,以及相关的配置文件修改和命令操作。同时,深入探讨了性能优化策略,从刷盘机制、文件存储、内存映射等多个方面进行分析。通过合理配置和优化,能够充分发挥 RocketMQ 的性能优势,满足不同业务场景的需求。

qq_58611691的博客 1734

反光柱定位算法实战03:VEnus代码解析和纯反光柱定位中的可改进方向

本文深入解析了开源框架VEnus的反光柱定位与建图实现流程,包括强度提取、聚类、数据关联、位姿优化等核心模块。同时指出其三大局限:匹配质量脆弱性、单一传感器依赖和地图扩展逻辑缺失,并提出改进方向:融合里程计/IMU数据、引入图优化后端、建立动态地图维护机制。该分析为基于反光柱的定位系统优化提供了实用参考,有助于提升工业场景下的定位鲁棒性和精确性。

Studying…… 520

【RocketMQ】RocketMq之CommitLog深入研究

这篇文章详细介绍了 RocketMQ 5.3.0 版本中 CommitLog 的存储结构、写入和查询流程,以及文件同步刷盘与异步刷盘机制。CommitLog 是 RocketMQ 存储消息元数据的核心组件,采用顺序写入和文件滚动机制,支持高性能写入。文章还分析了同步刷盘与异步刷盘的实现细节,以及 RocketMQ 在文件清理、索引构建和故障恢复方面的设计优势。

gorgor在码农 1906

【100%通过率】2023华为od机试C卷【围棋的气】Python 实现

围棋棋盘由纵横各19条线垂直相交组成,棋盘上一共19 x 19 = 361 个交点,对奔双方一方执白棋,一方执黑棋,落子时只能将棋子置于交点上。 “气”是围棋中很重要的一个概念,某个棋子有几口气,是指其上下左右方向四个相邻的交叉点中,有几个交叉点没有棋子,由此可知:

MISAYAONE的博客 1858

【FPGA教程案例55】深度学习案例2——基于FPGA的CNN卷积神经网络之ReLu激活层verilog实现

在本课程中,我们将对CNN的ReLu函数模块的FPGA实现做详细的介绍和学习。从仿真结果可知,通过Rule激活函数之后,小于的输入数据输出为0,否则输出是输入本身。,我们对CNN的基本原理有了初步认识。ReLu函数具备如下优缺点。按照课程1相似的操作方式。

FPGA/MATLAB学习教程/源码/项目合作开发 2692

11. RocketMQ性能优化

RocketMQ 性能优化 JVM 层面 STW 监控暂停 ​ rocketmq-console(最新源码移动了位置,rocketmq-dashbroad, 下载链接0. RockerMq安装有) 这个是官方提供了一个 WEB 项目,可以查看 rocketmq 数据和执行一些操作。但是这个监控界面又没有权限控制,并且还有一些消耗性能的查询操作,如果要提高性能,建议这个可以暂停。 ​ 一般的公司在运维方面会有专门的监控组件,如 zabbix 会做统一处理。 ​ 或者是简单的 shell 命令 ​ 监控

努力学习 2494

注意力机制与经典 CV 网络:PyTorch 实现与实战

注意力机制(SE/空间/CBAM/Non-Local)通过权重重标定让模型聚焦关键特征,经典 CNN(ResNet/DenseNet/FPN)提供了深层网络、特征复用和多尺度融合的基础骨架。建议先在 ResNet 上插入 SE 模块(通道注意力)做基线实验,再根据任务类型引入空间注意力(分割任务)或非局部注意力(视频任务)。CIFAR-10 数据集适合快速验证注意力模块的有效性,迁移到更大数据集时保持相同的结构设计思路即可。

FJN110的博客 62

RocketMQ原理—消息读写的性能优化

一.往CommitLog写入消息时,会通过顺序写内存 + 异步顺序刷磁盘来提升性能二.往ConsumeQueue写入消息时,会基于异步转发的写入机制来提升性能一.默认先写入OS的PageCache后就直接返回成功了,优化成内存级的顺序写这里会基于MappedFile机制来实现,将磁盘文件映射为一块OS的PageCache内存,让写文件等同于写内存。其中的亮点是基于OS的PageCache来写入数据,Broker的JVM进程崩溃(高概率)是不会导致PageCache的数据丢失的。

kfashfasf的博客 1014

Statistics and Machine Learning Toolbox

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

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

RocketMq高频面试题

先来看看大佬们的代码是怎么写的: 1、说说你们公司线上生产环境用的是什么消息中间件? 见【2、多个mq如何选型?】因为项目比较大,做了分布式系统,所有远程服务调用请求都是同步执行经常出问题,所以引入了mqqueue就是来源于数据结构的FIFO队列。而Topic是个抽象的概念,每个Topic底层对应N个queue,而数据也真实存在queue上的。不会,每条消息都会持久化到CommitLog中,每个Consumer连接到Broker后会维持消费进度信息,当有消息消费后只是当前Consumer的消费进度(Com

山路曲折盘旋,但毕竟朝着顶峰延伸 5922

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

RocketMQ 架构

集群的「中枢神经」,负责 Topic 元数据管理(如 Topic 分区分布、Broker 节点状态监控)。消息存储与流转的核心节点,负责消息的持久化、读写请求处理。消息生产者,负责将消息投递到指定的 Topic。消息消费者,从 Broker 拉取消息并处理。

qq_45801780的博客 1310

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

RocketMQ 性能优化与调优策略(一)

RocketMQ 性能优化与调优策略(一)

1302

RocketMQ原理—4.消息读写的性能优化

所以当ConsumerGroup的一个Consumer需要读取ConsumeQueue里的某逻辑偏移量offset位置的消息时,就会根据该消息的逻辑偏移量offset,去定位到ConsumeQueue磁盘文件中的位置((offset - 1) * 20字节)作为起始位置,然后再连续读取20字节即可,这样就可以快速地将消息读取出来。其中的亮点是基于OS的PageCache来写入数据,Broker的JVM进程崩溃(高概率)是不会导致PageCache的数据丢失的。这种情况发生的概率还是比较高的。

mjunz的博客 1769

RocketMQ生产消费实战与性能优化指南

分布式消息中间件是构建高并发系统的核心组件,通过异步解耦提升系统吞吐量。RocketMQ作为阿里开源的分布式消息队列,采用发布订阅模式实现消息的可靠传递,其核心原理包括消息存储、事务机制和负载均衡。在电商秒杀、金融交易等高并发场景中,RocketMQ能有效应对流量洪峰,保证数据最终一致性。本文基于Java环境,详细解析RocketMQ生产消费全流程,涵盖生产者组配置、同步/异步发送模式、消费者集群部署等关键技术点,并针对消息堆积、消费延迟等常见问题给出优化方案。通过合理设置sendMsgTimeout、pu

weixin_33938733的博客 390

RocketMQ的性能优化与调参

1.背景介绍 1. 背景介绍 RocketMQ是一个高性能、分布式、可靠的消息队列系统,由阿里巴巴开发。它广泛应用于分布式系统中的异步消息处理、解耦和削峰填谷等场景。RocketMQ的性能和可靠性对于分布式系统的稳定运行至关重要。因此,对于RocketMQ的性能优化和调参是非常重要的。 本文将从以下几个方面进行深入探讨: 核心概念与联系 核心算法原理和具体操作步骤以及数学模型公式详细讲解...

AI天才研究院 1731

RocketMQ消费优化

前言 消息团队一直致力于RocketMQ的性能优化,双十一前进行了低延时(毛刺)优化,保障了双十一万亿消息的流转如丝般顺滑,在2016年双十一种,MetaQ以接近万亿的消息总量支撑着全集团数千个应用,在系统解耦、削峰填谷、数据库同步、位点回滚消费等多种业务场景中,MetaQ都有精彩、稳定的表现。高可用低延迟,高并发抗堆积,2016双11的MetaQ真正做到了如丝般顺滑。 而最近通过对性能的持续...

Felix_阳的博客 4413
上一篇: 从小孩子(初学者)的角度,从用户的角度探究MySQL是怎样运行的,把MySQL讲明白了
下一篇: 系统总结MyBatis源码解析,从入门到源码
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值