性能文章>【全网首发】关于RocketMQ Producer某个性能优化点的分析>

【全网首发】关于RocketMQ Producer某个性能优化点的分析原创

281926

背景介绍

在上一篇文章【一次RocketMQ ons Bug导致消息不断堆积到重试队列的案例分析】,我们有提到为了优化Producer性能问题对Pandora进行了升级,升级后出现了问题。下面我们对Producer的这个优化点进行下分析记录。

问题描述

SLB(LVS+TEngine)在云平台的重要性不言而喻,随着应用规模不断增大,LVS节点单核CPU使用率有达到70%的情况,经过排查发现LVS集群CPS(每秒新建连接数)实际水位已经达到了逻辑容量的2倍以上,而其中MQ Broker VIP实例的CPS占比超过了80%,即MQ客户端存在大量的短连接。

分析过程

MQ Producer到MQ Broker的流量链路

MQ Broker通过SLB将VIP暴露出去(即ECS访问Broker需要经过SLB),下面简单了解下VPC物理网络及ECS与SLB之间的拓扑链路。

VPC物理网络示意图

image.png
SLB在图的右侧,向上联接LSW;
ECS在图的左下侧,是运行在宿主机NC上的虚拟机,宿主机NC向上联接ASW。

同机房ECS到SLB网络链路拓扑示意图

image.png
左边是运行在宿主机NC上的ECS,右边是SLB集群。
从ECS访问SLB的链路大致需要经过ASW、PSW、DSW、MC及LSW。

Producer init

为了便于表达和理解,我们只关注与该问题有关的部分逻辑。
image.png

  1. 第一步初始化DefaultMQProducer(继承了ClientConfig)实例四个字段(定义在ClientConfig中),由于ons sdk没有为这四个字段提供修改的接口,四个字段运行时的值就是图上的默认值;
  2. 第二步初始化DefaultMQProducerImpl实例(其中一个入参是DefaultMQProducer实例)
  3. 第三步初始化MQFaultStrategy,代码如图:image.png
  4. 第四步初始化MQFaultStrategy实例字段:startDetectorEnable=true,sendLatencyFaultEnable=true
  5. 第五步初始化MQFaultStrategy实例属性latencyFaultTolerance,设置latencyFaultTolerance属性值:latencyFaultTolerance.detectTimeout=200,latencyFaultTolerance.detectInterval=2000
  6. 第六步初始化latencyFaultTolerance实例线程池属性,用于后面探活image.png

arthas vmtool

查看运行时四个字段的值:
image.png

Producer start

为了便于表达和理解,我们只关注与该问题有关的部分逻辑。
image.png

  1. 第一步梦想开始的地方
  2. 第二步默认startDetectorEnable=true,启动探活!image.png
  3. 第三步默认sendLatencyFaultEnable=true、startDetectorEnable=trueimage.png
  4. 第四步启动定时探活线程image.png

Producer detect

为了便于表达和理解,我们只关注与该问题有关的部分逻辑。
image.png

arthas watch

image.png

总结

当一个服务调用另外一个服务的时候,总是会出现各种各样的状况,合适的容错机制是系统稳定性的重要保障。

点赞收藏
大禹的足迹

在阿里搬了几年砖的大龄码农,头条号:大禹的足迹

请先登录,查看2条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

技术分享 | 幽灵攻击与编译器中的消减方法介绍

技术分享 | 幽灵攻击与编译器中的消减方法介绍

嵌入式linux-CPU性能优化小记

嵌入式linux-CPU性能优化小记

【全网首发】聊一聊 Tomcat 启动速度慢背后的真相

【全网首发】聊一聊 Tomcat 启动速度慢背后的真相

【全网首发】MQ-消息堆积-JDK Bug导致线程阻塞案例分析

【全网首发】MQ-消息堆积-JDK Bug导致线程阻塞案例分析

【全网首发】不经意的两行代码把CPU使用率干到了90%+

【全网首发】不经意的两行代码把CPU使用率干到了90%+

如何修改 Nginx 源码实现 worker 进程隔离

如何修改 Nginx 源码实现 worker 进程隔离

6
2