icon
Update time
Jul 24, 2022 08:13 AM
Internal status
password
原创
❗故障表现:
报价队列无法处理
🗣️故障原因:
初步排查,消费者全部断开,没有在线的消费者,生产者也无法往RocketMQ集群发送消息,导致严重的队列堆积问题
阿里云控制台截图
⚠️ 报错日志
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服务,消息可以正常生产消费,故障影响的报价逐步正常
👏彻底解决方案
- 根据故障表现,推测为阿里云RocketMQ集群出现网络波动,导致客户端断开连接,但是客户端没有重连机制或者存在bug,不会重新连接上服务器
- 我们使用的SDK版本为1.7.9.Final,推出时间为2019.1,相对与现在(2021.3)已经很长时间了,查看此SDK版本记录,https://help.aliyun.com/document_detail/114448.html,在1.8.0.Final的版本说明中,出现问题修复
- 修复自动重试逻辑(默认重试三次),该逻辑适用于消息从生产端同步发送至实例化后新建实例下的Topic失败的场景。
- 咨询阿里云工程师求证,得知的确有bug
- 接下来就是升级版本,进行c5game-mq-starter的升级与测试
- 升级到最新的sdk版本
- 去除没有使用的事务消息功能
- 增加顺序消息生产与消费功能
🤔反思
- 定期升级依赖是必须的,需要落实到制度中去
- 需要规划出时间进行非功能的迭代升级
致谢:
欢迎您在底部评论区留言,一起交流~