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

RocketMQ事務(wù)消息解析!

開發(fā) 架構(gòu)
事務(wù)消息是 RocketMQ 提供的一種消息類型,支持在分布式場(chǎng)景下保障消息生產(chǎn)和本地事務(wù)的最終一致性。RocketMQ?采用了2PC的思想來(lái)實(shí)現(xiàn)了提交事務(wù)消息,同時(shí)增加一個(gè)補(bǔ)償邏輯來(lái)處理二階段超時(shí)或者失敗的消息。

單體架構(gòu)下的事務(wù)

在單體系統(tǒng)的開發(fā)過(guò)程中,假如某個(gè)場(chǎng)景下需要對(duì)數(shù)據(jù)庫(kù)的多張表進(jìn)行操作,為了保證數(shù)據(jù)的一致性,一般會(huì)使用事務(wù),將所有的操作全部提交或者在出錯(cuò)的時(shí)候全部回滾。

以創(chuàng)建訂單為例,假設(shè)下單后需要做兩個(gè)操作:

?在訂單表生成訂單。

在積分表增加本次訂單增加的積分記錄。

在單體架構(gòu)下只需使用@Transactional開啟事務(wù),就可以保證數(shù)據(jù)的一致性。

@Transactional
    public void order() {
        String orderId = UUID.randomUUID().toString();
        // 生成訂單
        orderService.createOrder(orderId);
        // 增加積分
        creditService.addCredits(orderId);
    }

?

但在分布式架構(gòu)下,訂單系統(tǒng)和積分系統(tǒng)可能是兩個(gè)獨(dú)立的服務(wù),此時(shí)就不能使用上述的方法開啟事務(wù)了,因?yàn)樗鼈儾惶幱谕粋€(gè)事務(wù)中。

  • 在出錯(cuò)的情況下,無(wú)法進(jìn)行全部回滾,只能對(duì)當(dāng)前服務(wù)的事務(wù)進(jìn)行回滾。

所以就有可能出現(xiàn)訂單生成成功但是積分服務(wù)增加積分失敗的情況(也可能相反),此時(shí)數(shù)據(jù)處于不一致的狀態(tài)。

分布式架構(gòu)下的事務(wù)

以下單流程為例,在分布式架構(gòu)下的處理流程如下:

?訂單服務(wù)生成訂單。

發(fā)送訂單生成的MQ消息,積分服務(wù)訂閱消息,有新的訂單生成之后消費(fèi)消息,增加對(duì)應(yīng)的積分記錄。

普通MQ消息存在的問(wèn)題

?假如訂單創(chuàng)建成功,MQ消息發(fā)送成功,但是order方法在返回的前一刻,服務(wù)突然宕機(jī)。

由于開啟了事務(wù),事務(wù)還未提交(方法結(jié)束后才會(huì)正常提交)。

所以訂單表并未生成記錄,但是MQ卻已經(jīng)發(fā)送成功并且被積分服務(wù)消費(fèi),此時(shí)就會(huì)存在訂單未創(chuàng)建但是積分記錄增加的情況。

假如先發(fā)送MQ消息再創(chuàng)建訂單,如果MQ消息發(fā)送成功,創(chuàng)建訂單失敗,那么同樣處于不一致的狀態(tài)。

@Transactional
    public void order() {
        String orderId = UUID.randomUUID().toString();
        // 創(chuàng)建訂單
        Order order = orderService.createOrder(orderDTO.getOrderId());
        // 發(fā)送訂單創(chuàng)建的MQ消息
        sendOrderMessge(order);
        return;
    }

可以使用RocketMQ事務(wù)消息解決上述問(wèn)題。

RocketMQ事務(wù)消息基礎(chǔ)流程

?Apache RocketMQ在4.3.0版中已經(jīng)支持分布式事務(wù)消息。

事務(wù)消息是 RocketMQ 提供的一種消息類型,支持在分布式場(chǎng)景下保障消息生產(chǎn)和本地事務(wù)的最終一致性。

RocketMQ采用了2PC的思想來(lái)實(shí)現(xiàn)了提交事務(wù)消息,同時(shí)增加一個(gè)補(bǔ)償邏輯來(lái)處理二階段超時(shí)或者失敗的消息。

基本流程

?第一階段

  • 發(fā)送 Message,Half Message,即半事務(wù)消息。
  • 此類型的 Message 是不會(huì)被 Consumer 消費(fèi)。

第二階段:如果半事務(wù)消息投遞成功,則會(huì)開始執(zhí)行本地事務(wù)。

