国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

RocketMQ 事務消息初體驗

開發 前端
假如先發送消息,后修改訂單狀態,消息發送成功,訂單沒有執行成功,需要回滾整個事務(訂單數據事務回滾,積分服務消費時,需要先反查事務狀態,若事務提交,才能插入積分記錄)。

事務消息是 RocketMQ 的高級特性之一 。這篇文章,筆者會從應用場景、功能原理、實戰例子三個模塊慢慢為你揭開事務消息的神秘面紗。

1 應用場景

舉一個電商場景的例子:用戶購物車結算時,系統會創建支付訂單。

用戶支付成功后支付訂單的狀態會由未支付修改為支付成功,然后系統給用戶增加積分。

通常我們會使用普通消費方案,該方案能夠發揮 MQ 的優勢:異步和解耦 ,  同時架構設計非常簡單。

圖片圖片

  1. 用戶購物車結算時,系統創建支付訂單;
  2. 支付成功后,更新訂單的狀態從未支付修改為支付成功;
  3. 發送一條普通消息到消息隊列服務端;
  4. 積分服務消費消息,添加積分記錄。

但該方案有個非常直觀的缺點:容易出現不一致的現象。

  1. 假如先發送消息,后修改訂單狀態,消息發送成功,訂單沒有執行成功,需要回滾整個事務(訂單數據事務回滾,積分服務消費時,需要先反查事務狀態,若事務提交,才能插入積分記錄)。
  2. 假如先修改訂單狀態,后發送消息,訂單狀態修改成功,但消息發送失敗,需要補償操作才能保持最終一致。
  3. 假如先修改訂單,后發送消息,訂單狀態修改成功,但消息發送超時,此時無法判斷需要回滾訂單還是提交訂單變更。

我們看到,為了完善普通消費方案,業務層還需要做到兩點:補償機制和提供事務狀態查詢接口。

要做到這兩點,難不難呢?

不難,但是業務層代碼會比較混亂,更優的方案還是得從中間件層面解決。

2 功能原理

RocketMQ 事務消息是支持在分布式場景下保障消息生產和本地事務的最終一致性。交互流程如下圖所示:

圖片圖片

1、生產者將消息發送至 Broker 。

2、Broker 將消息持久化成功之后,向生產者返回 Ack 確認消息已經發送成功,此時消息被標記為"暫不能投遞",這種狀態下的消息即為半事務消息。

3、生產者開始執行本地事務邏輯。

4、生產者根據本地事務執行結果向服務端提交二次確認結果( Commit 或是 Rollback ),Broker 收到確認結果后處理邏輯如下:

  • 二次確認結果為 Commit :Broker 將半事務消息標記為可投遞,并投遞給消費者。
  • 二次確認結果為 Rollback :Broker 將回滾事務,不會將半事務消息投遞給消費者。

5、在斷網或者是生產者應用重啟的特殊情況下,若 Broker 未收到發送者提交的二次確認結果,或 Broker 收到的二次確認結果為 Unknown 未知狀態,經過固定時間后,服務端將對消息生產者即生產者集群中任一生產者實例發起消息回查。

  1. 生產者收到消息回查后,需要檢查對應消息的本地事務執行的最終結果。
  2. 生產者根據檢查到的本地事務的最終狀態再次提交二次確認,服務端仍按照步驟4對半事務消息進行處理。

筆者認為事務消息的精髓在于:

  1. 本地事務執行成功,消費者才能消費事務消息;
  2. 消息回查本身就是補償機制的實現,事務生產者需提供了事務狀態查詢接口。

3 實戰例子

為了便于大家理解事務消息 ,筆者新建一個工程用于模擬支付訂單創建、支付成功、贈送積分的流程。

首先,我們創建一個真實的訂單主題:order-topic 。

圖片圖片

然后在數據庫中創建三張表 訂單表、事務日志表、積分表。

圖片圖片

最后我們創建一個 Demo 工程,生產者模塊用于創建支付訂單、修改支付訂單成功,消費者模塊用于新增積分記錄。

圖片圖片

接下來,我們展示事務消息的實現流程。

1、創建支付訂單

調用訂單生產者服務創建訂單接口 ,在 t_order 表中插入一條支付訂單記錄。

圖片圖片

2、調用生產者服務修改訂單狀態接口

接口的邏輯就是執行事務生產者的 sendMessageInTransaction  方法。

圖片圖片

生產者端需要配置事務生產者和事務監聽器。

圖片圖片

發送事務消息的方法內部包含三個步驟 :

圖片圖片

事務生產者首先發送半事務消息,發送成功后,生產者才開始執行本地事務邏輯。

事務監聽器實現了兩個功能:執行本地事務和供 Broker 回查事務狀態 。

圖片圖片

