1. 程式人生 > >如何解決訊息佇列的延時以及過期失效問題?訊息佇列滿了以後該怎麼處理?有幾百萬訊息持續積壓幾小時,說說怎麼解決?

如何解決訊息佇列的延時以及過期失效問題?訊息佇列滿了以後該怎麼處理?有幾百萬訊息持續積壓幾小時,說說怎麼解決?

開發十年,就只剩下這套架構體系了! >>>   

轉載石杉老師

1、面試題

 

如何解決訊息佇列的延時以及過期失效問題?訊息佇列滿了以後該怎麼處理?有幾百萬訊息持續積壓幾小時,說說怎麼解決?

 

2、面試官心裡分析

 

你看這問法,其實本質針對的場景,都是說,可能你的消費端出了問題,不消費了,或者消費的極其極其慢。接著就坑爹了,可能你的訊息佇列叢集的磁碟都快寫滿了,都沒人消費,這個時候怎麼辦?或者是整個這就積壓了幾個小時,你這個時候怎麼辦?或者是你積壓的時間太長了,導致比如rabbitmq設定了訊息過期時間後就沒了怎麼辦?

 

所以就這事兒,其實線上挺常見的,一般不出,一出就是大case,一般常見於,舉個例子,消費端每次消費之後要寫mysql,結果mysql掛了,消費端hang那兒了,不動了。或者是消費端出了個什麼叉子,導致消費速度極其慢。

 

3、面試題分析

 

關於這個事兒,我們一個一個來梳理吧,先假設一個場景,我們現在消費端出故障了,然後大量訊息在mq裡積壓,現在事故了,慌了

 

(1)大量訊息在mq裡積壓了幾個小時了還沒解決

 

幾千萬條資料在MQ裡積壓了七八個小時,從下午4點多,積壓到了晚上很晚,10點多,11點多

 

這個是我們真實遇到過的一個場景,確實是線上故障了,這個時候要不然就是修復consumer的問題,讓他恢復消費速度,然後傻傻的等待幾個小時消費完畢。這個肯定不能在面試的時候說吧。

 

一個消費者一秒是1000條,一秒3個消費者是3000條,一分鐘是18萬條,1000多萬條

 

所以如果你積壓了幾百萬到上千萬的資料,即使消費者恢復了,也需要大概1小時的時間才能恢復過來

 

一般這個時候,只能操作臨時緊急擴容了,具體操作步驟和思路如下:

1)先修復consumer的問題,確保其恢復消費速度,然後將現有cnosumer都停掉

2)新建一個topic,partition是原來的10倍,臨時建立好原先10倍或者20倍的queue數量

3)然後寫一個臨時的分發資料的consumer程式,這個程式部署上去消費積壓的資料,消費之後不做耗時的處理,直接均勻輪詢寫入臨時建立好的10倍數量的queue

4)接著臨時徵用10倍的機器來部署consumer,每一批consumer消費一個臨時queue的資料

5)這種做法相當於是臨時將queue資源和consumer資源擴大10倍,以正常的10倍速度來消費資料

6)等快速消費完積壓資料之後,得恢復原先部署架構,重新用原先的consumer機器來消費訊息

 

(2)這裡我們假設再來第二個坑

 

假設你用的是rabbitmq,rabbitmq是可以設定過期時間的,就是TTL,如果訊息在queue中積壓超過一定的時間就會被rabbitmq給清理掉,這個資料就沒了。那這就是第二個坑了。這就不是說資料會大量積壓在mq裡,而是大量的資料會直接搞丟。

 

這個情況下,就不是說要增加consumer消費積壓的訊息,因為實際上沒啥積壓,而是丟了大量的訊息。我們可以採取一個方案,就是批量重導,這個我們之前線上也有類似的場景幹過。就是大量積壓的時候,我們當時就直接丟棄資料了,然後等過了高峰期以後,比如大家一起喝咖啡熬夜到晚上12點以後,使用者都睡覺了。

 

