摘要:一個對應一個,但是里面進行了多線程消費,這樣也會造成消息消費順序錯誤。保證消息的消費順序拆分多個,每個一個,就是多一些而已,確實是麻煩點這樣也會造成吞吐量下降,可以在消費者內部采用多線程的方式取消費。
1.為什么要保證順序消息隊列中的若干消息如果是對同一個數據進行操作,這些操作具有前后的關系,必須要按前后的順序執行,否則就會造成數據異常。舉例: 比如通過mysql binlog進行兩個數據庫的數據同步,由于對數據庫的數據操作是具有順序性的,如果操作順序搞反,就會造成不可估量的錯誤。比如數據庫對一條數據依次進行了 插入->更新->刪除操作,這個順序必須是這樣,如果在同步過程中,消息的順序變成了 刪除->插入->更新,那么原本應該被刪除的數據,就沒有被刪除,造成數據的不一致問題。
2.出現順序錯亂的場景(1)rabbitmq
①一個queue,有多個consumer去消費,這樣就會造成順序的錯誤,consumer從MQ里面讀取數據是有序的,但是每個consumer的執行時間是不固定的,無法保證先讀到消息的consumer一定先完成操作,這樣就會出現消息并沒有按照順序執行,造成數據順序錯誤。
②一個queue對應一個consumer,但是consumer里面進行了多線程消費,這樣也會造成消息消費順序錯誤。
(2)kafka
①kafka一個topic,一個partition,一個consumer,但是consumer內部進行多線程消費,這樣數據也會出現順序錯亂問題。
②具有順序的數據寫入到了不同的partition里面,不同的消費者去消費,但是每個consumer的執行時間是不固定的,無法保證先讀到消息的consumer一定先完成操作,這樣就會出現消息并沒有按照順序執行,造成數據順序錯誤。
3.保證消息的消費順序
(1)rabbitmq
①拆分多個queue,每個queue一個consumer,就是多一些queue而已,確實是麻煩點;這樣也會造成吞吐量下降,可以在消費者內部采用多線程的方式取消費。
②或者就一個queue但是對應一個consumer,然后這個consumer內部用內存隊列做排隊,然后分發給底層不同的worker來處理
(2)kafka
①確保同一個消息發送到同一個partition,一個topic,一個partition,一個consumer,內部單線程消費。
②寫N個內存queue,然后N個線程分別消費一個內存queue即可
上一篇《如何防止數據隊列數據丟失》
下一篇《消息積壓在消息隊列里怎么辦》
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/7262.html
摘要:能不能支持數據丟失啊可以的,參考我們之前說的那個數據零丟失方案其實一個肯定是很復雜的,其實這是個開放題,就是看看你有沒有從架構角度整體構思和設計的思維以及能力。其實回答這類問題,說白了,起碼不求你看過那技術的源碼,起碼你大概知道那個技術的基本原理,核心組成部分,基本架構構成,然后參照一些開源的技術把一個系統設計出來的思路說一下就好 比如說這個消息隊列系統,我們來從以下幾個角度來考慮一下 (1...
摘要:緊接著征用倍的機器來部署,每一批消費一個臨時的消息。這種做法相當于臨時將資源和資源擴大倍,以正常速度的倍來消費消息。解決方案這種情況下,實際上沒有什么消息擠壓,而是丟了大量的消息。 1.大量消息在mq里積壓了幾個小時了還沒解決 場景: 幾千萬條數據在MQ里積壓了七八個小時,從下午4點多,積壓到了晚上很晚,10點多,11點多。線上故障了,這個時候要不然就是修復consumer的問題,讓他恢復消...
摘要:消費端弄丟了數據關閉自動提交,在自己處理完畢之后手動提交,這樣就不會丟失數據。弄丟了數據一般要求設置個參數來保證消息不丟失給設置參數這個值必須大于,表示要求每個必須至少有個副本。上一篇如何保證消息不重復消費下一篇如何保證消息按順序執行 1.mq原則 數據不能多,也不能少,不能多是說消息不能重復消費,這個我們上一節已解決;不能少,就是說不能丟失數據。如果mq傳遞的是非常核心的消息,支撐核心的業...
摘要:數量對吞吐量的影響可以達到幾百幾千個的級別,吞吐量會有小幅度的下降。這是的一大優勢,可在同等數量機器下支撐大量的從幾十個到幾百個的時候,吞吐量會大幅下降。下一篇如何保證消息隊列的高可用 1.為什么使用消息隊列? (1)解耦:可以在多個系統之間進行解耦,將原本通過網絡之間的調用的方式改為使用MQ進行消息的異步通訊,只要該操作不是需要同步的,就可以改為使用MQ進行不同系統之間的聯系,這樣項目之間...
摘要:的過期策略是什么樣的采用了定期刪除惰性刪除的過期策略。定期刪除原理定期刪除指的是默認每隔就隨機抽取一些設置了過期時間的,檢測這些是否過期,如果過期了就將其刪掉。所有只會抽取一部分而不會全部檢查。 1.數據為什么會過期? 首先,要明白redis是用來做數據緩存的,不是用來做數據存儲的(當然也可以當數據庫用),所以數據時候過期的,過期的數據就不見了,過期主要有兩種情況, ①在設置緩存數據時制定了...
閱讀 2508·2023-04-26 02:47
閱讀 2999·2023-04-26 00:42
閱讀 865·2021-10-12 10:12
閱讀 1372·2021-09-29 09:35
閱讀 1689·2021-09-26 09:55
閱讀 478·2019-08-30 14:00
閱讀 1532·2019-08-29 12:57
閱讀 2350·2019-08-28 18:00