分為如下三種 Case:

  • 本地事務(wù)執(zhí)行成功:
  • 會(huì)向 Broker 發(fā)送 commit 消息,被 commit 過(guò)后的 Message 才能被 Consumer 消費(fèi)到。
  • 本地事務(wù)執(zhí)行失敗:
  • 會(huì)向 Broker 發(fā)送 rollback 消息,Broker 則會(huì)將剛剛投遞的半事務(wù)消息刪除,從而保證上下游數(shù)據(jù)的一致性。

  • 如果 Producer 實(shí)例或者網(wǎng)絡(luò)出現(xiàn)了問(wèn)題,Producer 沒(méi)能及時(shí)地將本地事務(wù)執(zhí)行的結(jié)果通知 Broker。

  • Broker 會(huì)通過(guò)掃描發(fā)現(xiàn)某條 Message 長(zhǎng)時(shí)間處于半事務(wù)消息狀態(tài)。

  • Broker 會(huì)主動(dòng)地向 Producer 詢問(wèn)此 Message 對(duì)應(yīng)的事務(wù)狀態(tài)。

值得注意的是:

?

RocketMQ 并不會(huì)無(wú)休止的的信息事務(wù)狀態(tài)回查,默認(rèn)回查 15 次。

如果 15 次回查還是無(wú)法得知事務(wù)狀態(tài),RocketMQ 默認(rèn)回滾該消息。

RocketMQ事務(wù)消息使用限制

?

事務(wù)消息不支持延時(shí)消息和批量消息。

事務(wù)性消息可能不止一次被檢查或消費(fèi),所以消費(fèi)者端需要做好消費(fèi)冪等。

事務(wù)消息的生產(chǎn)者 ID 不能與其他類型消息的生產(chǎn)者 ID 共享。

  • 與其他類型的消息不同,事務(wù)消息允許反向查詢、MQ服務(wù)器能通過(guò)它們的生產(chǎn)者 ID 查詢到消費(fèi)者。

RocketMQ事務(wù)消息基本原理

采用2PC兩階段設(shè)計(jì)。

?

將 Message 原本真實(shí)的 Topic 和 MessageQueue 進(jìn)行備份。

  • 放入到PROPERTY_REAL_TOPIC、PROPERTY_REAL_QUEUE_ID中保存。

將消息投遞到一個(gè)內(nèi)部Topic中RMQ_SYS_TRANS_HALF_TOPIC,該隊(duì)列專門存儲(chǔ)事務(wù)消息。

所有的 Half Message 全部都寫入到 queueId 為 0 的 MessageQueue。

因?yàn)橐粋€(gè) Topic 下只有 1 個(gè) MessageQueue:

  • 這個(gè) Topic 下的所有 Message 就是全局有序的,它們會(huì)按照先來(lái)后到的順序被消費(fèi)。

如果本地事務(wù)執(zhí)行成功進(jìn)行Commit,則將RMQ_SYS_TRANS_HALF_TOPIC 隊(duì)列中的消息投遞到真實(shí)的Topic中,供后續(xù)流程執(zhí)行。

  • 并刪除這條 Half Message ,但刪除也是假刪除,只是給 Message 打上一個(gè)刪除的 Tag。

如果本地事務(wù)執(zhí)行失敗進(jìn)行rollback,則直接刪除這條 Half Message ,但刪除也是假刪除。

如果本地事務(wù)遲遲沒(méi)有返回結(jié)果 (默認(rèn)時(shí)間是6s),則會(huì)觸發(fā)事務(wù)回查機(jī)制

  • 執(zhí)行回查之前需要校驗(yàn)檢查次數(shù)是否到達(dá)了最大值(需要手動(dòng)設(shè)置,沒(méi)有默認(rèn)值)。
  • 或者是當(dāng)前 Half Message 存在是否超過(guò)了 Message 保存的上限,即 3天。
  • 如果滿足上面條件中的一種Half Message 會(huì)被放進(jìn) TRANS_CHECK_MAX_TIME_TOPIC Topic 當(dāng)中。
  • 一旦判定為需要執(zhí)行事務(wù)回查邏輯,那么當(dāng)前這條 Half Message 就算已經(jīng)被消費(fèi)了。
  • 在沒(méi)達(dá)到最大的校驗(yàn)次數(shù)之前,都還需要將其投遞到事務(wù)隊(duì)列當(dāng)中,以便下次重試時(shí)再次執(zhí)行 Check 邏輯。
  • 如果回查成功則刪除投遞的 Half Message。

源碼解讀

發(fā)送事務(wù)消息調(diào)用的是TransactionMQProducer的sendMessageInTransaction方法:

主要有以下幾個(gè)步驟:

?獲取事務(wù)監(jiān)聽器TransactionListener,如果獲取為空或者本地事務(wù)執(zhí)行器LocalTransactionExecuter為空將拋出異常。