這個時候我們就開始寫程式,將丟失的那批資料,寫個臨時程式,一點一點的查出來,然後重新灌入mq裡面去,把白天丟的資料給他補回來。也只能是這樣了。

 

假設1萬個訂單積壓在mq裡面,沒有處理,其中1000個訂單都丟了,你只能手動寫程式把那1000個訂單給查出來,手動發到mq裡去再補一次

 

(3)然後我們再來假設第三個坑

 

如果走的方式是訊息積壓在mq裡,那麼如果你很長時間都沒處理掉,此時導致mq都快寫滿了,咋辦?這個還有別的辦法嗎?沒有,誰讓你第一個方案執行的太慢了,你臨時寫程式,接入資料來消費,消費一個丟棄一個,都不要了,快速消費掉所有的訊息。然後走第二個方案,到了晚上再補資料吧。

相關推薦

效能提升五十倍:訊息佇列聚合通知的重要性

前言 這個話題對我而言,是影響很久的事情。從第一次使用訊息佇列開始,業務背景是報名系統通知到我們的系統。正常流量下資料都能正常通知過來,但遇到匯入報名人時,採用了Task非同步通知,資料量一大,佇列就死了。當時是儘量採用同步方式,減少併發量。  後來業務上有了專門的營銷系統

07 百萬訊息訊息佇列積壓小時如何解決?

目錄   1、面試題 2、面試官心裡分析 3、面試題分析 (1)大量訊息在mq裡積壓了幾個小時了還沒解決 (2)這裡我們假設再來第二個坑 (3)然後我們再來假設第三個坑 1、面試題 如何解決訊息佇列的延時以及過期失效問題?訊息佇列滿了以後該怎麼處理?

Tcp效能調優 解決Tcp長

背景: 根據Tcp的理論計算,Tcp最佳狀態下傳輸是流水並行的,傳輸時間等於傳輸資料耗時+TTL,即千兆網絡卡的環境下 傳輸1MB資料需要:  1000ms/100MB*1MB+TTL=10ms+TTL,同機房傳輸1MB耗時10毫秒,跨機房理論耗時14毫秒 傳輸4

Redis 非同步訊息佇列佇列

        訊息中介軟體,大家都會想到  Rabbitmq 和 Kafka 作為訊息佇列中介軟體,來給應用程式之間增加非同步訊息傳遞功能。這兩個中介軟體都是專業的訊息佇列中介軟體,特性之多超出了大多數人的理解能力。但是這種屬於重量級的應

訊息佇列

