訊息中介軟體MQ 基於RabbitMQ分布式事務處理

2021-10-07 12:17:47 字數 2462 閱讀 6428

rabbitmq是開源的amqp(一種訊息佇列協議,適合金融行業,高可靠性)實現,在分布系統訊息可靠性,支援集群,豐富的訊息分發機制表現不錯,客戶端與spring整合緊密。可以使用managment外掛程式實現web監控和管理。

rabbitmq核心概念:

支援訊息持久化、exchange持久化、queue持久化,保證重啟rabbitmq資料不丟失。

訊息持久化:生產傳送訊息時,可以設定該訊息是持久化訊息和非持久話訊息

exchange持久化:建立exchange時可以指定是否持久化

queue持久化:建立佇列queue是可以指定是否持久化

記憶體磁碟控制配置項:

最大記憶體:預設0.4(相對系統記憶體值),超過該閾值會阻塞生產者

記憶體換頁比例:預設0.5,超過該閾值會把記憶體的資料儲存到磁碟,清理記憶體,釋放空間。

磁碟預警:預設50m,磁碟剩餘空間低於閥值,停止換頁和阻塞生產者,建議設定成系統的記憶體大小。預設10s檢測一次。

訊息傳送可靠性:支援"最多一次"和「最少一次」

支援confirm機制,生產者設定監聽回執。本地訊息表+confirm機制可以重**送失敗的訊息。

訊息消費可靠性:支援開啟手動ack機制(預設自動),消費者通過手動確認已經正確消費的訊息,或者通過nack告訴mq重發或者放入死信佇列。

即跨程序的事務,是跨系統的資料一致性問題,舉個栗子,比如乙個充值訂單,有充值活動(滿減)的情形,充值系統和活動系統屬於兩個服務。怎麼保證充值操作後活動正確處理?這裡就是乙個分布式事務問題。充值系統通過rpc呼叫或者http呼叫活動系統介面的方式,不能保證兩個系統的一致性問題(可能出現雖然rpc呼叫或者http呼叫失敗,活動系統卻業務處理了,但訂單系統無法回滾活動系統的處理)。

rabbitmq提供下面的機制:

可靠生產:保證訊息傳送到rabbitmq

可靠消費:保證訊息正確消費掉

最終保證多發方的資料一致性。

1.可靠訊息生產-記錄訊息傳送

2.可靠訊息生產-修改訊息傳送狀態

利用rabbitmq發布確認機制–mq受理訊息後會返回回執

如果在傳送回執或者修改狀態失敗的情況,使用兜底方案:重**送一定次數。

3.可靠訊息消費處理-正常處理開啟手動ack模式。由消費者控制訊息的重複或者丟棄

保證冪等性。防止重複處理,一次操作對應一次正確的資料處理。

4.可靠訊息消費處理-異常處理

消費處理失敗,需要mq再次重發給消費者。rabbitmq提供nack機制。

出現異常一般重複一定的次數,有消費者記錄重試次數,並進行次數控制

可以採用redis記憶體資料庫記錄處理次數或時間。

4.可靠訊息消費處理-超過重試次

消費處理失敗,直接丟棄或者轉移到死信佇列中。

重複次數過多,一直失敗,通過預警機制進行人工干預。

使用訊息中介軟體處理分布事務的關鍵是利用訊息中介軟體的訊息可靠性機制保證資料的一致性,但是有些mq不支援(如kafka)。真實業務場景中可靠性保證需要依賴具體業務方實現,生產者訊息confirm機制重發和消費者ack機制通知mq重發,都需要生產者和消費者自己處理,消費時需要注意訊息處理的冪等性。

這種處理分布式事務的方式:

優點:通用性、擴充套件性、方案成熟

缺點:只適合非同步場景、有延遲需要業務容忍

盡量避免分布式事務

盡量將非核心事務採用非同步處理

訊息中介軟體 MQ

1 為什麼需要訊息佇列mq 因為在高併發環境下,由於來不及同步處理,請求往往會發生阻塞,比如 大量的insert,update語句請求同時到達mysql,直接導致無數的行鎖鎖表,甚至最後的請求會堆積過多,從而觸發too many connections錯誤。通過使用訊息佇列,可以非同步的處理請求,從...

MQ訊息中介軟體

mq是message queue,就是訊息佇列。是進行通訊的中介軟體產品,可以把訊息佇列比作是乙個存放訊息的容器,呼叫的方法就是訊息,把方法存到佇列中然後從佇列中取出方法去執行。目前使用較多的訊息佇列有activemq,rabbitmq,kafka,rocketmq。訊息佇列的作用有非同步 削峰 解...

訊息中介軟體MQ

訊息中介軟體利用高效可靠的訊息傳遞機制進行平台無關的資料交流,並基於資料通訊來進行分布式系統的整合。通過提供訊息傳遞和訊息排隊模型,它可以在分布式環境下擴充套件程序間的通訊。對於訊息中介軟體,常見的角色大致也就有producer 生產者 consumer 消費者 訊息佇列中介軟體是分布式系統中重要的...