《微服務(wù)架構(gòu)設(shè)計(jì)模式》讀書(shū)筆記---第四章:使用Saga管理事務(wù)

沒(méi)有事務(wù)處理就不可能保持?jǐn)?shù)據(jù)的一致性豁辉⊙羧幔跨越多個(gè)服務(wù)的操作焰枢,對(duì)于事務(wù)管理提出了更高的要求。

微服務(wù)架構(gòu)下的事務(wù)管理

我們熟知的一些編程框架和函數(shù)提供了API盔沫,用于顯示的開(kāi)始医咨、提交或回滾事務(wù)。例如架诞,Spring框架提供了注解的方式,采用@Transactional來(lái)讓方法調(diào)用干茉,自動(dòng)的在事務(wù)范圍內(nèi)完成谴忧。

在單體應(yīng)用中,只訪問(wèn)一個(gè)數(shù)據(jù)庫(kù),事務(wù)管理是簡(jiǎn)單明了的沾谓。
但是對(duì)于委造,微服務(wù)框架下,每個(gè)服務(wù)都有自己的數(shù)據(jù)庫(kù)均驶,在這種情況下昏兆。就需要跟尾高級(jí)的事務(wù)管理機(jī)制來(lái)管理事務(wù)。

分布式事務(wù)的挑戰(zhàn)

在多個(gè)服務(wù)妇穴、數(shù)據(jù)庫(kù)和消息代理間維護(hù)數(shù)據(jù)一致性的傳統(tǒng)方式是爬虱,分布式事務(wù)。它采用兩階段提交(two phase commit腾它, 2PC)來(lái)保證食物中所有參與方同時(shí)完成提交跑筝,或者失敗時(shí)同時(shí)回滾。

弊端:

  • 分布式事務(wù)瞒滴, 的事實(shí)標(biāo)準(zhǔn)X/Open XA曲梗。實(shí)現(xiàn)分布式事務(wù),要求數(shù)據(jù)庫(kù)妓忍,消息代理虏两,數(shù)據(jù)庫(kù)驅(qū)動(dòng),消息API世剖,都支持XA標(biāo)準(zhǔn)定罢。一些NoSQL數(shù)據(jù)庫(kù)(MongoDB),和流行的消息代理(RabbitMQ搁廓,Apache Kafka)引颈,不支持分布式事務(wù)。
  • 分布式事務(wù)境蜕,本質(zhì)是同步進(jìn)程間通信蝙场。會(huì)降低可用性。

使用Saga模式維護(hù)數(shù)據(jù)一致性

Saga是一種在微服務(wù)架構(gòu)中維護(hù)數(shù)據(jù)一致性的機(jī)制粱年。

Saga由一連串的本地事務(wù)組成售滤,每個(gè)本地事務(wù)負(fù)責(zé)更新自己的私有數(shù)據(jù)庫(kù),這些操作仍舊依賴于我們所熟知的ACID事務(wù)框架和函數(shù)庫(kù)台诗。

Saga使用補(bǔ)償是無(wú)來(lái)回滾所作出的改變完箩。
傳統(tǒng)ACID模式的一個(gè)重要特性是,如果業(yè)務(wù)邏輯檢測(cè)到違反業(yè)務(wù)規(guī)則拉队,可以輕松回滾事務(wù)弊知。
而Saga使用補(bǔ)償事務(wù),進(jìn)行回滾粱快。

Saga包含三種類(lèi)型的事務(wù):

  • 可補(bǔ)償性事務(wù)秩彤,可以使用補(bǔ)償事務(wù)回滾
  • 關(guān)鍵性事務(wù)叔扼,Saga執(zhí)行的關(guān)鍵點(diǎn),是最后一個(gè)可補(bǔ)償是無(wú)或者第一個(gè)可重復(fù)的事務(wù)
  • 可重復(fù)性事務(wù)漫雷,在關(guān)鍵事務(wù)之后的事務(wù)瓜富,保證可以成功。