因?yàn)樾枰ㄟ^(guò)TransactionListener或者LocalTransactionExecuter來(lái)執(zhí)行本地事務(wù),所以不能為空。

在消息中設(shè)置prepared屬性,此時(shí)與普通消息(非事務(wù)消息)相比多了PROPERTY_TRANSACTION_PREPARED屬性。

調(diào)用send方法發(fā)送prepared消息也就是half消息,發(fā)送消息的流程與普通消息一致。

根據(jù)消息的發(fā)送結(jié)果判斷:

  • 如果發(fā)送成功執(zhí)行本地事務(wù),并返回本地事務(wù)執(zhí)行結(jié)果狀態(tài),如果返回的執(zhí)行狀態(tài)結(jié)果為空,將本地事務(wù)狀態(tài)設(shè)置為UNKNOW。
  • 發(fā)送成功之外的其他情況,包括FLUSH_DISK_TIMEOUT刷盤超時(shí)、FLUSH_SLAVE_TIMEOUT和SLAVE_NOT_AVAILABLE從節(jié)點(diǎn)不可用三種情況。
  • 此時(shí)意味著half消息發(fā)送失敗,本地事務(wù)狀態(tài)置為ROLLBACK_MESSAGE回滾消息。

調(diào)用endTransaction方法結(jié)束事務(wù)。

參考

《RocketMQ技術(shù)內(nèi)幕》

https://github.com/apache/rocketmq/blob/master/docs/cn/RocketMQ_Example.md。

https://github.com/apache/rocketmq/blob/master/docs/cn/design.md。

責(zé)任編輯:姜華 來(lái)源: 月伴飛魚
相關(guān)推薦

2023-07-17 08:34:03

RocketMQ消息初體驗(yàn)

2024-11-11 13:28:11

RocketMQ消息類型FIFO

2021-04-15 09:17:01

SpringBootRocketMQ

2021-10-03 21:41:13

RocketMQKafkaPulsar

2024-08-22 18:49:23

2024-09-25 08:32:05

2024-02-04 09:02:29

RocketMQ項(xiàng)目處理器

2023-09-04 08:00:53

提交事務(wù)消息

2024-10-11 09:15:33

2022-07-04 11:06:02

RocketMQ事務(wù)消息實(shí)現(xiàn)

2024-06-13 09:25:14

2024-10-22 08:01:15

2021-03-04 06:49:53

RocketMQ事務(wù)

2022-12-22 10:03:18

消息集成

2023-12-21 08:01:41

RocketMQ消息堆積

2022-03-31 08:26:44

RocketMQ消息排查

2023-07-18 09:03:01

RocketMQ場(chǎng)景消息

2025-04-09 08:20:00

RocketMQ消息隊(duì)列開發(fā)

2022-06-02 08:21:07

RocketMQ消息中間件

2020-11-13 16:40:05

RocketMQ延遲消息架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

