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