Rocketmq:MQBrokerException:CODE:2 DESC:[TIMEOUT_CLEAN_QUEUE]

时间:2017-04-01 08:03:56

标签: rocketmq

当我向经纪人发送消息时,偶尔会发生此异常。

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

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

2 个答案:

答案 0 :(得分:0)

有很多可能的方法。

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

以下是原因:

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

  2. 自己花费很长时间处理邮件存储的工作。

  3. 这可能是因为:

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