執行本地事務的邏輯內部就是執行 orderService.updateOrder 方法。

方法執行成功則返回 LocalTransactionState.COMMIT_MESSAGE , 若執行失敗則返回 LocalTransactionState.ROLLBACK_MESSAGE 。

圖片圖片

需要注意的是: orderService.updateOrder 方法添加了事務注解,并將修改訂單狀態和插入事務日志表放進一個事務內,避免訂單狀態和事務日志表的數據不一致。

最后,生產者根據本地事務執行結果向 Broker 提交二次確認結果。

Broker 收到生產者確認結果后處理邏輯如下:

  • 二次確認結果為 Commit :Broker 將半事務消息標記為可投遞,并投遞給消費者。
  • 二次確認結果為 Rollback :Broker 將回滾事務,不會將半事務消息投遞給消費者。

3、積分消費者消費消息,添加積分記錄

當 Broker 將半事務消息標記為可投遞時,積分消費者就可以開始消費主題 order-topic 的消息了。

圖片圖片

積分消費者服務,我們定義了消費者組名,以及訂閱主題和消費監聽器。

圖片圖片

在消費監聽器邏輯里,冪等非常重要 。當收到訂單信息后,首先判斷該訂單是否有積分記錄,若沒有記錄,才插入積分記錄。

而且我們在創建積分表時,訂單編號也是唯一鍵,數據庫中也必然不會存在相同訂單的多條積分記錄。

4 總結

RocketMQ 事務消息是支持在分布式場景下保障消息生產和本地事務的最終一致性。

編寫一個實戰例子并不復雜,但使用事務消息時需要注意如下三點:

1、事務生產者和消費者共同協作才能保證業務數據的最終一致性;

2、事務生產者需要實現事務監聽器,并且保存事務的執行結果(比如事務日志表) ;

3、消費者要保證冪等。消費失敗時,通過重試、告警+人工介入等手段保證消費結果正確。

筆者會在后續的文章里,詳細解析事務消息的實現原理,敬請期待。

實戰代碼地址:

https://github.com/makemyownlife/rocketmq4-learning

責任編輯:武曉燕 來源: 勇哥java實戰分享
相關推薦

2024-10-29 08:34:27

RocketMQ消息類型事務消息

2021-04-15 09:17:01

SpringBootRocketMQ

2021-10-03 21:41:13

RocketMQKafkaPulsar

2009-08-01 09:06:35

UbuntuOneLinux開源操作系統

2009-03-09 15:12:39

XenServer安裝

2024-02-04 09:02:29

RocketMQ項目處理器

2023-09-04 08:00:53

提交事務消息

2010-11-22 10:31:17

Sencha touc

2011-05-30 15:12:10

App Invento 初體驗

2023-07-15 08:01:38

2022-07-04 11:06:02

RocketMQ事務消息實現

2013-05-28 10:22:03

2011-09-05 10:20:21

Sencha ToucAPP

2017-09-05 05:55:24

AWS ES集群大數據

2024-12-23 07:00:00

FastExcelEasyExcel開源框架

2009-07-21 13:08:08

iBATIS DAO

2025-04-10 07:30:43

2024-06-13 09:25:14

2010-12-13 11:39:39

2011-08-02 10:26:59

iOS 多線程 線程
點贊
收藏

51CTO技術棧公眾號

