1. 程式人生 > >阿里雲事務訊息使用

阿里雲事務訊息使用

事務訊息

更新時間:2018-11-08 13:58:22

    

★ 我的收藏

本頁目錄

本文主要介紹 MQ 事務的概念、適用場景以及使用過程中的注意事項。

概念介紹

  • 事務訊息:MQ 提供類似 X/Open XA 的分佈事務功能,通過 MQ 事務訊息能達到分散式事務的最終一致。
  • 半訊息:暫不能投遞的訊息,傳送方已經將訊息成功傳送到了 MQ 服務端,但是服務端未收到生產者對該訊息的二次確認,此時該訊息被標記成“暫不能投遞”狀態,處於該種狀態下的訊息即半訊息。
  • 訊息回查:由於網路閃斷、生產者應用重啟等原因,導致某條事務訊息的二次確認丟失,MQ 服務端通過掃描發現某條訊息長期處於“半訊息”時,需要主動向訊息生產者詢問該訊息的最終狀態(Commit 或是 Rollback),該過程即訊息回查。

適用場景

MQ 事務訊息適用於以下場景:

  • 幫助使用者實現類似 X/Open XA 的分佈事務功能,通過 MQ 事務訊息能達到分散式事務的最終一致。

使用方式

互動流程

MQ 事務訊息互動流程如下所示:

mq-transactional-msg

其中:

  1. 傳送方向 MQ 服務端傳送訊息。
  2. MQ Server 將訊息持久化成功之後,向傳送方 ACK 確認訊息已經發送成功,此時訊息為半訊息。
  3. 傳送方開始執行本地事務邏輯。
  4. 傳送方根據本地事務執行結果向 MQ Server 提交二次確認(Commit 或是 Rollback),MQ Server 收到 Commit 狀態則將半訊息標記為可投遞,訂閱方最終將收到該訊息;MQ Server 收到 Rollback 狀態則刪除半訊息,訂閱方將不會接受該訊息。
  5. 在斷網或者是應用重啟的特殊情況下,上述步驟4提交的二次確認最終未到達 MQ Server,經過固定時間後 MQ Server 將對該訊息發起訊息回查。
  6. 傳送方收到訊息回查後,需要檢查對應訊息的本地事務執行的最終結果。
  7. 傳送方根據檢查得到的本地事務的最終狀態再次提交二次確認,MQ Server 仍按照步驟4對半訊息進行操作。

說明:事務訊息傳送對應步驟 1、2、3、4,事務訊息回查對應步驟 5、6、7。

注意事項

  1. 事務訊息的 Producer ID 不能與其他型別訊息的 Producer ID 共用。與其他型別的訊息不同,事務訊息有回查機制,回查時MQ Server會根據Producer ID去查詢客戶端。

  2. 通過 ONSFactory.createTransactionProducer 建立事務訊息的 Producer 時必須指定 LocalTransactionChecker 的實現類,處理異常情況下事務訊息的回查。

  3. 事務訊息傳送完成本地事務後,可在 execute 方法中返回以下三種狀態:

    • TransactionStatus.CommitTransaction 提交事務,允許訂閱方消費該訊息。
    • TransactionStatus.RollbackTransaction 回滾事務,訊息將被丟棄不允許消費。
    • TransactionStatus.Unknow 暫時無法判斷狀態,期待固定時間以後 MQ Server 向傳送方進行訊息回查。
  4. 可通過以下方式給每條訊息設定第一次訊息回查的最快時間:

     
    1. Message message = new Message();
    2. // 在訊息屬性中新增第一次訊息回查的最快時間,單位秒。例如,以下設定實際第一次回查時間為 120 ~ 125 秒之間
    3. message.putUserProperties(PropertyKeyConst.CheckImmunityTimeInSeconds,"120");
    4. // 以上方式只確定事務訊息的第一次回查的最快時間,實際回查時間向後浮動0~5秒;如第一次回查後事務仍未提交,後續每隔5秒回查一次。

示例程式碼

關於收發事務訊息的示例程式碼,請參考以下文件: