RocketMQ消费者全部离线故障

Jimmy Lee

技术分享|Feb 23, 2021|Last edited: 2022-7-24|
icon
Update time
Jul 24, 2022 08:13 AM
Internal status
password
原创

❗故障表现:

报价队列无法处理

🗣️故障原因:

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

阿里云控制台截图

notion image

⚠️ 报错日志

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(<generated>)        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.TradeBuyComponent$$EnhancerBySpringCGLIB$$dd8876ee.createOrder(<generated>)        at com.xingchao.steam.trade.service.biz.impl.TradeBuyOrderServiceImpl.createOrder(TradeBuyOrderServiceImpl.java:107)

🙏临时解决方案

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

👏彻底解决方案

  1. 根据故障表现,推测为阿里云RocketMQ集群出现网络波动,导致客户端断开连接,但是客户端没有重连机制或者存在bug,不会重新连接上服务器
  1. 我们使用的SDK版本为1.7.9.Final,推出时间为2019.1,相对与现在(2021.3)已经很长时间了,查看此SDK版本记录,https://help.aliyun.com/document_detail/114448.html,在1.8.0.Final的版本说明中,出现问题修复
      • 修复自动重试逻辑(默认重试三次),该逻辑适用于消息从生产端同步发送至实例化后新建实例下的Topic失败的场景。
  1. 咨询阿里云工程师求证,得知的确有bug
    1. notion image
  1. 接下来就是升级版本,进行c5game-mq-starter的升级与测试
    1. 升级到最新的sdk版本
    2. 去除没有使用的事务消息功能
    3. 增加顺序消息生产与消费功能

🤔反思

  1. 定期升级依赖是必须的,需要落实到制度中去
  1. 需要规划出时间进行非功能的迭代升级
 
致谢:
💡
欢迎您在底部评论区留言,一起交流~
 
 

开始订阅我的关于终生学习, 生产力以及知识管理的文章. 订阅后, 您将收到我的精选文章.

©2014-2024 Jimmy Lee. All rights reserved. 公众号: 技术管理方法论
Powered By My Lovely Children