亚洲国产精品久久一线不卡| 亚洲视频一区在线观看| 国产精品久久国产精品| gratisvideos另类灌满| 99久久婷婷国产| 一道本视频在线观看| 亚洲一区日韩精品中文字幕| 亚洲国语精品自产拍在线观看| 国产欧美日本在线| 99国内精品久久久久久久| 成人国产精品日本在线| 日精品一区二区| 无码专区aaaaaa免费视频| 成人手机电影网| 久久撸在线视频| 日本二三区不卡| 黄色在线免费观看网站| 2019中文字幕全在线观看| 国产区一区二| 国产精品久久久久久久电影 | 欧美香蕉大胸在线视频观看| 青青草原国产在线| 欧美激情在线观看视频| 国产美女一区| 成人xxx免费视频播放| 日韩av综合中文字幕| 少妇久久久久| 欧美二区在线视频| 欧美丝袜自拍制服另类| 亚洲精品国产九九九| 亚洲综合欧美日韩| 日本电影亚洲天堂一区| 精品国内亚洲2022精品成人| 妞干网在线播放| 久久精品五月| 99色这里只有精品| 欧美日韩国产一区二区三区地区| 中文av在线全新| 97se在线视频| 久草这里只有精品视频| 天天插天天狠天天透| 最新国产精品拍自在线播放| 蜜桃一区二区三区四区| 亚洲成人基地| 日韩免费黄色av| 国产日韩欧美在线一区| 日本欧美一区| 最大av网站| 日本韩国欧美三级| 国产在线不卡一区二区三区| 杨幂一区欧美专区| 欧美xxxxxxxxx| 欧美极品videos大乳护士| 激情懂色av一区av二区av| 免费看av软件| 亚洲国产视频在线| 国产精品一区二区三区www| 琪琪久久久久日韩精品| www黄色在线| 久久综合伊人77777尤物| 99精品视频一区二区| 亚洲电影观看| 国产欧美 在线欧美| 日本福利一区二区| 国产日韩免费| 国产 日韩 欧美一区| 亚洲免费看av| 精品一区二区三区四区| 欧美激情日韩| 视频在线观看入口黄最新永久免费国产| 欧美黑人一区二区三区| 久久综合婷婷| 精品99又大又爽又硬少妇毛片| 久久综合久久美利坚合众国| 亚洲免费网站| 午夜无码国产理论在线| 久久av免费一区| 国产亚洲综合久久| 久久精品免费一区二区三区| 五月婷婷综合色| 国产资源在线一区| 免费观看成人网| 国产一区二区三区观看| 九九99九九精彩| 一区二区三区资源| 一区二区国产在线| 筱崎爱全乳无删减在线观看| 日韩欧美在线第一页| 91精品福利观看| 亚洲色图 在线视频| 国产综合色一区二区三区| 日韩一区二区在线观看视频| 久久精品亚洲麻豆av一区二区| 久久不卡日韩美女| 成人免费视频久久| 成人综合网网址| 亚洲美女性生活视频| 亚洲一区二区精品3399| 久久伊99综合婷婷久久伊| 日韩视频在线直播| 美女露隐私免费网站| 轻点好疼好大好爽视频| 91爱视频在线| 精品一区二区三区四区| 欧美性精品220| 欧美激情一区不卡| www.一区二区| 水蜜桃精品av一区二区| 精品丝袜在线| 黄色网在线免费观看| 中文字幕在线视频观看| 亚洲欧美国产中文| 欧美 日韩 国产在线观看| 艳母动漫在线免费观看| 99视频在线| www亚洲欧美| 一本久久综合亚洲鲁鲁| 国产精品中文欧美| 999精品视频在这里| 国产精品—色呦呦| 免费福利视频一区| 国产国语刺激对白av不卡| 成人性视频免费网站| 国产l精品国产亚洲区久久| 999久久久| 国产偷久久久精品专区| 国产91精品网站| 国产在线观看一区二区三区| 国产精品男人的天堂| 97人人模人人爽人人喊38tv| 国产精品久久久久77777| 国产精品一区二区三区免费视频 | 在线免费看黄| 大肉大捧一进一出好爽动态图| 日韩精品在线视频免费观看| www.中文字幕在线| 欧洲精品在线一区| 大片在线观看网站免费收看| 精品中文字幕一区| 国产精品免费一区豆花| 国产无套精品一区二区| 日韩在线视频在线观看| 麻豆tv在线播放| 日本一区二区免费高清视频| 新呦u视频一区二区| 777av视频| 四虎永久国产精品| 欧美日夜夜逼| 久久国产这里只有精品| 欧美在线一区二区三区四| 美女视频久久黄| 日韩精品一区国产麻豆| 日产精品一区二区| 91国内在线| 黄色欧美视频| 在线精品观看| 中文字幕日韩欧美一区二区三区| 日本丶国产丶欧美色综合| 亚洲国产黄色片| 性欧美xxxx交| 热久久99这里有精品| 中文字幕无线精品亚洲乱码一区 | 亚洲国产高清aⅴ视频| 疯狂欧美牲乱大交777| www日韩中文字幕在线看| 91影院在线免费观看视频| 少妇人妻大乳在线视频| 国产在线二区| 国产精品毛片久久| 一区二区三区中文| 亚洲一区二区三区四区在线免费观看| 夜夜精品视频一区二区| 亚洲精品视频免费在线观看| 成人av在线天堂| eeuss一区| 成人vr资源| 91论坛在线播放| 欧美精品一区在线观看| 国产亚洲精品久久飘花| 国产乱理伦片a级在线观看| 麻豆网站视频在线观看| 91精品啪在线观看国产18| 国产精品免费观看视频| 欧美精品一区在线播放| 玛丽玛丽电影原版免费观看1977| 国产精品666| 欧美hd在线| 亚洲精品视频免费观看| 午夜欧美大片免费观看| 先锋影音资源999| 欧美日韩国产在线观看网站| 91免费观看在线| 亚洲国产精品久久久久秋霞不卡 | 欧美不卡在线一区二区三区| 亚洲美免无码中文字幕在线| 看欧美ab黄色大片视频免费| 都市激情一区| 外国成人免费视频| 91福利在线播放| 久久国产精品免费观看|