背景介绍
在上一篇文章【一次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物理网络示意图
SLB在图的右侧,向上联接LSW;
ECS在图的左下侧,是运行在宿主机NC上的虚拟机,宿主机NC向上联接ASW。
同机房ECS到SLB网络链路拓扑示意图
左边是运行在宿主机NC上的ECS,右边是SLB集群。
从ECS访问SLB的链路大致需要经过ASW、PSW、DSW、MC及LSW。
Producer init
为了便于表达和理解,我们只关注与该问题有关的部分逻辑。
- 第一步初始化DefaultMQProducer(继承了ClientConfig)实例四个字段(定义在ClientConfig中),由于ons sdk没有为这四个字段提供修改的接口,四个字段运行时的值就是图上的默认值;
- 第二步初始化DefaultMQProducerImpl实例(其中一个入参是DefaultMQProducer实例)
- 第三步初始化MQFaultStrategy,代码如图:
- 第四步初始化MQFaultStrategy实例字段:startDetectorEnable=true,sendLatencyFaultEnable=true
- 第五步初始化MQFaultStrategy实例属性latencyFaultTolerance,设置latencyFaultTolerance属性值:latencyFaultTolerance.detectTimeout=200,latencyFaultTolerance.detectInterval=2000
- 第六步初始化latencyFaultTolerance实例线程池属性,用于后面探活
arthas vmtool
查看运行时四个字段的值:
Producer start
为了便于表达和理解,我们只关注与该问题有关的部分逻辑。
- 第一步梦想开始的地方
- 第二步默认startDetectorEnable=true,启动探活!
- 第三步默认sendLatencyFaultEnable=true、startDetectorEnable=true
- 第四步启动定时探活线程
Producer detect
为了便于表达和理解,我们只关注与该问题有关的部分逻辑。
arthas watch
总结
当一个服务调用另外一个服务的时候,总是会出现各种各样的状况,合适的容错机制是系统稳定性的重要保障。