当我向代理发送消息时,偶尔会发生此异常。
MQBrokerException: CODE: 2 DESC: [TIMEOUT_CLEAN_QUEUE]broker busy, start flow control for a while
这意味着代理太忙(当 tps>1,5000 时)无法处理如此多的发送消息请求。造成这种情况的最不可能的原因是什么?磁盘,cpu或其他东西?我该如何解决?
当我向代理发送消息时,偶尔会发生此异常。
MQBrokerException: CODE: 2 DESC: [TIMEOUT_CLEAN_QUEUE]broker busy, start flow control for a while
这意味着代理太忙(当 tps>1,5000 时)无法处理如此多的发送消息请求。造成这种情况的最不可能的原因是什么?磁盘,cpu或其他东西?我该如何解决?
有很多可能的方法。
根本原因是,有些消息等待了很长时间,没有工作线程处理它们,rocketmq会触发快速失败。
所以原因如下:
太多线程正在工作,并且它们处理存储消息的速度非常慢,这使得缓存请求超时。
它自己花费很长时间来处理消息存储的作业。
这可能是因为:
2.1 存储消息很忙,尤其是在SYNC_FLUSH
使用的时候。
2.2 使用同步消息到slave需要很长时间SYNC_MASTER
。
在 /broker/src/main/java/org/apache/rocketmq/broker/latency/BrokerFastFailure.java你可以看到:
final long behind = System.currentTimeMillis() - rt.getCreateTimestamp();
if (behind >= this.brokerController.getBrokerConfig().getWaitTimeMillsInSendQueue()) {
if (this.brokerController.getSendThreadPoolQueue().remove(runnable)) {
rt.setStopRun(true);
rt.returnResponse(RemotingSysResponseCode.SYSTEM_BUSY, String.format("[TIMEOUT_CLEAN_QUEUE]broker busy, start flow control for a while, period in queue: %sms, size of queue: %d", behind, this.brokerController.getSendThreadPoolQueue().size()));
}
}
在common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java中,getWaitTimeMillsInSendQueue()方法返回
public long getWaitTimeMillsInSendQueue() {
return waitTimeMillsInSendQueue;
}
waitTimeMillsInSendQueue的默认值为200,因此您可以将其设置得更大以使队列等待更长的时间。但如果你想彻底解决问题,你应该听从 Jaskey 的建议并检查你的代码。