Apache RocketMQ 4.9.1 高性能优化之路(下)

简介: Apache RocketMQ 4.9.1 高性能优化之路(下)

image.png


MessageDecoder 类中的下面这段代码:


public static String messageProperties2String(Map<String, String> properties) {
     StringBuilder sb = new StringBuilder();
     if (properties != null) {
         for (final Map.Entry<String, String> entry : properties.entrySet()) {
             final String name = entry.getKey();
             final String value = entry.getValue();
             if (value == null) {
                 continue;
             }
             sb.append(name);
             sb.append(NAME_VALUE_SEPARATOR);
             sb.append(value);
             sb.append(PROPERTY_SEPARATOR);
         }
     }
     return sb.toString();
 }


如果是业务代码,这里看起来似乎没有什么问题。但在 TPS 很高的场景下, StringBuilder 默认长度是 16,处理一个正常的消息,至少会内部扩展 2 次,白白产生 2 个对象和 2 次数组复制。所以优化方案就是先算好需要的长度,创建 StringBuffer 的时候直接就指定好。


这个类中的 string2messageProperties 也进行了优化,用自己的解析代替了 split 调用。通过 jmh 进行一下测试,结果如下:


image.png


可以看出有了很大的提高。


关于消息属性,之前的程序还有一个问题是把一些不需要的属性也写到了 CommitLog 里面(或者也可以说是把不相关的东西放到了消息属性里面)。比如 wait=true 这个属性,实际上是在消息处理过程中才用的,不需要持久化,所以这次就想办法把它从 CommitLog 中删掉了。遗憾的是没有一个统一的地方可以一劳永逸的删掉这个属性,本次只针对普通消息进行了删除。删掉这个属性,每个消息的存储占用会减少 10 个字节,对于小消息来说,还是挺可观的。


image.png


RocketMQ 的通信协议定义了各种指令,它们的 Header 各不相同,共用了一个通用的解析方法,基于反射来解析和设置消息 Header。


这里简单的针对消息生产的指令,不再使用共同的这个解析器,而是简单粗暴的直接一个一个去 set 每一个属性,这样这个方法获得了大约 4 倍性能的提升。


image.png


现在,我们针对本次优化的成果,进行一次分布式的性能测试。


我们使用 2 台物理机部署为 Master/Slaver 模式,同步复制,异步刷盘,其它参数均用默认,分区数设置为 18。然后用另外 6 台服务器作为 client 同时生产和消费,每个生产者启动 100 个线程同步发送,消息体约 300 字节。


服务器硬件配置为 2*Xeon(R) Gold 5218,一共 32 核心 64 线程,128G 内存,Nvme SSD,client 和 server 的 ping 延迟是 0.06ms。


我们还派出了一个神秘的参赛选手,最终待测试的版本包括以下 4 个:
A、4.9.0 版本,使用默认参数。B、4.9.0 版本,按上面的修改 D 进行参数优化。C、4.9.1 版本,默认参数。D、快手内部某版本。


结果如下:


image.png


即使按进行过参数优化的 4.9.0 版本作为基线,4.9.1 版本也胜出了 28%,快手内部版本则胜出了 40%。


需要说明的是:
1、由于 OS 虚拟内存管理是个很复杂的机制,写 mmap 的 Byte Buffer 的速度也会存在抖动,所以测试的结果也存在波动。2、内核参数会对OS的内存性能有很大影响,不同硬件、内核可能会有不同的表现,RocketMQ/bin 目录下的 os.sh 可以作为一个内核参数调整的参考。3、Nvme SSD 不会是性能瓶颈所在,通过在一个物理机上安装多个 Broker(改一下端口号和文件存储路径),可以进一步提升 TPS,比如在本次测试的场景下,还是这两台物理机,4.9.1 版本每个物理机上 4 个 Broker 混布可以把总 TPS 提升到 60 多万。4、压测的时候 RocketMQ 自身的 benchmark 程序自己也会存在瓶颈,需要多实例运行得出 Broker 的性能,本次测试没有使用使用这个程序。


image.png


性能优化是个长期工作,本批次的优化主要集中在 Broker 的消息生产链路。其他地方也有很多可以优化的点,包括:

  • 消费链路
  • Client 的对象创建、数据复制、线程切换等
  • 网络通信和序列化
  • benchmark 程序

即便是生产链路也还有很多可以继续优化的地方,我们会继续推进这个工作,也欢迎大家一起来贡献。


