当我向经纪人发送消息时,偶尔会发生此异常。
MQBrokerException: CODE: 2 DESC: [TIMEOUT_CLEAN_QUEUE]broker busy, start flow control for a while
这意味着经纪人太忙(当tps> 1,5000时)处理这么多的发送消息请求。 造成这种情况的最不可能的原因是什么?磁盘,CPU或其他东西?我该如何解决?
答案 0 :(得分:0)
有很多可能的方法。
根本原因是,有些消息已经等待了很长时间而没有工作线程处理它们,rocketmq会触发快速故障。
以下是原因:
太多线程正在工作,并且它们处理存储消息的速度非常慢,这使得缓存请求超时。
自己花费很长时间处理邮件存储的工作。
这可能是因为:
2.1存储消息很忙,尤其是在使用SYNC_FLUSH
时。
2.2使用SYNC_MASTER
时,将消息同步到从属设备需要很长时间。
答案 1 :(得分:0)
在 你可以看到 /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的建议并检查您的代码。