摘要:緊接著征用倍的機(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)速度,然后傻傻的等待幾個(gè)小時(shí)消費(fèi)完畢。這個(gè)肯定不行。一個(gè)消費(fèi)者一秒是1000條,一秒3個(gè)消費(fèi)者是3000條,一分鐘是18萬條,1000多萬條。
所以如果你積壓了幾百萬到上千萬的數(shù)據(jù),即使消費(fèi)者恢復(fù)了,也需要大概1小時(shí)的時(shí)間才能恢復(fù)過來。
解決方案:
這種時(shí)候只能操作臨時(shí)擴(kuò)容,以更快的速度去消費(fèi)數(shù)據(jù)了。具體操作步驟和思路如下:
①先修復(fù)consumer的問題,確保其恢復(fù)消費(fèi)速度,然后將現(xiàn)有consumer都停掉。
②臨時(shí)建立好原先10倍或者20倍的queue數(shù)量(新建一個(gè)topic,partition是原來的10倍)。
③然后寫一個(gè)臨時(shí)分發(fā)消息的consumer程序,這個(gè)程序部署上去消費(fèi)積壓的消息,消費(fèi)之后不做耗時(shí)處理,直接均勻輪詢寫入臨時(shí)建好分10數(shù)量的queue里面。
④緊接著征用10倍的機(jī)器來部署consumer,每一批consumer消費(fèi)一個(gè)臨時(shí)queue的消息。
⑤這種做法相當(dāng)于臨時(shí)將queue資源和consumer資源擴(kuò)大10倍,以正常速度的10倍來消費(fèi)消息。
⑥等快速消費(fèi)完了之后,恢復(fù)原來的部署架構(gòu),重新用原來的consumer機(jī)器來消費(fèi)消息。
2.消息設(shè)置了過期時(shí)間,過期就丟了怎么辦
假設(shè)你用的是rabbitmq,rabbitmq是可以設(shè)置過期時(shí)間的,就是TTL,如果消息在queue中積壓超過一定的時(shí)間就會(huì)被rabbitmq給清理掉,這個(gè)數(shù)據(jù)就沒了。那這就是第二個(gè)坑了。這就不是說數(shù)據(jù)會(huì)大量積壓在mq里,而是大量的數(shù)據(jù)會(huì)直接搞丟。
解決方案:
這種情況下,實(shí)際上沒有什么消息擠壓,而是丟了大量的消息。所以第一種增加consumer肯定不適用。
這種情況可以采取 “批量重導(dǎo)” 的方案來進(jìn)行解決。
在流量低峰期(比如夜深人靜時(shí)),寫一個(gè)程序,手動(dòng)去查詢丟失的那部分?jǐn)?shù)據(jù),然后將消息重新發(fā)送到mq里面,把丟失的數(shù)據(jù)重新補(bǔ)回來。
如果走的方式是消息積壓在mq里,那么如果你很長時(shí)間都沒處理掉,此時(shí)導(dǎo)致mq都快寫滿了,咋辦?這個(gè)還有別的辦法嗎?
解決方案:
這個(gè)就沒有辦法了,肯定是第一方案執(zhí)行太慢,這種時(shí)候只好采用 “丟棄+批量重導(dǎo)” 的方式來解決了。
首先,臨時(shí)寫個(gè)程序,連接到mq里面消費(fèi)數(shù)據(jù),收到消息之后直接將其丟棄,快速消費(fèi)掉積壓的消息,降低MQ的壓力,然后走第二種方案,在晚上夜深人靜時(shí)去手動(dòng)查詢重導(dǎo)丟失的這部分?jǐn)?shù)據(jù)。
上一篇《如何保證消息按順序執(zhí)行》
下一篇《如果讓你設(shè)計(jì)一個(gè)MQ,你怎么設(shè)計(jì)》
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/7363.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...
摘要:一個(gè)對(duì)應(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ì)列中的若干消息如果是對(duì)同一個(gè)數(shù)據(jù)進(jìn)行操作,這些操作具有前后的關(guān)系,必須要按前后的順序執(zhí)行,否則就會(huì)造成數(shù)據(jù)異常。舉例: 比如通過mysql binlog進(jìn)行兩個(gè)數(shù)據(jù)...
摘要:數(shù)量對(duì)吞吐量的影響可以達(dá)到幾百幾千個(gè)的級(jí)別,吞吐量會(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)目之間...
摘要:消費(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è)...
摘要:這個(gè)是類似的一種結(jié)構(gòu),這個(gè)一般就是可以將結(jié)構(gòu)化的數(shù)據(jù),比如一個(gè)對(duì)象前提是這個(gè)對(duì)象沒嵌套其他的對(duì)象給緩存在里,然后每次讀寫緩存的時(shí)候,可以就操作里的某個(gè)字段。 1.string 這是最基本的類型了,就是普通的set和get,做簡單的kv緩存。 2.hash 這個(gè)是類似map的一種結(jié)構(gòu),這個(gè)一般就是可以將結(jié)構(gòu)化的數(shù)據(jù),比如一個(gè)對(duì)象(前提是這個(gè)對(duì)象沒嵌套其他的對(duì)象)給緩存在redis里,然后每次...
閱讀 1442·2023-04-25 19:51
閱讀 1932·2019-08-30 15:55
閱讀 1744·2019-08-30 15:44
閱讀 2704·2019-08-30 13:58
閱讀 2699·2019-08-29 16:37
閱讀 1077·2019-08-29 15:34
閱讀 4004·2019-08-29 11:05
閱讀 2623·2019-08-28 17:51