您好,登錄后才能下訂單哦!
這篇文章主要介紹RocketMQ broker busy的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
首先,broker busy 相關的日志關鍵字如下:
[REJECTREQUEST]system busy
too many requests and system thread pool busy
[PC_SYNCHRONIZED]broker busy
[PCBUSY_CLEAN_QUEUE]broker busy
[TIMEOUT_CLEAN_QUEUE]broker busy
本文先給出一張流程圖,展示上述5種 broker busy 分別會在消息發送的哪個階段拋出,以便大家能夠清晰的了解其發生的原因。
同時在做 Broker 服務器巡檢的時候,可以通過去通過如下命令去查看 broker 一次消息追加是否會超過 500 ms。
本文接下來想重點探討一下 [TIMEOUT_CLEAN_QUEUE]broker busy 這種情況。
BrokerFastFailure#cleanExpiredRequest
while (true) {
try {
if (!this.brokerController.getSendThreadPoolQueue().isEmpty()) {
final Runnable runnable = this.brokerController.getSendThreadPoolQueue().peek();
if (null == runnable) {
break;
}
final RequestTask rt = castRunnable(runnable);
if (rt == null || rt.isStopRun()) {
break;
}
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()));
}
} else {
break;
}
} else {
break;
}
} catch (Throwable ignored) {
}
}
可以看出來,拋出這種錯誤,在 broker 還沒有發送“嚴重”的 pagecache 繁忙,即消息追加到內存中的最大時延沒有超過 1s,通常追加是很快的,絕大部分都會低于1ms,但可能會由于出現一個超過200ms的追加時間,導致排隊中的任務等待時間超過了200ms,則此時會觸發broker 端的快速失敗,讓請求快速失敗,便于客戶端快速重試。但是這種請求并不是實時的,而是每隔10s 檢查一遍。
值得注意的是,一旦出現 TIMEOUT_CLEAN_QUEUE,可能在一個點會有多個這樣的錯誤信息,具體多少與當前積壓在待發送隊列中的個數有關。
以上是“RocketMQ broker busy的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。