RocketMQ--MQBrokerException: CODE: 2 DESC: [TIMEOUT_CLEAN_QUEUE]broker busy

分析业务日志发现每天4点左右有少量错误,因Broker设置4点自动清理文件,推测问题是清理文件造成IO突增,导致写数据超时。已修改配置,并部署3:30 - 4:30的nmon监控,后续将分析是否有资源突增。

分析业务日志发现:每天4点左右会报少量的”[TIMEOUT_CLEAN_QUEUE]broker busy, start flow control for a while, period in queue: 206ms, size of queue: 5“错误

Broker设置每天自动清理文件的时间是4点中,和Timeout时间比较吻合 ,那么问题可能就是因为清理文件造成IO突增,导致写数据超时;

修改如下配置:

sendMessageThreadPoolNums=64
useReentrantLockWhenPutMessage=true
waitTimeMillsInSendQueue=600

并部署了3:30~4:30之间的nmon监控,后续分析下nmon监控是否有IO、Cpu等资源的突增。

### 配置 RocketMQ Producer 的最佳实践 在配置 RocketMQ 生产者的参数时,需要综合考虑性能、可靠性以及业务需求。以下是关于 NameServer 地址、Producer 组名、消息发送超时时间和失败重试次数的具体说明。 #### 1. **NameServer 地址** 名字服务器(NameServer)是 RocketMQ 中的核心组件之一,负责管理 Broker 节点的信息并提供路由查询功能。为了确保生产者能够正常连接到集群中的 Brokers,需正确设置 `namesrvAddr` 参数。 ```java producer.setNamesrvAddr("rocketmqOS:9876"); ``` 如果存在多个 NameServers,则可以使用分号分割的形式指定地址列表[^2]。 #### 2. **Producer 组名** 每个生产者实例都需要分配唯一的组名以便于管理和区分不同的业务场景。建议遵循一定的命名规范以提高可维护性和识别度。 ```java DefaultMQProducer producer = new DefaultMQProducer("pg_example_group"); ``` 这里 `"pg_example_group"` 是自定义的组名,应避免与其他已有组冲突[^4]。 #### 3. **消息发送超时时间** 发送消息过程中可能因网络延迟或其他原因未能及时完成操作,因此合理设定超时阈值至关重要。通过调整 `sendMsgTimeout` 属性控制单次尝试的最大等待时限: ```java producer.setSendMsgTimeout(5000); // 单位毫秒,默认为3000ms即3秒 ``` 将此值设得过低可能导致频繁触发重试机制从而增加系统负担;反之过高则延长整体响应周期影响用户体验。 #### 4. **失败重试次数** 当初次尝试向目标 Queue/Broker 提交数据未果时,允许一定范围内的自动再提交行为直至成功或者超出限定额度为止。可以通过如下方式分别针对同步与异步模式下的错误情况进行独立定制化处理: - 同步发送失败重试次数 ```java producer.setRetryTimesWhenSendFailed(3); ``` - 异步发送失败重试次数 默认情况下两者均为两次,可根据实际需求灵活修改上述数值[^1]。 此外需要注意的是,在每次后续努力之前都会随机选取一个新的目的地而非简单重复原路径,以此提升成功率的同时减少局部热点现象的发生几率。 ```java // 完整示例代码 public class RocketMQProducerConfig { public static void main(String[] args) throws Exception { // 实例化一个生产者对象,并传入所属的Producer Group名称 DefaultMQProducer producer = new DefaultMQProducer("example_producer_group"); // 设置NameServer地址信息 producer.setNamesrvAddr("localhost:9876"); // 自定义同步发送失败后的最大重试次数 producer.setRetryTimesWhenSendFailed(3); // 设定每条消息发送过程中的最长允许耗时 producer.setSendMsgTimeout(5000); // 初始化启动生产者 producer.start(); System.out.println("Producer has been started."); // 关闭资源释放 producer.shutdown(); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值