免费在线精品视频| 久久久999国产| 天天人人精品| 果冻天美麻豆一区二区国产| 亚洲老妇xxxxxx| 九九热在线视频观看这里只有精品| 91视频在线看| 五月天网站亚洲| 激情成人在线视频| 精品欧美乱码久久久久久1区2区 | 另类中文字幕网| 亚洲成人男人天堂| 999国产精品视频| 久久国内精品一国内精品| yw193.com尤物在线| 国产精品日韩成人| 欧美精品卡一卡二| 日韩av电影天堂| 国产在线高清精品| 成人盗摄视频| 俺也去精品视频在线观看| 成人免费网站在线观看视频| 亚洲国产精品人人做人人爽| 精品久久久久av| 日本精品一区| 黄色电影免费在线看| 久久久噜噜噜久久中文字幕色伊伊| 精品欧美一区二区三区久久久| 免费av一区| 九九久久久久99精品| 久久99久久99精品免观看软件| 日韩亚洲欧美成人一区| 色播亚洲视频在线观看| 亚洲精品99| 国产精品亚洲美女av网站| 菁菁伊人国产精品| 欧美日韩电影在线观看| 色狠狠一区二区三区| 亚洲视频日韩精品| 久久成人免费观看| 国产一区二区美女诱惑| 亚洲欧美成人一区| 亚洲国产伊人| 亚洲人午夜精品免费| 成年男女免费视频网站不卡| 精品国一区二区三区| 牛牛精品在线视频| 91精品国产综合久久久久久| 精品51国产黑色丝袜高跟鞋| 欧美日韩中文另类| 日韩在线资源| 9191精品国产综合久久久久久 | 国产精品二区影院| 国产精品久久久久久久久久直播 | 欧美禁忌电影| 国产精品一区二区三区久久| 99精品全国免费观看视频软件| 91免费看国产| 国产欧美日韩综合一区在线播放| 热re99久久精品国99热蜜月| 美女任你摸久久| 国产二区视频在线| 国产精品久久久久久久久免费相片| 97在线免费| 香蕉成人啪国产精品视频综合网| 免费一级毛片在线观看| 欧美一区日本一区韩国一区| 99re6在线精品视频免费播放| 亚洲欧美中文在线视频| 欧美久久一区二区三区| 国产精品海角社区在线观看| 在线观看的日韩av| 在线看视频不卡| 久久久五月婷婷| 一区二区三区区四区播放视频在线观看 | 一本到不卡免费一区二区| 大片免费播放在线视频| 日韩丝袜美女视频| 中文成人激情娱乐网| 青青草原成人在线视频| 极品裸体白嫩激情啪啪国产精品| 亚洲一区二区精品在线| 国产无人区一区二区三区| 中文字幕视频在线免费| 日韩一区二区在线免费观看| 少妇精品视频在线观看| 国产精品视频公开费视频| 日本成人在线不卡视频| 成人免费观看毛片| 色噜噜狠狠成人中文综合| 日本欧美日韩| 国产精品小说在线| 韩国成人精品a∨在线观看| 国产成人在线精品| 国产一区日韩欧美| www.好吊操| 欧美日韩一区二区三区在线免费观看| 最新黄网在线观看| 午夜精品在线观看| 久久婷婷五月综合色丁香| 97香蕉久久超级碰碰高清版| 伊人久久大香线蕉综合热线| 欧美a在线视频| 欧美麻豆精品久久久久久| 北条麻妃一区二区三区在线| 国产日本一区二区三区| 久久综合九色综合97_久久久| xxxxx日韩| 午夜免费在线观看精品视频| 奇米四色…亚洲| 在线视频1区| 欧美乱大交xxxxx另类电影| 亚洲免费高清| 啦啦啦在线视频免费观看高清中文 | 日本一二三区视频免费高清| 亚洲欧洲美洲在线综合| 一本一道久久a久久精品蜜桃| 人妻熟妇乱又伦精品视频| 3d动漫精品啪啪一区二区竹菊| 日韩极品少妇| 国产www免费| 日韩一级片网址| 亚洲成av人片一区二区密柚| 亚洲老女人av| 色偷偷噜噜噜亚洲男人| 久久久综合网| 国产裸舞福利在线视频合集| 日本高清视频一区| 国产午夜亚洲精品午夜鲁丝片| 91超碰在线播放| 国产一区在线免费| 亚洲大片精品永久免费| 凹凸成人在线| 国产精品无码av在线播放| 日韩大陆毛片av| 制服诱惑一区二区| 色资源网站在线观看| 国产成人精品电影久久久| 久久精品视频网| 欧美成人aaa| 国产va亚洲va在线va| 精品免费99久久| 久久精品人人做人人爽电影蜜月| 噜噜噜噜噜在线视频| 国产精品香蕉av| 亚洲综合偷拍欧美一区色| 国产欧美三级电影| 亚洲五月天综合| 国产精品久久久久久亚洲毛片| 欧美影视资讯| 青少年xxxxx性开放hg| 亚洲成年人影院在线| 老司机亚洲精品| 制服丝袜在线播放| 日本一区二区不卡高清更新| 欧美二区在线观看| 老**午夜毛片一区二区三区 | 久久成人福利| 国产免费黄色av| 久久久999精品视频| 91在线视频在线| 久久国际精品| 日本在线观看免费视频| 久久久女女女女999久久| 中文字幕欧美区| 精品黄色一级片| 国产在线日本| 日韩福利在线| 国产亚洲成aⅴ人片在线观看| 国产精品久久久久77777丨| 霍思燕三级露全乳照| 精品激情国产视频| 欧美极品少妇xxxxⅹ高跟鞋 | 成人av免费在线| 99久久久成人国产精品| 亚洲一区二区蜜桃| 国产成人jvid在线播放| 精品国产91久久久久久| 99热在线精品观看| 中文字幕在线看片| 日本精品免费观看| 亚洲成av人片| 国产综合网站| 不卡av免费观看| 亚洲理论电影在线观看| 性色av一区二区三区红粉影视| 亚洲精品免费在线播放| 国产精品av一区二区| 91九色在线播放| 天天操,天天操| 亚洲综合av影视| 日韩精品视频免费在线观看| 国产亚洲成av人在线观看导航| 欧美日韩中文一区二区| 日本不卡视频| 韩国v欧美v日本v亚洲| 亚洲成在人线在线播放| 国产精品日韩欧美一区| 国产a亚洲精品| 欧美日韩最好看的视频|