RabbitMQ系列(八)--順序消費模式和迅速消息發送模式


MQ使用過程中,有些業務場景需要我們保證順序消費,而如果一個Producer,一個Queue,多個Consumer的情況下是無法保證順序的

舉例:

  1、業務上產生三條消息,分別是對數據的增加、修改、刪除,而如果沒有保證順序消費,結果可能是刪除、修改、增加,本來數據最終要刪除

、結果變成增加

 

  2、或者是電商平台,先付錢,然后生成訂單,然后通知物流(我對電商不怎么熟悉,這只是個例子而已,可能不太恰當),如果順序改變了,

客戶不付錢了,你卻通知物流送貨了

  所以,這些業務場景下,消息的順序消費很重要

解決方案:

  1、一個Queue對應一下Consumer,把需要保證順序的message都發送到一個queue當中,關閉autoack,prefetchCount=1,每次只消費

一條信息,處理過后進行手工ack,然后接收下一條message,只是由一個Consumer進行處理

  這里說一下,如果還是多個Consumer,使用同步處理,手工ack是不行的,第一時間每個Consumer都會收到message(如果message數量>

consumer數量),剩余的message才會等到ack之后發送過來,所以還是無法保證順序消費

  2、上面的解決方案只是個人一些簡單理解,真正的生產環境的方案很復雜,下面是大神的解決方案

需要保障以下幾點:

  1、發送的順序消息,必須保證在投遞到同一個隊列,且這個消費者只能有一個(獨占模式)

  2、然后同意提交(可以合並一個大消息,或拆分多個消息,最好是拆分),並且所有消息的會話ID一致

  3、添加消息屬性:順序表及的序號、本地順序消息的size屬性,進行落庫操作

  4、並行進行發送給自身的延遲消息(帶上關鍵屬性:會話ID、SIZE)進行后續處理消費

  5、當收到延遲消息后,根據會話ID、SIZE抽取數據庫數據進行處理即可

  6、定時輪詢補償機制,對於異常情況

備注:比如生產端消息沒有完全投遞成功、或者消費端羅渡異常導致消費端落庫后缺少消息條目的情況

解釋:

  左邊的步驟和之前講的批量消息完全相同

  右邊步驟:

  1、接收到多條消息之后,首先不是進行邏輯處理,而是直接分別入庫,把第一條消息入庫的同時,發送一個延遲消息(例如5分鍾,用來

保障所有的消息都接受到,進行統一處理),監聽到延遲消息之后,根據sessionId和size查出一共多少條消息,然后根絕消息順序去處理(

例如,起一個線程去處理)

  PS:接收到消息一定是先進行入庫,在經過延遲消息接收過后,再進行處理

  個人對這個方案理解不深,可以自行理解。。。

迅速消息發送模式

1、迅速消息是指消息不進行落庫,不做可靠性保障

2、適合日志數據、統計分析業務

3、優點就是性能和吞吐量達到最大

圖例:

消息不進行落庫,Producer不需要Broker進行confirm

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM