日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

架构设计 | 基于消息中间件,图解柔性事务一致性

發(fā)布時(shí)間:2024/9/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 架构设计 | 基于消息中间件,图解柔性事务一致性 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
簡(jiǎn)介:分布式事務(wù)基于可靠消息最終一致性的實(shí)現(xiàn)方案,既然是可靠消息,則要求MQ必須支持事務(wù)管理,這樣才能保證業(yè)務(wù)前后一致性。

一、最大努力通知

TCC分段提交適用分布式架構(gòu)中對(duì)一致性、實(shí)時(shí)性要求較高的業(yè)務(wù)場(chǎng)景,在實(shí)際業(yè)務(wù)中也存在實(shí)時(shí)性比較低的業(yè)務(wù),例如常見(jiàn)的短信通知,客戶(hù)端消息,運(yùn)營(yíng)體系更新等業(yè)務(wù),這時(shí)候?yàn)榱藴p輕核心流程的復(fù)雜度和壓力,可以采取最大努力通知方式實(shí)現(xiàn)柔性事務(wù)的管理。

例如常見(jiàn)的第三方支付業(yè)務(wù)中,本地業(yè)務(wù)和支付端業(yè)務(wù)處理完成之后都會(huì)生成消息通知,基本流程如下:

  • 本地業(yè)務(wù)預(yù)處理完成之后;
  • 請(qǐng)求第三方支付服務(wù);
  • 支付操作成功對(duì)該賬號(hào)發(fā)送消息;
  • 支付服務(wù)回調(diào)本地業(yè)務(wù);
  • 本地業(yè)務(wù)生成系統(tǒng)通知消息;

上述流程的消息場(chǎng)景中有一些基礎(chǔ)特點(diǎn),在核心業(yè)務(wù)處理完成之后,發(fā)送消息通知,允許失敗,在指定時(shí)間段內(nèi)或者指定重試次數(shù)之后,允許消息丟失情況存在,即消息的不可靠性。

在實(shí)際的支付系統(tǒng)中,啟動(dòng)每日對(duì)賬校驗(yàn)時(shí)會(huì)對(duì)當(dāng)日的流水做校驗(yàn),如果發(fā)現(xiàn)支付流水有未完成的流程,會(huì)有狀態(tài)彌補(bǔ),后續(xù)可以繼續(xù)處理,這種手段在對(duì)賬中很常用。

二、可靠消息

分布式事務(wù)基于可靠消息最終一致性的實(shí)現(xiàn)方案,既然是可靠消息,則要求MQ必須支持事務(wù)管理,這樣才能保證業(yè)務(wù)前后一致性。

1、RocketMQ事務(wù)消息

RocketMQ在4.3版中開(kāi)始支持分布式事務(wù)消息,采用2PC的思想來(lái)實(shí)現(xiàn)了提交事務(wù)消息,同時(shí)增加一個(gè)補(bǔ)償邏輯來(lái)處理二階段超時(shí)或者失敗的消息,如下圖所示:

上圖說(shuō)明了事務(wù)消息的大致方案,其中分為兩個(gè)流程:正常事務(wù)消息的發(fā)送及提交、事務(wù)消息的補(bǔ)償流程。

1.1 發(fā)送及提交

(1)發(fā)送消息(half消息,即發(fā)送但不被消費(fèi));

(2)服務(wù)端響應(yīng)消息寫(xiě)入結(jié)果;

(3)根據(jù)發(fā)送結(jié)果執(zhí)行本地事務(wù),如果寫(xiě)入失敗,此時(shí)half消息對(duì)業(yè)務(wù)不可見(jiàn),本地邏輯不執(zhí)行;

(4) 根據(jù)本地事務(wù)狀態(tài)執(zhí)行Commit或者Rollback(Commit操作生成消息索引,消息對(duì)消費(fèi)者可見(jiàn))

1.1 補(bǔ)償流程

(1)對(duì)沒(méi)有Commit/Rollback的事務(wù)消息(pending狀態(tài)的消息),從服務(wù)端發(fā)起一次“回查”;

(2)Producer收到回查消息,檢查回查消息對(duì)應(yīng)的本地事務(wù)的狀態(tài);

(3)根據(jù)本地事務(wù)狀態(tài),重新Commit或者Rollback;

其中,補(bǔ)償階段用于解決消息Commit或者Rollback發(fā)生超時(shí)或者失敗的情況。

1.3 設(shè)計(jì)原理