作者介绍:
(1)黄理,当前就职于快手,架构师,Apache RocketMQ Commiter,多年 Java 架构和开发经验,个人技术爱好是性能优化方向。(2)胡宗棠,当前就职于中国移动云能力中心,云原生领域技术专家,Apache RocketMQ Committer,SOFAJRaft Committer,Alibaba/Nacos Committer,熟悉分布式消息队列、API 网关和分布式事务等中间件设计原理、架构以及各种应用场景,具有丰富高性能、高可用和高并发经验;

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
2月前
|
消息中间件 监控 大数据
优化Apache Kafka性能:最佳实践与调优策略
【10月更文挑战第24天】作为一名已经对Apache Kafka有所了解并有实际使用经验的开发者,我深知在大数据处理和实时数据流传输中,Kafka的重要性不言而喻。然而,在面对日益增长的数据量和业务需求时,如何保证系统的高性能和稳定性成为了摆在我们面前的一个挑战。本文将从我的个人视角出发,分享一些关于如何通过合理的配置和调优来提高Kafka性能的经验和建议。
107 4
|
6月前
|
消息中间件 人工智能 Apache
Apache RocketMQ 中文社区全新升级!
RocketMQ 中文社区升级发布只是起点,我们将持续优化体验细节,推出更多功能和服务,更重要的是提供更多全面、深度、高质量的内容。
628 19
|
9天前
|
消息中间件 存储 Apache
恭喜 Apache RocketMQ、Apache Seata 荣获 2024 开源创新榜单“年度开源项目”
近日,以“新纪天工、开物焕彩——致敬开源的力量”为活动主题的“重大科技成就发布会(首场)”在国家科技传播中心成功举办,并隆重揭晓了 2024 开源创新榜单,旨在致敬中国开源力量,传播推广开源科技成就,营造中国开源创新生态。2024 年开源创新榜单由中国科协科学技术传播中心、中国计算机学会、中国通信学会、中国科学院软件研究所共同主办,中国开发者社区承办,以王怀民院士为首组建评审委员会,进行研讨评审,面向中国开源行业领域,遴选具有创新性、贡献度和影响力的开源项目、社区、应用场景与开源事件。在评审出的 10 个年度开源项目中,Apache RocketMQ、Apache Seata 成功入选。
|
5月前
|
消息中间件 监控 数据挖掘
基于RabbitMQ与Apache Flink构建实时分析系统
【8月更文第28天】本文将介绍如何利用RabbitMQ作为数据源,结合Apache Flink进行实时数据分析。我们将构建一个简单的实时分析系统,该系统能够接收来自不同来源的数据,对数据进行实时处理,并将结果输出到另一个队列或存储系统中。
325 2
|
7月前
|
消息中间件 安全 API
《阿里云产品四月刊》—Apache RocketMQ ACL 2.0 全新升级(1)
阿里云瑶池数据库云原生化和一体化产品能力升级,多款产品更新迭代
322 1
《阿里云产品四月刊》—Apache RocketMQ ACL 2.0 全新升级(1)
|
2月前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
2月前
|
SQL 存储 数据处理
兼顾高性能与低成本,浅析 Apache Doris 异步物化视图原理及典型场景
Apache Doris 物化视图进行了支持。**早期版本中,Doris 支持同步物化视图;从 2.1 版本开始,正式引入异步物化视图,[并在 3.0 版本中完善了这一功能](https://www.selectdb.com/blog/1058)。**
|
3月前
|
SQL 分布式计算 NoSQL
大数据-164 Apache Kylin Cube优化 案例1 定义衍生维度与对比 超详细
大数据-164 Apache Kylin Cube优化 案例1 定义衍生维度与对比 超详细
45 1
大数据-164 Apache Kylin Cube优化 案例1 定义衍生维度与对比 超详细
|
3月前
|
存储 数据挖掘 数据处理
Apache Paimon 是一款高性能的数据湖框架,支持流式和批处理,适用于实时数据分析
【10月更文挑战第8天】随着数据湖技术的发展,越来越多企业开始利用这一技术优化数据处理。Apache Paimon 是一款高性能的数据湖框架,支持流式和批处理,适用于实时数据分析。本文分享了巴别时代在构建基于 Paimon 的 Streaming Lakehouse 的探索和实践经验,包括示例代码和实际应用中的优势与挑战。
146 1
|
3月前
|
存储 大数据 分布式数据库
大数据-165 Apache Kylin Cube优化 案例 2 定义衍生维度及对比 & 聚合组 & RowKeys
大数据-165 Apache Kylin Cube优化 案例 2 定义衍生维度及对比 & 聚合组 & RowKeys
56 1

推荐镜像

更多