2

当我向代理发送消息时,偶尔会发生此异常。

MQBrokerException: CODE: 2  DESC: [TIMEOUT_CLEAN_QUEUE]broker busy, start flow control for a while

这意味着代理太忙(当 tps>1,5000 时)无法处理如此多的发送消息请求。造成这种情况的最不可能的原因是什么?磁盘,cpu或其他东西?我该如何解决?

4

2 回答 2

2

有很多可能的方法。

根本原因是,有些消息等待了很长时间,没有工作线程处理它们,rocketmq会触发快速失败。

所以原因如下:

  1. 太多线程正在工作,并且它们处理存储消息的速度非常慢,这使得缓存请求超时。

  2. 它自己花费很长时间来处理消息存储的作业。

这可能是因为:

2.1 存储消息很忙,尤其是在SYNC_FLUSH使用的时候。

2.2 使用同步消息到slave需要很长时间SYNC_MASTER

于 2017-04-17T13:04:14.530 回答
2

/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 的建议并检查你的代码。

于 2017-06-29T03:19:19.870 回答