RocketMq product 故障規避機制

2021-10-09 16:46:22 字數 1549 閱讀 8165

訊息傳送高可用設計與故障規避機制

熟悉 rocketmq 的小夥伴應該都知道,rocketmq topic 路由註冊中心 nameserver 採用的是最終一致性模型,而且客戶端是定時向 nameserver 拉取 topic 的路由資訊,即客戶端(producer、consumer)是無法實時感知 broker 宕機的,這樣訊息傳送者會繼續向已宕機的 broker 傳送訊息,造成訊息傳送異常。那 rocketmq 是如何保證訊息傳送的高可用性呢?

rocketmq 為了保證訊息傳送的高可用性,在內部引入了重試機制,預設重試 2 次。rocketmq 訊息傳送端採取的佇列負載均衡預設採用輪循。

在 rocketmq 中訊息傳送者是執行緒安全的,即乙個訊息傳送者可以在多執行緒環境中安全使用。每乙個訊息傳送者全域性會維護乙個 topic 上一次選擇的佇列,然後基於這個序號進行遞增輪循,引入了 threadlocal 機制,即每乙個傳送者執行緒持有乙個上一次選擇的佇列,用 sendwhichqueue 表示。

接下來舉例訊息佇列負載機制,例如 topica 的路由資訊如下圖所示:

正如上圖所 topica 在 broker-a、broker-b 上分別建立了 4 個佇列,例如乙個執行緒使用 producer 傳送訊息時,通過對 sendwhichqueue getandincrement() 方法獲取下乙個佇列。

例如在傳送之前 sendwhichqueue 該值為 broker-a 的 q1,如果由於此時 broker-a 的突發流量異常大導致訊息傳送失敗,會觸發重試,按照輪循機制,下乙個選擇的隊列為 broker-a 的 q2 佇列,此次訊息傳送大概率還是會失敗,即儘管會重試 2 次,但都是傳送給同乙個 broker 處理,此過程會顯得不那麼靠譜,即大概率還是會失敗,那這樣重試的意義將大打折扣。

故 rocketmq 為了解決該問題,引入了故障規避機制,在訊息重試的時候,會盡量規避上一次傳送的 broker,回到上述示例,當訊息發往 broker-a q1 佇列時返回傳送失敗,那重試的時候,會先排除 broker-a 中所有佇列,即這次會選擇 broker-b q1 佇列,增大訊息傳送的成功率。

上述規避思路是預設生效的,即無需干預。

但 rocketmq 提供了兩種規避策略,該引數由sendlatencyfaultenable控制,使用者可干預,表示是否開啟延遲規避機制,預設為不開啟。(defaultmqproducer中設定這兩個引數)

筆者實戰經驗分享

按照筆者的實踐經驗,rocketmq broker 的繁忙基本都是瞬時的,而且通常與系統 pagecache 核心的管理相關,很快就能恢復,故不建議開啟延遲機制。因為一旦開啟延遲機制,例如 5 分鐘內不會向乙個 broker 傳送訊息,這樣會導致訊息在其他 broker 激增,從而會導致部分消費端無法消費到訊息,增大其他消費者的處理壓力,導致整體消費效能的下降。

參考: 丁威     訊息傳送核心引數與工作原理詳解

virtualbox 虛擬機器 故障修復

當你的virtualbox上的虛擬機器因為累死以下錯誤無法啟動時 error 你可以試一下這個解決方案 刪除你的home 資料夾 home virtualbox 內的virtualbox.xml 檔案 重新啟動virtualbox,新建乙個虛擬機器。在新增虛擬機器階段 選擇os這一步,為虛擬機器重新...

微控制器復位種類和故障

外部復位 external reset 它是影響時鐘模組和所有內部電路,屬於同步復位,但外部reset引腳為邏輯低電平。在引腳變為低電平後,cpu的復位控制邏輯單元確認復位狀態直到reset釋放。復位控制邏輯保持復位低電平狀態,在額外512個時鐘週期內。因為當復位引腳為低電平時與mcu執行復位命令是...

傳真機常見故障及攻略

傳真機常見故障及解決辦法 從儲存器中刪除已存入的傳真 1 按功能鍵,然後按儲存查詢。2 按設定鍵,然後用檢索鍵 選擇你要刪除的傳真tx rx號碼。3 按設定鍵,然後按 刪除傳真,或按 取消。4 按停止鍵回到待機模式。使用注意事項 1 啟用傳真機以前,應當仔細閱讀這些安全教育,以便今後更好的使用傳真機...