RocketMQ发送消息还有这种坑?遇到SYSTEM_BUSY不重试?

这里是weihubeats ,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党

RocketMQ版本

  • 5.1.0

背景

最近线上的RocketMQ集群遇到了如下问题,业务方的小伙伴反馈问题,说出现了

less 复制代码
MQBrokerException:CODE:2DESC:[TIMEOUT_CLEAN_QUEUE]broker busy,start flow control for a while,period in queue

相关的错误导致发送消息失败。自信看过源码的我马上回复了别怕会重试

结果业务方的小伙伴马上回复说重试好像也没有成功,被啪啪打脸

带着这个疑问我又去查看了源码

消息发送失败重试

啪很快的就找到了DefaultMQProducerImpl这个类,然后找到了sendDefaultImpl这个发送消息的实现类

并在此找到了重试的关键代码

java 复制代码
if (this.defaultMQProducer.getRetryResponseCodes().contains(e.getResponseCode()))

可以看到这里只有是this.defaultMQProducer.getRetryResponseCodes()方法里面的code才会重试,我们看看具体哪些cde

java 复制代码
        ResponseCode.TOPIC_NOT_EXIST,
        ResponseCode.SERVICE_NOT_AVAILABLE,
        ResponseCode.SYSTEM_ERROR,
        ResponseCode.NO_PERMISSION,
        ResponseCode.NO_BUYER_ID,
        ResponseCode.NOT_IN_CURRENT_UNIT

看着挺正常的,那咋没重试呢

broker快速失败

知道了哪些错误才会重试就好解决问题了,我们去看看我broker快速失败返回的是什么状态码

arduino 复制代码
public static final int SYSTEM_BUSY = 2;

重试没有这个code

会是bug吗

心想可能是RocketMQ的bug?所以去社区看了下

实际这个问题早在社区有过很多的讨论,而且有相关pr 地址:

github.com/apache/rock...

其中RocketMQ的维护者大致的意思是 broker都已经非常忙了,你还要重试干嘛,让他歇息会不行吗?

但是实际的情况是如此吗?

线上我们会是多主架构,一个master broker压力大,另一个并不一定的

但是还有一个很神奇的问题,为啥商业版本就支持SYSTEM_BUSY的重试呢?

你这不是明显坑我们开源用户吗?那最终社区又做了一个妥协。 我们就是设计这里不支持重试,您非要重试就自己添加配置

所以就有了一个可以支持用手手动配置重试code的PR

配置重试code

这个PR目前已经被merge了相关的链接

github.com/apache/rock...

如果我们要支持SYSTEM_BUSY的重试可以做如下配置

java 复制代码
DefaultMQProducer producer = new DefaultMQProducer(PRODUCER_GROUP);
producer.setNamesrvAddr(DEFAULT_NAMESRVADDR);
producer.addRetryResponseCode(RemotingSysResponseCode.SYSTEM_BUSY);

问题圆满解决了?

问题圆满解决了吗?显然我们仅仅是解决了一个表面问题,我们还需要正对broker出现SYSTEM_BUSY做优化,具体如何优化那是下篇文章的事,关这篇文章什么事呢哈哈

好啦,今天的RocketMQ故事分享就到这了,我是weihubeats,觉得文章不错可以微信关注小奏技术

相关推荐
你的人类朋友1 小时前
😎 Node.js 应用多阶段构建 Dockerfile 详解
后端·docker·容器
小坏讲微服务1 小时前
Spring Boot整合Redis注解,实战Redis注解使用
spring boot·redis·分布式·后端·spring cloud·微服务·mybatis
橘子海全栈攻城狮2 小时前
【源码+文档+调试讲解】基于Spring Boot的考务管理系统设计与实现 085
java·spring boot·后端·spring
追逐时光者2 小时前
一个基于 .NET 8 + DDD 搭建的模块化微服务框架
后端·.net
William_cl2 小时前
C# ASP.NET MVC 数据验证实战:View 层双保险(Html.ValidationMessageFor + jQuery Validate)
后端·c#·asp.net·mvc
Access开发易登软件2 小时前
Access导出带图表的 HTML 报表:技术实现详解
数据库·后端·html·vba·导出·access
Archy_Wang_13 小时前
ASP.NET Core 应用的零停机部署策略
后端·servlet·asp.net
无责任此方_修行中3 小时前
一行代码的“法律陷阱”:开发者必须了解的开源许可证知识
前端·后端·开源
合作小小程序员小小店4 小时前
web网页开发,在线物流管理系统,基于Idea,html,css,jQuery,jsp,java,SSM,mysql
java·前端·后端·spring·intellij-idea·web
用户21411832636024 小时前
Claude Skills 新玩法:用 skill-creator 10 分钟搞定 Excel 报表自动化,职场人必学
后端