摘要:緊接著征用倍的機器來部署,每一批消費一個臨時的消息。這種做法相當(dāng)于臨時將資源和資源擴大倍,以正常速度的倍來消費消息。解決方案這種情況下,實際上沒有什么消息擠壓,而是丟了大量的消息。
1.大量消息在mq里積壓了幾個小時了還沒解決場景: 幾千萬條數(shù)據(jù)在MQ里積壓了七八個小時,從下午4點多,積壓到了晚上很晚,10點多,11點多。線上故障了,這個時候要不然就是修復(fù)consumer的問題,讓他恢復(fù)消費速度,然后傻傻的等待幾個小時消費完畢。這個肯定不行。一個消費者一秒是1000條,一秒3個消費者是3000條,一分鐘是18萬條,1000多萬條。
所以如果你積壓了幾百萬到上千萬的數(shù)據(jù),即使消費者恢復(fù)了,也需要大概1小時的時間才能恢復(fù)過來。
解決方案:
這種時候只能操作臨時擴容,以更快的速度去消費數(shù)據(jù)了。具體操作步驟和思路如下:
①先修復(fù)consumer的問題,確保其恢復(fù)消費速度,然后將現(xiàn)有consumer都停掉。
②臨時建立好原先10倍或者20倍的queue數(shù)量(新建一個topic,partition是原來的10倍)。
③然后寫一個臨時分發(fā)消息的consumer程序,這個程序部署上去消費積壓的消息,消費之后不做耗時處理,直接均勻輪詢寫入臨時建好分10數(shù)量的queue里面。
④緊接著征用10倍的機器來部署consumer,每一批consumer消費一個臨時queue的消息。
⑤這種做法相當(dāng)于臨時將queue資源和consumer資源擴大10倍,以正常速度的10倍來消費消息。
⑥等快速消費完了之后,恢復(fù)原來的部署架構(gòu),重新用原來的consumer機器來消費消息。
2.消息設(shè)置了過期時間,過期就丟了怎么辦
假設(shè)你用的是rabbitmq,rabbitmq是可以設(shè)置過期時間的,就是TTL,如果消息在queue中積壓超過一定的時間就會被rabbitmq給清理掉,這個數(shù)據(jù)就沒了。那這就是第二個坑了。這就不是說數(shù)據(jù)會大量積壓在mq里,而是大量的數(shù)據(jù)會直接搞丟。
解決方案:
這種情況下,實際上沒有什么消息擠壓,而是丟了大量的消息。所以第一種增加consumer肯定不適用。
這種情況可以采取 “批量重導(dǎo)” 的方案來進行解決。
在流量低峰期(比如夜深人靜時),寫一個程序,手動去查詢丟失的那部分?jǐn)?shù)據(jù),然后將消息重新發(fā)送到mq里面,把丟失的數(shù)據(jù)重新補回來。
如果走的方式是消息積壓在mq里,那么如果你很長時間都沒處理掉,此時導(dǎo)致mq都快寫滿了,咋辦?這個還有別的辦法嗎?
解決方案:
這個就沒有辦法了,肯定是第一方案執(zhí)行太慢,這種時候只好采用 “丟棄+批量重導(dǎo)” 的方式來解決了。
首先,臨時寫個程序,連接到mq里面消費數(shù)據(jù),收到消息之后直接將其丟棄,快速消費掉積壓的消息,降低MQ的壓力,然后走第二種方案,在晚上夜深人靜時去手動查詢重導(dǎo)丟失的這部分?jǐn)?shù)據(jù)。
上一篇《如何保證消息按順序執(zhí)行》
下一篇《如果讓你設(shè)計一個MQ,你怎么設(shè)計》
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/7363.html
摘要:能不能支持?jǐn)?shù)據(jù)丟失啊可以的,參考我們之前說的那個數(shù)據(jù)零丟失方案其實一個肯定是很復(fù)雜的,其實這是個開放題,就是看看你有沒有從架構(gòu)角度整體構(gòu)思和設(shè)計的思維以及能力。其實回答這類問題,說白了,起碼不求你看過那技術(shù)的源碼,起碼你大概知道那個技術(shù)的基本原理,核心組成部分,基本架構(gòu)構(gòu)成,然后參照一些開源的技術(shù)把一個系統(tǒng)設(shè)計出來的思路說一下就好 比如說這個消息隊列系統(tǒng),我們來從以下幾個角度來考慮一下 (1...
摘要:一個對應(yīng)一個,但是里面進行了多線程消費,這樣也會造成消息消費順序錯誤。保證消息的消費順序拆分多個,每個一個,就是多一些而已,確實是麻煩點這樣也會造成吞吐量下降,可以在消費者內(nèi)部采用多線程的方式取消費。 1.為什么要保證順序 消息隊列中的若干消息如果是對同一個數(shù)據(jù)進行操作,這些操作具有前后的關(guān)系,必須要按前后的順序執(zhí)行,否則就會造成數(shù)據(jù)異常。舉例: 比如通過mysql binlog進行兩個數(shù)據(jù)...
摘要:數(shù)量對吞吐量的影響可以達到幾百幾千個的級別,吞吐量會有小幅度的下降。這是的一大優(yōu)勢,可在同等數(shù)量機器下支撐大量的從幾十個到幾百個的時候,吞吐量會大幅下降。下一篇如何保證消息隊列的高可用 1.為什么使用消息隊列? (1)解耦:可以在多個系統(tǒng)之間進行解耦,將原本通過網(wǎng)絡(luò)之間的調(diào)用的方式改為使用MQ進行消息的異步通訊,只要該操作不是需要同步的,就可以改為使用MQ進行不同系統(tǒng)之間的聯(lián)系,這樣項目之間...
摘要:消費端弄丟了數(shù)據(jù)關(guān)閉自動提交,在自己處理完畢之后手動提交,這樣就不會丟失數(shù)據(jù)。弄丟了數(shù)據(jù)一般要求設(shè)置個參數(shù)來保證消息不丟失給設(shè)置參數(shù)這個值必須大于,表示要求每個必須至少有個副本。上一篇如何保證消息不重復(fù)消費下一篇如何保證消息按順序執(zhí)行 1.mq原則 數(shù)據(jù)不能多,也不能少,不能多是說消息不能重復(fù)消費,這個我們上一節(jié)已解決;不能少,就是說不能丟失數(shù)據(jù)。如果mq傳遞的是非常核心的消息,支撐核心的業(yè)...
摘要:這個是類似的一種結(jié)構(gòu),這個一般就是可以將結(jié)構(gòu)化的數(shù)據(jù),比如一個對象前提是這個對象沒嵌套其他的對象給緩存在里,然后每次讀寫緩存的時候,可以就操作里的某個字段。 1.string 這是最基本的類型了,就是普通的set和get,做簡單的kv緩存。 2.hash 這個是類似map的一種結(jié)構(gòu),這個一般就是可以將結(jié)構(gòu)化的數(shù)據(jù),比如一個對象(前提是這個對象沒嵌套其他的對象)給緩存在redis里,然后每次...
閱讀 1684·2023-04-25 19:51
閱讀 2009·2019-08-30 15:55
閱讀 1892·2019-08-30 15:44
閱讀 2763·2019-08-30 13:58
閱讀 2774·2019-08-29 16:37
閱讀 1150·2019-08-29 15:34
閱讀 4150·2019-08-29 11:05
閱讀 2731·2019-08-28 17:51