Saga的協(xié)調(diào)模式

協(xié)同式

協(xié)同式降盹,把Saga的決策和執(zhí)行順序邏輯分布在Saga的每個(gè)參與方忠与柑,他們通過(guò)交換時(shí)間的方式來(lái)進(jìn)行溝通。

協(xié)同式的參與方蓄坏,使用發(fā)布/訂閱進(jìn)行交互价捧。這就需要考慮通信的可靠性。

  • 參與方操作的原子性:去報(bào)Saga參與方將更新其本地?cái)?shù)據(jù)庫(kù)和發(fā)布下一個(gè)事件作為數(shù)據(jù)庫(kù)事務(wù)的一部分剑辫。
  • 消息具備標(biāo)識(shí)干旧。讓其他參與方能夠正確的找到數(shù)據(jù)。

好處:

  • 實(shí)現(xiàn)簡(jiǎn)單
  • 松耦合妹蔽。消息的方式交互

弊端:

  • 更難理解椎眯。代碼不在同一個(gè)的位置。需要追蹤所有服務(wù)胳岂,才能完全了解整個(gè)事務(wù)的處理過(guò)程编整。
  • 服務(wù)之間的循環(huán)依賴關(guān)系。
  • 緊耦合的風(fēng)險(xiǎn)乳丰。每個(gè)Saga的參與方都需要訂閱所有影響他們的事件掌测。代碼的更新需要同步進(jìn)行。

編排式

編排式产园,把Saga的決策和執(zhí)行順序邏輯集中在一個(gè)Saga編排器類(lèi)中汞斧。Saga編排器,發(fā)出命令式消息給各個(gè)Saga參與方什燕,指示他們完成具體的工作粘勒,這個(gè)類(lèi)的唯一職責(zé)就是告訴Saga的參與方該做什么事情。
編排器與參與方的交互方式屎即,也是用命令/異步相應(yīng)的方式庙睡。

好處:

  • 依賴關(guān)系更簡(jiǎn)單。
  • 較少的耦合技俐。每個(gè)服務(wù)只需要實(shí)現(xiàn)對(duì)應(yīng)的API乘陪,不需要關(guān)注Saga參與方發(fā)布的事件 。
  • 改善關(guān)注點(diǎn)隔離雕擂,簡(jiǎn)化業(yè)務(wù)邏輯啡邑。實(shí)際的業(yè)務(wù)類(lèi),例如Order井赌,不知道Saga編排器的存在谣拣,更關(guān)注與自己的業(yè)務(wù)募寨。

弊端:
在編排器中存在集中的過(guò)多的業(yè)務(wù)邏輯的風(fēng)險(xiǎn)族展。其實(shí)就是編排器成為關(guān)鍵節(jié)點(diǎn)森缠。

解決隔離問(wèn)題

首先理解ACID。

  • 原子性(Atomicity)仪缸。原子性是指事務(wù)是一個(gè)不可分割的工作單位贵涵,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生恰画。
  • 一致性(Consistency)宾茂。事務(wù)前后數(shù)據(jù)的完整性必須保持一致。
  • 隔離性(Isolation)拴还。事務(wù)的隔離性是多個(gè)用戶并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí)跨晴,數(shù)據(jù)庫(kù)為每一個(gè)用戶開(kāi)啟的事務(wù),不能被其他事務(wù)的操作數(shù)據(jù)所干擾片林,多個(gè)并發(fā)事務(wù)之間要相互隔離端盆。
  • 持久性(Durability)。持久性是指一個(gè)事務(wù)一旦被提交费封,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變就是永久性的焕妙,接下來(lái)即使數(shù)據(jù)庫(kù)發(fā)生故障也不應(yīng)該對(duì)其有任何影響。