在RocketMQ事務(wù)消息的主要流程中,一階段的消息如何對(duì)用戶(hù)不可見(jiàn)。其中,事務(wù)消息相對(duì)普通消息最大的特點(diǎn)就是一階段發(fā)送的消息對(duì)用戶(hù)是不可見(jiàn)的。那么,如何做到寫(xiě)入消息但是對(duì)用戶(hù)不可見(jiàn)呢?RocketMQ事務(wù)消息的做法是:如果消息是half消息,將備份原消息的主題與消息消費(fèi)隊(duì)列,然后改變主題為RMQ_SYS_TRANS_HALF_TOPIC。由于消費(fèi)組未訂閱該主題,故消費(fèi)端無(wú)法消費(fèi)half類(lèi)型的消息,然后RocketMQ會(huì)開(kāi)啟一個(gè)定時(shí)任務(wù),從Topic為RMQ_SYS_TRANS_HALF_TOPIC中拉取消息進(jìn)行消費(fèi),根據(jù)生產(chǎn)者組獲取一個(gè)服務(wù)提供者發(fā)送回查事務(wù)狀態(tài)請(qǐng)求,根據(jù)事務(wù)狀態(tài)來(lái)決定是提交或回滾消息。

2、最終一致性

基于上述RocketMQ事務(wù)消息可靠性的特點(diǎn),即可以實(shí)現(xiàn)某類(lèi)業(yè)務(wù)下事務(wù)的最終一致性。消息發(fā)送一致性是指產(chǎn)生消息的業(yè)務(wù)動(dòng)作與消息發(fā)送一致,也就是說(shuō)如果業(yè)務(wù)操作成功,那么由這個(gè)業(yè)務(wù)操作所產(chǎn)生的異步消息一定要發(fā)送出去,否則就業(yè)務(wù)失敗回滾,消息也會(huì)丟棄。

流程基本如下:

  • 發(fā)送half事務(wù)消息,無(wú)法被消費(fèi);
  • 本地業(yè)務(wù)代碼邏輯處理完成;
  • 發(fā)送確認(rèn)消息,標(biāo)識(shí)該消息可以消費(fèi);
  • 如果消息生產(chǎn)方異常,取消整體動(dòng)作;

該流程主要針對(duì)消息生產(chǎn)方,在實(shí)際開(kāi)發(fā)中,消息的消費(fèi)方也一樣很難處理,要保證最終一致性,必然會(huì)面對(duì)一個(gè)問(wèn)題,消費(fèi)方異常,消息不斷的重試,可能存在部分業(yè)務(wù)處理成功,部分業(yè)務(wù)處理失敗的情況,這時(shí)候就要解決服務(wù)接口的冪等性問(wèn)題。

三、冪等接口

1、冪等簡(jiǎn)介

編程中一個(gè)冪等操作的特點(diǎn)是其任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同。就是說(shuō),一次和多次請(qǐng)求某一個(gè)資源會(huì)產(chǎn)生同樣的作用影響。

在復(fù)雜的異步流程中,尤其注意失敗重試問(wèn)題,通常支付流程中,每次接口被請(qǐng)求,對(duì)每一步數(shù)據(jù)更新的操作,都會(huì)前置一步狀態(tài)查詢(xún)的流程,用來(lái)判斷下一步的數(shù)據(jù)更新是否該執(zhí)行。

2、冪等接口

在系統(tǒng)服務(wù)接口請(qǐng)求中,任何明確的接口響應(yīng),例如失敗或成功,這樣業(yè)務(wù)流程都好處理,但是例如支付場(chǎng)景如果請(qǐng)求超時(shí),如何判斷服務(wù)的結(jié)果狀態(tài):客戶(hù)端請(qǐng)求超時(shí),本地服務(wù)超時(shí),請(qǐng)求支付超時(shí),支付回調(diào)超時(shí),客戶(hù)端響應(yīng)超時(shí)等,或者基于MQ的不斷重試機(jī)制,在部分業(yè)務(wù)異常狀態(tài)下,始終沒(méi)有返回成功,則消息會(huì)一直重試。

這就需要設(shè)計(jì)流程化的狀態(tài)管理,尤其在消息重試機(jī)制下,很少會(huì)再次對(duì)重試的業(yè)務(wù)接口使用重度的事務(wù)控制,有些業(yè)務(wù)被執(zhí)行完畢,只需要判斷一個(gè)狀態(tài),下次消息重試跳過(guò)即可,只需要把未處理的業(yè)務(wù)補(bǔ)償處理即可,在重試機(jī)制下,在部分業(yè)務(wù)沒(méi)有全部執(zhí)行成功之前,消息會(huì)一直重試,直到最終全部完成。

四、源代碼地址

GitHub·地址 https://github.com/cicadasmile/data-manage-parent GitEE·地址 https://gitee.com/cicadasmile/data-manage-parent

原文鏈接:https://developer.aliyun.com/article/771735?

版權(quán)聲明:本文內(nèi)容由阿里云實(shí)名注冊(cè)用戶(hù)自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,阿里云開(kāi)發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請(qǐng)查看《阿里云開(kāi)發(fā)者社區(qū)用戶(hù)服務(wù)協(xié)議》和《阿里云開(kāi)發(fā)者社區(qū)知識(shí)產(chǎn)權(quán)保護(hù)指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫(xiě)侵權(quán)投訴表單進(jìn)行舉報(bào),一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。

總結(jié)

以上是生活随笔為你收集整理的架构设计 | 基于消息中间件,图解柔性事务一致性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。