事務型訊息總結

2021-10-24 10:55:33 字數 1521 閱讀 2132

事務當中執行操作就是要麼全都執行,要麼全都不執行。

(1)在單個系統的業務對資料庫的普通事務操作,比如轉賬場景使用者a給使用者b轉賬100元。我們先給a扣減100元,再給b增加100元。如果在spring下,只需給業務邏輯新增封裝的資料庫層的事務@transactional註解即可。

(2)但是在秒殺系統中的扣減庫存的應用場景:在redis中扣減庫存,非同步更新到mysql資料庫中去,這就需要保持redis和mysql的資料最終一致性。屬於分布式事務範疇。

(單個jvm,資料庫分庫分表或者多個jvm,服務拆分)

分布式事務解決方案有很多,本篇rocketmq事務訊息僅僅是其中的一種解決方案。

1、producer向 mq 服務端傳送訊息。

2、mq server 將訊息持久化成功之後,向傳送方 ack 確認訊息已經傳送成功,此時訊息為半訊息。

3、producer中executelocaltransaction()方法開始執行本地事務邏輯。

4、producer根據本地事務執行結果向 mq server 提交二次確認(commit 或是 rollback),mq server 收到 commit 狀態則將半訊息標記為可投遞,consumer最終將收到該訊息;mq server 收到 rollback 狀態則刪除半訊息,consumer將不會接受該訊息。

在斷網或者是應用重啟的特殊情況下,上述步驟4提交的二次確認最終未到達 mq server,經過固定時間60s後 mq server 將對該訊息發起訊息回查。

5、producer收到訊息回查後,需要檢查對應訊息的本地事務執行的最終結果。

6、producer根據檢查得到的本地事務的最終狀態再次提交二次確認,mq server 仍按照步驟4對半訊息進行操作。

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

思考:假如這個時候我們消費端失敗了怎麼辦呢?(這個問題後續有討論,消費失敗有2種,第一種是超時了,我們重試即可,第二種是真的處理失敗了?該怎麼辦呢?)

答:在rocketmq事務訊息如何使用的時候我們提到,如果消費失敗怎麼辦?消費失敗有2種,第一種是超時了,我們重試即可,第二種是真的處理失敗了?仔細思考下,這塊還是蠻複雜的,假如需要有7-8個業務模組呢,其中執行到第6個業務模組就失敗呢? 這種重試好幾次還是失敗,我們該如何處理呢???是回滾前面5個操作嗎?好複雜好複雜,為什麼rocketmq不提供自動回滾呢?

某位阿里員工給出一種說法:一般rocketmq會有訊息重試機制,如果反覆重試失敗,需要將訊息記錄日誌,人工分析日誌以解決該問題。但是反覆重試失敗的概率非常小。所以一般不會給出特定的解決方案。

1、2、

RocketMQ筆記3 事務型訊息

階段二 補償 詳細過程可以到參考文件中 component public class mqproducer private string nameaddr value private string topicname 事務型生成者 private transactionmqproducer tran...

RocketMQ 事務訊息

一 事務訊息實現方式 應用使用事務訊息的步驟 1 應用傳送訊息,使用prepare欄位標示準備訊息 2 應用執行本地業務邏輯 3 應用傳送事務提交或回滾訊息 broker收到prepare訊息後會將topic替換為rmq sys trans half topic,queueid替換為0,然後寫入co...

Seam擴充套件事務訊息

當事務成功之後 呼叫 persist update 或 remove 成功後 home物件會發出乙個 org.jboss.seam.aftertransactionsuccess 事件。通過監聽這一事件,我們可以在底層實體改變後,重新整理查詢。如果我們只需要在特定的實體儲存 修改或刪除後重新整理特定...