使用Saga弓摘,缺乏ACID事務(wù)中的隔離屬性焚鹊。這是因?yàn)椋坏┦聞?wù)提交韧献,每個(gè)Saga的本地事務(wù)所做的更新都會(huì)立即被其他Saga看到末患。
只會(huì)導(dǎo)致以下情況:

  • 丟失更新。其他Saga會(huì)在執(zhí)行時(shí)锤窑,更改該Saga的數(shù)據(jù)璧针。
  • 臟讀。其他Saga會(huì)再該Saga完成更新之前讀取舊數(shù)據(jù)果复。
  • 模糊或不可重復(fù)讀陈莽。一個(gè)Saga的兩個(gè)步驟讀取的數(shù)據(jù)卻不相同,可能會(huì)再兩次讀之間有另一個(gè)Saga進(jìn)行了更新虽抄。

有一些對(duì)策可以處理缺乏隔離的Saga設(shè)計(jì)走搁。

  • 語(yǔ)義鎖。應(yīng)用層程序級(jí)的鎖迈窟。方式是私植,可補(bǔ)償是無(wú)在起創(chuàng)建或者更新記錄的時(shí)候,設(shè)置標(biāo)志位车酣。這個(gè)標(biāo)志標(biāo)識(shí)該記錄尚未提交曲稼,且可能會(huì)發(fā)生更改索绪,用以防止其他事務(wù)處理該記錄。例如約定Order的狀態(tài)為*_PENDING贫悄,表示一個(gè)Saga正在處理該記錄瑞驱。
    而對(duì)于被阻塞的Saga,1.可以給用戶返回錯(cuò)誤窄坦,讓其重試唤反,或者2.等待記錄被其他Saga釋放。
  • 交換式更新鸭津。
  • 悲觀視圖彤侍。重新排序Saga的步驟,以最大限度的降低由于臟讀而導(dǎo)致的業(yè)務(wù)風(fēng)險(xiǎn)逆趋。
  • 重讀值盏阶。Saga在更新之前,重新讀取記錄闻书,驗(yàn)證是否未更改名斟。
  • 版本文件。記錄了對(duì)數(shù)據(jù)執(zhí)行的操作惠窄,以便可以對(duì)他們進(jìn)行重新排序蒸眠。Saga參與方,記錄收到的操作杆融,根據(jù)收到的操作楞卡,再重新排序。
  • 業(yè)務(wù)風(fēng)險(xiǎn)評(píng)級(jí)脾歇。低風(fēng)險(xiǎn)使用Saga蒋腮,高風(fēng)險(xiǎn)使用分布式事務(wù)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末藕各,一起剝皮案震驚了整個(gè)濱河市池摧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌激况,老刑警劉巖作彤,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乌逐,居然都是意外死亡竭讳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)浙踢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绢慢,“玉大人,你說(shuō)我怎么就攤上這事洛波∫扔撸” “怎么了骚露?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)缚窿。 經(jīng)常有香客問(wèn)我棘幸,道長(zhǎng),這世上最難降的妖魔是什么滨攻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任够话,我火速辦了婚禮,結(jié)果婚禮上光绕,老公的妹妹穿的比我還像新娘。我一直安慰自己畜份,他們只是感情好诞帐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著爆雹,像睡著了一般停蕉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钙态,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天慧起,我揣著相機(jī)與錄音,去河邊找鬼册倒。 笑死蚓挤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的驻子。 我是一名探鬼主播灿意,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼崇呵!你這毒婦竟也來(lái)了缤剧?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤域慷,失蹤者是張志新(化名)和其女友劉穎荒辕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體犹褒,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抵窒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了化漆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片估脆。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖座云,靈堂內(nèi)的尸體忽然破棺而出疙赠,到底是詐尸還是另有隱情付材,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布圃阳,位于F島的核電站厌衔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捍岳。R本人自食惡果不足惜富寿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锣夹。 院中可真熱鬧页徐,春花似錦、人聲如沸银萍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贴唇。三九已至搀绣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戳气,已是汗流浹背链患。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓶您,地道東北人麻捻。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像览闰,于是被迫代替她去往敵國(guó)和親芯肤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348