天天看點

基于RabbitMQ消息隊列的分布式事務解決方案(上)1 RabbitMQ2 分布式事務問題3 正确實作分布式事務(五步法)

1 RabbitMQ

一款分布式消息中間件,基于erlang開發, 具備語言級别的高并發處理能力。和Spring架構是同一家公司。支援持久化、高可用。

核心概念

  1. Queue: 真正存儲資料的地方
  2. Exchange: 接收請求,轉存資料
  3. Bind: 收到請求後存儲到哪裡
  4. 消息生産者:發送資料的應用
  5. 消息消費者: 取出資料處理的應用
基于RabbitMQ消息隊列的分布式事務解決方案(上)1 RabbitMQ2 分布式事務問題3 正确實作分布式事務(五步法)

2 分布式事務問題

分布式事務是一個業務問題,不能脫離具體場景。
  • 美團點評系統架構
基于RabbitMQ消息隊列的分布式事務解決方案(上)1 RabbitMQ2 分布式事務問題3 正确實作分布式事務(五步法)

多系統間的分布式事務問題

基于RabbitMQ消息隊列的分布式事務解決方案(上)1 RabbitMQ2 分布式事務問題3 正确實作分布式事務(五步法)

使用者下單生成訂單

基于RabbitMQ消息隊列的分布式事務解決方案(上)1 RabbitMQ2 分布式事務問題3 正确實作分布式事務(五步法)

需要傳遞訂單資料,由此産生兩個事務一緻性問題

基于RabbitMQ消息隊列的分布式事務解決方案(上)1 RabbitMQ2 分布式事務問題3 正确實作分布式事務(五步法)

錯誤案例

基于RabbitMQ消息隊列的分布式事務解決方案(上)1 RabbitMQ2 分布式事務問題3 正确實作分布式事務(五步法)

當接口調用失敗時

訂單系統事務復原,提示使用者操作失敗。

自以為這樣的接口調用寫法,就不會有分布式事務問題。

接口調用成功或失敗

都會産生分布式事務問題:

  • 接口調用成功

    訂單系統資料庫事務送出失敗,運單系統沒有復原,産生資料

  • 接口調用逾時

    訂單系統資料庫事務復原,運單系統接口繼續執行,産生資料

是以都會導緻資料不一緻問題。

3 正确實作分布式事務(五步法)

  • 之前都是訂單系統直接HTTP請求運單系統的接口,出問題了!
  • 基于RabbitMQ消息隊列的分布式事務解決方案(上)1 RabbitMQ2 分布式事務問題3 正确實作分布式事務(五步法)
  • 是以考慮發消息給MQ,異步暫存
基于RabbitMQ消息隊列的分布式事務解決方案(上)1 RabbitMQ2 分布式事務問題3 正确實作分布式事務(五步法)

3.1 整體設計思路

基于RabbitMQ消息隊列的分布式事務解決方案(上)1 RabbitMQ2 分布式事務問題3 正确實作分布式事務(五步法)

外賣下訂單後,慢慢等待運單中心資料生成,并非強制要求同時。但要保證:

  • 可靠生産

    保證消息一定要發送到Rabitmq服務

  • 可靠消費

    保證消息取出來一定正确消費掉

  • 最終使多方資料達到一緻。