MQ 訊息佇列 比較

VipSoft發表於2023-02-15

為什麼需要訊息佇列

削峰

業務系統在超高併發場景中,由於後端服務來不及同步處理過多、過快的請求,可能導致請求堵塞,嚴重時可能由於高負荷拖垮Web伺服器。
為了能支援最高峰流量,我們通常採取短平快的方式——直接擴容伺服器,增加服務端的吞吐量。
優點是顯而易見的,短時間內吞吐量增加了好幾倍,甚至數十倍。缺點也明顯,流量低峰期伺服器相對較閒。
訊息佇列(比如 Apache RocketMQ,Apache Kafka),也是目前業界比較常用的手段

解耦

不同的業務端在聯合開發功能時,常常由於排期不同、人員調配不方便等原因導致專案延期。其實,其根本原因是業務耦合過度。
上下游系統之間的通訊是彼此依賴的,所以不得不協調上下游所有的資源同步進行,跨團隊處理問題顯然比在團隊內部處理問題難度大。

你是否依稀記得另一個團隊的同事呼叫你的API,你告訴他發個請求過來,你打斷點一步一步除錯程式碼的場景?
你是否記得為了協調開發資源、QA 資源,以及協調上線時間等所做的一切,你被老闆罵了多少次,最後還是延期了:我們依賴他們,他們的QA說,高峰期不讓釋出。
加入訊息佇列後,不同的業務端又會是何種情況呢?上下游系統進行開發、聯調、上線,彼此完全不依賴,也就是說,系統間解耦了
image

非同步

處理訂票請求是一個漫長的過程,需要檢查預訂的車次是否有預訂數量的票、下單扣庫存、更新快取等一系列操作。這些耗時的操作,我們可以透過使用訊息佇列的方式,把提交請求成功的訊息告訴使用者

資料一致性

訊息系統的優點:
(1)免去了多次重試(發起請求)的複雜邏輯。
(2)免去了處理過多重試請求的壓力。
(3)即使服務不可用,業務也不受影響。

常見訊息佇列

訊息佇列名字 Apache ActiveMQ Apache Kafka Apache RocketMQ
產生時間 2007 2012 2017
貢獻公司 Apache LinkedIn 阿里巴巴
當時流行MQ JMS ActiveMO Kafka,ActiveMO
特性 (1)支援協議眾多:AMOP,STOMP,MOTT,JMS
(2)訊息是持久化的JDBC
(1)超高寫入速率
(2)end-to-end 耗時毫秒級
(1)萬億級訊息支援
(2)萬級Topic數量支援
(3)end-to-end耗時毫秒級
管理後臺 自帶 獨立部署 獨立部署
多語言客戶端 支援 支援 Java、C++、Python、Go、C#
資料流支援 不支援 支援 支援
訊息丟失 理論上不會丟失 理論上不會丟失 理論上不會丟失
文件完備性 極好 極好
商業公司實踐 國內部分企業 LinkedIn 阿里巴巴
容錯 無重試機制 無重試機制 支援重試,死信訊息
順序訊息 支援 支援 支援
定時訊息 不支援 不支援 支援
事務訊息 不支援 支援 支援
訊息軌跡 不支援 不支援 支援
訊息查詢 資料庫中查詢 不支援 支援
重放訊息 不清楚 暫停重放 實時重放
當機 自動切換 自動選主 手動重啟

相關文章