分布式訊息系統作為實現分布式系統可擴充套件、可伸縮性的關鍵元件,需要具有高吞吐量、高可用等特點。而談到訊息系統的設計,就迴避不了兩個問題:
1、訊息的順序問題2.1、順序訊息2、訊息的重複問題
要實現嚴格的順序訊息,簡單且可行的辦法就是:
保證生產者 - mqserver - 消費者是一對一對一的關係這樣的設計雖然簡單易行,但也會存在一些很嚴重的問題,比如:
1、並行度就會成為訊息系統的瓶頸(吞吐量不夠)
但我們的最終目標是要集群的高容錯性和高吞吐量。這似乎是一對不可調和的矛盾,那麼阿里是如何解決的?
有些問題,看起來很重要,但實際上我們可以通過合理的設計或者將問題分解來規避。如果硬要把時間花在解決問題本身,實際上不僅效率低下,而且也是一種浪費。從這個角度來看訊息的順序問題,我們可以得出兩個結論:
1、不關注亂序的應用實際大量存在2.2、訊息重複2、佇列無序並不意味著訊息無序
上面在解決訊息順序問題時,引入了乙個新的問題,就是訊息重複。那麼mq是怎樣解決訊息重複的問題呢?還是「恰好」不解決。
造成訊息的重複的根本原因是:網路不可達。只要通過網路交換資料,就無法避免這個問題。所以解決這個問題的辦法就是不解決,轉而繞過這個問題。那麼問題就變成了:如果消費端收到兩條一樣的訊息,應該怎樣處理?
1、消費端處理訊息的業務邏輯保持冪等性第1條很好理解,只要保持冪等性,不管來多少條重複訊息,最後處理的結果都一樣。第2條原理就是利用一張日誌表來記錄已經處理成功的訊息的id,如果新到的訊息id已經在日誌表中,那麼就不再處理這條訊息。2、保證每條訊息都有唯一編號且保證訊息處理成功與去重表的日誌同時出現
我們可以看到第1條的解決方式,很明顯應該在消費端實現,不屬於訊息系統要實現的功能。第2條可以訊息系統實現,也可以業務端實現。正常情況下出現重複訊息的概率不一定大,且由訊息系統實現的話,肯定會對訊息系統的吞吐量和高可用有影響,所以最好還是由業務端自己處理訊息重複的問題,這也是mq不解決訊息重複的問題的原因。
mq不保證訊息不重複,如果你的業務需要保證嚴格的不重複訊息,需要你自己在業務端去重。
官方qq群:422315558574187616967920586
【網易雲課堂主頁】:
MQ如何解決訊息的順序性
一 訊息的順序性 1 延遲佇列 設定乙個全域性變數index,根據實際情況一次按照index 的邏輯一次給訊息佇列設定延遲時間段,可以是0.5s,甚至1s 弊端 如果a,b,c.訊息佇列消費時間不一致或者出現網路延遲,就會存在後者比前者先消費完的場景 2 統一消費端 當a消費成功後,通過ack或者c...
訊息佇列如何解決訊息積壓問題
訊息佇列訊息積壓了怎麼辦?q 剛開始是對這個疑問抱有質疑態度的,因為使用訊息佇列的其中目的就是削峰填谷,來避免高流量時,對下游服務的衝擊,所以使用訊息佇列進行緩衝,下游根據自己的消費能力去消費,我感覺這就是訊息積壓本就是使用訊息佇列的功能,怎麼會是問題呢?a 首先訊息積壓是正常現象,但凡是過多就不正...
分布式訊息系統如何解決訊息的順序 重複兩大硬傷?
分布式訊息系統作為實現分布式系統可擴充套件 可伸縮性的關鍵元件,需要具有高吞吐量 高可用等特點。而談到訊息系統的設計,就迴避不了兩個問題 訊息的順序問題 訊息的重複問題 rocketmq作為阿里開源的一款高效能 高吞吐量的訊息中介軟體,它是怎樣來解決這兩個問題的?rocketmq有哪些關鍵特性?其實...