下面程式碼按需要填寫 @Bean public Queue delayQueuePerMessageTTL() { Map<String, Object> argument = new HashMap<>(); argument.put(“x-message-ttl

Redis訊息佇列、非同步訊息佇列的實現

package list; import java.lang.reflect.Type; import java.util.Set; import java.util.UUID; import com.alibaba.fastjson.JSON; import com.a

rabbitmq發訊息以及通過一個exchange發到不同的queue

public static void main(String[] args) throws Exception { producer(1); producer(2); producer(3); } private static void

Redis實現可靠低訊息佇列

不過因為使用的是decrBy會導致一種情況出現,當前庫存還剩1個,2個執行緒同時請求,一個請求減去1個庫存,另一個請求減去2個庫存,,如果減去2個庫存的先執行,他會返回一個-1,然後我會加回去,但是在加回去的之前,減1庫存的執行緒執行了,會返回-2,依然沒有辦法減庫存成功,所以在這中情況下,我採用當減庫存返回

使用@ManyToOne並加載出現的問題以及解決總結

使用HIBERNATE的註解@ManyToOne(fetch = FetchType.lazy) 時候,報出錯誤org.hibernate.LazyInitializationException: could not initialize proxy - no Session

Handler記憶體洩露的分析和解決辦法以及實現執行操作的種方法

一.Handler記憶體洩露的分析和解決辦法在進行非同步操作時,我們經常會使用到Handler類。最常見的寫法如下。public class MainActivity extends Activity

java實現rabbitMQ佇列詳解以及spring-rabbit整合教程

java實現rabbitMQ延時佇列詳解 這是我在公司開發中使用的倆套方案,感興趣的話可以看一下:點選下載 在實際的業務中我們會遇見生產者產生的訊息,不立即消費,而是延時一段時間在消費。RabbitMQ本身沒有直接支援延遲佇列功能,但是我們可以根據其特性Per-Queu

Activemq訊息佇列啟動無效以及Forbidden class問題解決

    當我從apache下載來最新5.15.3的壓縮包到伺服器上   第一個問題, 進入bin目錄下執行(這裡說明下,console是表示將日誌打在前臺方便除錯,activemq start則是執行到後臺)    執行後,檢視ps -aux 並沒有activemq的程式執行

https安全證書過期失效的原因以及解決方法

分析 標準 原因 以及 rapi 日期 證書過期 手機 geo 一、網站https安全證書過期原因分析:    1、當前電腦系統時間錯誤,所有的http安全證書都有頒發日期和截止日期,電腦系統時間在證書有效時間區間之外有可能導致瀏覽器提示網站https安全證書已過期或還未生

Spring boot實戰專案整合阿里雲RocketMQ (非開源版)訊息佇列實現傳送普通訊息訊息 --附程式碼

一.為什麼選擇RocketMQ訊息佇列? 首先RocketMQ是阿里巴巴自研出來的,也已開源。其效能和穩定性從雙11就能看出來,借用阿里的一句官方介紹:歷年雙 11 購物狂歡節零點千萬級 TPS、萬億級資料洪峰,創造了全球最大的業務訊息併發以及流轉紀錄(日誌類訊息除外);  在始終保證高效能前提下

玩轉redis-訊息佇列

上一篇基於redis的list實現了一個簡單的訊息佇列:玩轉redis-簡單訊息佇列 原始碼地址 使用demo 產品經理經常說的一句話,我們不光要有X功能,還要Y功能,這樣客戶才能更滿意。同樣的,只有簡單訊息佇列是不夠的,還要有延時訊息佇列才能算是一個完整的訊息佇列。 看看redis的命令,放眼望去,的有序

RabbitMQ高階之訊息限流與佇列

>人生終將是場單人旅途,孤獨之前是迷茫,孤獨過後是成長。 ## 楔子 本篇是訊息佇列`RabbitMQ`的第五彈。 上篇本來打算講述`RabbitMQ`的一些高階用法: * 如何保證訊息的可靠性? * 訊息佇列如何進行限流? * 如何設定延時佇列進行延時消費? 最終因為篇幅緣故,上篇只講了`

Redis的批量操作是什麼?怎麼實現的佇列以及訂閱模式、LRU。

## 前言 這次的內容是我自己為了總結Redis知識而擴充的,上一篇其實已經總結了幾點知識了,但是Redis的強大,以及適用範圍之廣可不是單單一篇博文就能總結清的。所以這次準備繼續總結,因為第一個問題,Redis的批量操作,是我在面試過程中被真實問到的,當時沒答上來,也是因為確實沒了解過Redis的批量操作。

C# 中串口通信 serialport1.DataReceived 函數無法觸發或者出發等等問題解決方法

實例 意思 ets stop send 問題 ascii 設置 out 以前這個問題困擾我多天最後查資料一大堆,最後最終攻克了,看到非常多人做C#串口都遇到相同的問題,所以寫一篇博文,以便學習交流。 一定要在com實例化的時候設置ReceivedBytesThresho

運維學習之系統任務、定時任務以及臨時文件的管理

linux系統的延時及定時任務1.延時任務at 命令 發起的任務都是一次性的at +time下圖表示在21:22分進行刪除命令命令ctrl+d 表示發起動作at -l | atq #查看當前任務at -d | atrm #取消指定任務at -c #查看任務內容由圖二知主要執行touch這條命令at n