❗故障表现:

报价队列无法处理

🗣️故障原因:

初步排查,消费者全部断开,没有在线的消费者,生产者也无法往RocketMQ集群发送消息,导致严重的队列堆积问题

阿里云控制台截图

page1.png

⚠️ 报错日志

4:21

prod-c51614077061steam-trade-bootlevel:ERRORlocation:com.xingchao.steam.trade.web.interceptor.GlobalExceptionHandler.defaultExceptionHandler(GlobalExceptionHandler.java:35)log:2021-02-23 18:44:21,871 ERROR [http-nio2-8088-exec-124] [ac140d90-klhuklux-191292] [steam-trade-boot] c.x.s.t.w.i.GlobalExceptionHandler - uri=/trade-buy/v1/create, params=access-token=cba0b12acf3b4fbd9675bc460f895700&ios_version_code=300140, method=POST, platform=2, device=3, deviceId=iPhone-CF5EC4BA-DB52-4FE2-BE45-5EED36309D04com.aliyun.openservices.ons.api.exception.ONSClientException: defaultMQProducer send exception        at com.aliyun.openservices.ons.api.impl.rocketmq.ProducerImpl.checkProducerException(ProducerImpl.java:238)        at com.aliyun.openservices.ons.api.impl.rocketmq.ProducerImpl.send(ProducerImpl.java:132)        at com.c5game.mq.send.MQSendClient.sendDelayMessage(MQSendClient.java:45)        at com.xingchao.steam.trade.service.mq.producer.RocketProducer.sendOrderDelay(RocketProducer.java:53)        at com.xingchao.steam.trade.service.mq.producer.RocketProducer.sendOrderDelayDefault(RocketProducer.java:40)        at com.xingchao.steam.trade.service.component.order.TradeBuyComponent.createTradeOrderAsset(TradeBuyComponent.java:709)        at com.xingchao.steam.trade.service.component.order.TradeBuyComponent.createOrder(TradeBuyComponent.java:727)        at com.xingchao.steam.trade.service.component.order.TradeBuyComponent$FastClassBySpringCGLIB$$1f2afe5.invoke()        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:684)        at com.xingchao.steam.trade.service.component.order.TradeBuyComponentEnhancerBySpringCGLIB$$dd8876ee.createOrder()        at com.xingchao.steam.trade.service.biz.impl.TradeBuyOrderServiceImpl.createOrder(TradeBuyOrderServiceImpl.java:107)

🙏临时解决方案

当时重新发布应用,RocketMQ客户端重新连接上RocketMQ服务,消息可以正常生产消费,故障影响的报价逐步正常

👏彻底解决方案

  1. 根据故障表现,推测为阿里云RocketMQ集群出现网络波动,导致客户端断开连接,但是客户端没有重连机制或者存在bug,不会重新连接上服务器

  2. 我们使用的SDK版本为1.7.9.Final,推出时间为2019.1,相对与现在(2021.3)已经很长时间了,查看此SDK版本记录,https://help.aliyun.com/document_detail/114448.html,在1.8.0.Final的版本说明中,出现问题修复

    • 修复自动重试逻辑(默认重试三次),该逻辑适用于消息从生产端同步发送至实例化后新建实例下的Topic失败的场景。
  3. 咨询阿里云工程师求证,得知的确有bug

    page1.png

  4. 接下来就是升级版本,进行c5game-mq-starter的升级与测试

    1. 升级到最新的sdk版本
    2. 去除没有使用的事务消息功能
    3. 增加顺序消息生产与消费功能

🤔反思

  1. 定期升级依赖是必须的,需要落实到制度中去
  2. 需要规划出时间进行非功能的迭代升级