1. 程式人生 > >3、RabbitMQ在一線大廠中的基礎元件架構設計思路

3、RabbitMQ在一線大廠中的基礎元件架構設計思路

1、MQ元件實現功能點

MQ元件實現功能點
1) 支援訊息高效能的序列化轉換、非同步化傳送訊息
2) 支援訊息生產例項與消費例項的連線池化快取化,提升效能
3) 支援可靠性投遞訊息,保證訊息的100%不丟失
4) 支援消費端的冪等操作,避免消費端重複消費問題

5) 支援迅速訊息傳送模式,有些場景下不需要保證100%成功投遞,在一些日誌收集、統計分析等需求下可以保證高效能、超高吞吐量
6) 支援延遲訊息模式,訊息可以延遲傳送,指定延遲時間,用於某些延遲檢查、服務限流場景
7) 支援事務訊息,且100%保障可靠性投遞,在金融行業單筆大金額操作時會有此類需求
8) 支援順序訊息,保證訊息送達消費端的前後順序,例如下訂單等複合型操作
9) 支援訊息補償、重試,快速定位異常

2、迅速訊息傳送

   迅速訊息傳送是指訊息不進行落庫儲存,不做可靠性保證. 在一些非核心訊息、日誌資料、或者統計分析等場景下比較合適. 迅速訊息
的優點就是效能最高,吞吐量最大

7.3、批量訊息傳送

   批量訊息是指我們把訊息放到一個集合裡統一進行提交,將訊息合併,對於channel而言,就是傳送一次訊息,這種方式也是希望消費端在
消費的時候,可以進行批量化消費,但是不保證可靠性,需要進行補償機制RabbitMQ不支援訊息批量傳送,可以自己實現

4、延遲訊息傳送

   延遲訊息相對簡單,就是我們在Message封裝的時候新增delayTime屬性即可,使得我們訊息可以進行延遲傳送,根據具體的業務場景可以
很好的用到!
場景舉例:
1) 比如在電商平臺買到的商品簽收後,不點選確認支付,那麼系統自動會在7天去進行支付操作
2) 還有一些自動超時作廢的場景,如優惠券/紅包有使用時間限制,也可以使用延遲訊息機制

5、順序訊息傳送

要保障以下幾點:
1) 傳送的順序訊息,必須保障訊息投遞到同一個佇列,且這個消費者只能有一個(獨佔模式)
2) 然後需要統一提交(可能是合併成一個大訊息,也可以是拆分成多個小訊息),並且所有訊息的會話ID一致
3) 新增訊息的屬性:順序標記的序號、本次順序訊息的SIZE屬性,先不消費訊息,消費端收到後進行訊息落庫
4) 並行進行傳送給自身的延遲訊息,注意帶上關鍵屬性(會話ID、SIZE)進行後續處理消費,確保延遲的事件段中這一批訊息都已經全部收到
5) 當收到延遲訊息後,根據會話ID、SIZE抽取資料庫資料進行處理即可
6) 定時輪詢補償機制,對於異常情況,如生產端訊息沒有完全投遞成功、或者消費端落庫異常,導致消費端落庫後缺少訊息條目的情況

6、事務訊息傳送

我們採用類似可靠性投遞的機制,也就是補償機制.

我們使用的資料來源必須是同一個,也就是業務操作DB1資料庫和訊息記錄DB2資料庫使用同一個資料來源

然後重寫Spring DataSourceTransactionManager,在本地事務提交的時候進行傳送訊息,但是也有可能事務提交成功但是訊息傳送失敗,這個
時候就需要進行補償了

7、訊息的冪等性

可能導致訊息出現非冪等的原因:
1) 可靠性訊息投遞機制
2) MQ Broker服務與消費端傳輸訊息的過程中的網路抖動
3) 消費端故