面試官問了我分布式事務,我感覺他有想給我40k的衝動

2021-01-18 小黑十一點半

前言


emm,今天本來沒準備發文的。突然發文的原因是因為,早上@碼海的號主發了下面這張圖片


好傢夥,這位兄臺白嫖了我的文章,然後換個標題轉發到了掘金上就上了首頁,閱讀,點讚等數據都很好。


哎,反觀我兩年前,發的這篇文章,至今還沒有一個點讚[苦澀][苦澀]


當然這哥們還給我留了原文章出處,現在更多情況就是直接複製粘貼,然後就成為他自己的文章了,關鍵是什麼,文章數據還比原作者還好[苦澀][苦澀]


昨天看到@沉默王二 二哥的文章,自己原創的文章發在知乎上被投訴成為不規範轉載,原連結還是一個抄襲者 CSDN 的文章???


垃圾知乎,一言不合就幹掉正義?



算了,不說這些不開心的啦,今天就重發下這篇文章,標題浮誇點,直接用這位白嫖者的標題,你白嫖我的文章,我用下你的標題,沒毛病吧~


標題雖然有點標題黨,不過文章真的是由內容的,之前@愛笑架構師雷架轉載這篇文章,沒想到閱讀數據還不錯。說真的要不是他轉載,我還忘了之前寫過這篇文章。。。

好了,不說了,不說了,要去上班了。


寫於2021.01.08 8點55


這次使用分布式事務框架過程中了學習了一些分布式事務知識,所以本文我們就來聊聊分布式事務那些事。首先我們先回顧下什麼是事務。

事務

什麼是事務?這個作為後端開發,日常開發中只要與資料庫有交互,肯定就會使用過事務。現在摘抄一段wiki的解釋,解釋下什麼是事務。

是資料庫管理系統執行過程中的一個邏輯單位,由一個有限的資料庫操作序列構成

資料庫系統具有事務特性,這是其有別與文件系統重要特性。傳統的文件系統,如果正在寫文件,作業系統突然崩潰,此時文件可能被破壞。資料庫系統引入事務特性,可以保證資料庫從一種狀態轉換為另一種狀態。在提交工作時,可以確保要麼所有修改都被保存,要麼所有都不保存。

通常一個事務會有多個讀寫操作構成。

事務具有四個基本特性,俗稱ACID。

A(Atomicity):原子性。事務會被當做一個整體,要麼所有語句都成功,要麼都失敗,不能存在部分語句成功,部分失敗的情況。

C(Consistenc):一致性。資料庫的狀態從一種狀態轉變為另外一種狀態,事務開始之前和是事務結束之後,資料庫完整性約束不變。什麼叫資料庫完整性約束不變?舉個例子,若一個表姓名欄位為唯一約束,若在事務提交或回滾後,姓名欄位變成非唯一了,這就破壞資料庫的完整性約束。

I(Isolation):隔離性。多個並發事務執行,互不影響。

D(Durability):持久性。事務提交之後,其對資料庫相關修改能永久保存在資料庫。所以該特性需要資料庫系統可以在崩潰時需要恢復時也能提交的數據都不丟失。

因此早期我們的系統只在存在一個數據源情況下,這個時候可以依靠資料庫系統事務來保證業務的正確性。

但是隨著業務的不斷擴展,我們業務的一個單表可能就存在千萬數據,在使用再使用一個資料庫實例,就會可能存在性相關能問題。這個時候我們就會考慮分庫分表。但是這樣就有可能導致,單個應用連接多個數據源的情況。如下圖示例。

上圖一次購買過程,商家餘額表與用戶餘額表處於兩個單獨的資料庫實例中,這樣單獨的事務能保證扣減商家餘額或用戶餘額要麼扣減成功,要麼扣減失敗。但是我們卻無法保證兩個事務同時成功或同時失敗。

還有一種情況,隨著系統越來越龐大,我們會選擇將系統應用拆分多個微服務,讓單個應用只操作一個數據源。這個時候我們就會碰到,一次業務調用,將會調用多個應用,每個應用單獨操作數據源的情況,如下圖。

這種情況下我們更加不能保證所有調用都成功。

由上面的例子下我們可以看出,隨著業務發展,傳統的單機事務已經無法滿足我們的業務的需求,這個時候我們就需要分布式事務來保證。

分布式事務

摘抄一段 wiki 上解釋。

A distributed transaction is a database transaction in which two or more network hosts are involved.

我們先來講下實現分布式事務一些理論基礎。

分布式事務技術理論

CAP 定理。在一個分布式系統(指互相連接並共享數據的節點的集合)中,當涉及讀寫操作時,只能保證一致性(Consistence)、可用性(Availability)、分區容錯性(Partition Tolerance)三者中的兩個,另外一個必須被犧牲。

摘錄極客時間從0開始學架構第22章解釋

雖然 CAP 理論定義是三個要素中只能取兩個,但放到分布式環境下來思考,我們會發現必須選擇 P(分區容忍)要素,因為網絡本身無法做到 100% 可靠,有可能出故障,所以分區是一個必然的現象。如果我們選擇了 CA 而放棄了 P,那麼當發生分區現象時,為了保證 C,系統需要禁止寫入,當有寫入請求時,系統返回 error(例如,當前系統不允許寫入),這又和 A 衝突了,因為 A 要求返回 no error 和 no timeout。因此,分布式系統理論上不可能選擇 CA 架構,只能選擇 CP 或者 AP 架構

BASE 理論,分別是以下三個單詞的縮寫。

Basically Available(基本可用):分布式系統在出現故障時,允許損失部分可用功能,保證核心功能可用。

Soft state(軟狀態):允許系統中存在中間狀態,這個狀態不影響系統可用性,這裡指的是CAP中的不一致。

Eventually consistent(最終一致性):最終一致是指經過一段時間後,所有節點數據都將會達到一致。

BASE 是對CAP 中 AP 方案的一種補充。在 BASE 中用軟狀態和最終一致,保證了延遲後的一致性。BASE 和 ACID 是相反的,ACID 是一種強一致性模型,而 BASE 卻是犧牲這種強一致性,允許數據短時間內不一致,最終一致性。

接下來我們看看分布式事務有哪幾種實現方案。

分布式事務實現方案

基於資料庫資源層面

基於業務層面

基於資料庫資源層面實現方案,由於存在多個事務,我們需要存在一個角色管理各個事務的狀態。我們將這個角色稱為協調者,事務參與者稱為參與者。參與者與協調者一般會基於某種特定協議,目前比較有名的為 XA 接口協議。基於協調者與參與者的思想設定,分別提出了 2PC 與 3PC 實現XA 分布式事務。

2PC 兩階段提交協議

如名字所知,這個過程主要分為兩步。

第一階段,協調者(事務管理器)將涉及到事務的進行預提交,這個時候資料庫資源開始被鎖定。參與者將 undo 與 redo 寫入事務日誌。第二階段,參與者(資源管理器)行提交事務,或者利用 undo 日誌回滾事務,釋放資源。

整個過程如下圖。

分布式事務提交成功場景:

分布式事務回滾場景:

該方案的優點為:實現比較簡單,主流資料庫都支持,強一致性。MySQL 5.5 以後基於 XA 協議實現.

相應該方案也存在缺點:

協調者的單點問題。若協調者在提交階段宕機,參與者一直在等待,就一直鎖定資源,一直阻塞。雖然可以重新選舉協調者,但是無法解決該問題。

同步阻塞時間過長,整個執行過程事務是阻塞的,直到提交完成,釋放資源,若在提交過程/回滾過程,因為網絡延時,參與者一直未收到指令,則參與者一直被阻塞。

數據不一致。第二階段,協調者發出第一個提交信號後後宕機,則第一個參與者提交事務,第二個參與者因為未收到協調者信號,無法進行事務提交。

於是針對 2PC 存在的缺點,提出改進方案,3PC。

3PC 三階段提交協議

三階段提交,在兩階段提交的基礎下,改進兩階段。三階段步驟如下。

CanCommit,協調者詢問參與者是否可以進行事務提交。

PreCommit ,若所有參與者可以進行事務提交,協調者下達 PreCommit 命令,參與者鎖定資源,並等待最終命令。

Do Commit,若第二階段全部回應 ack,則下達 Do Commit ,進行事務最終提交,否則下達中斷事務命令,所有參與者進行事務回滾。

具體見下圖。

三階段提交對比兩階段,引入超時機制減少事務阻塞,解決單點故障。在第三階段,一旦參與者無法接受到協調者信號時,等待超時之後,參與者默認執行 commit,釋放資源。

三階段任然不能解決數據一致性問題。若協調者發出回滾命令,但是由於網絡問題,參與者在等待時間內都無法接收到,這時參與者默認提交事務,而其他事務進行了回滾,造成事務不一致。

TCC

TCC 事務

為了解決在事務運行過程中大顆粒度資源鎖定的問題,業界提出一種新的事務模型,它是基於業務層面的事務定義。鎖粒度完全由業務自己控制。它本質是一種補償的思路。它把事務運行過程分成 Try、Confirm / Cancel 兩個階段。在每個階段的邏輯由業務代碼控制。這樣就事務的鎖粒度可以完全自由控制。業務可以在犧牲隔離性的情況下,獲取更高的性能。

TCC 分別為 Trying,Confirm,Cancel 三個單詞縮寫。不同於 2PC 與 3PC 基於資料庫層面,TCC 基於應用層面。TCC 三個動作分別為:

Trying:

完成所有業務檢查(一致性)

預留必須業務資源(準隔離性)

Confirm:

Cancel:

釋放Try階段預留的業務資源

Cancel操作要滿足冪等性

上面說法,一聽起來有點生澀難懂,沒關係我們使用實際案例解釋。

下面我們模擬商城一次支付過程。用戶下單使用組合支付,即餘額加紅包支付。一次正常流程為:

創建訂單

下單

調用餘額系統,扣減餘額

調用紅包系統,扣減紅包餘額

修改訂單狀態為已支付

完後支付。

實際過程如下圖。

但是這麼一個支付過程調用多個子服務,我們不能保證所有服務都能成功,比如我們在調用紅包系統扣減紅包系統失敗。這個時候我們就碰到尷尬的場景,由於紅包服務失敗,導致方法異常退出,這個時候訂單狀態為初始狀態,但是用戶餘額已經扣減。這對用戶體驗非常不友好。所以這次支付過程,我們必須存在機制將這次過程當成一次整體的行為,必須保證這其中服務調用,要麼都成功,要麼都失敗,成為一個整體的事務。

這時我們可以引入 TCC 事務,將整個下單過程作為一個整體。引入後,由於餘額系統扣減是失敗,這個時候我們回滾訂單系統與紅包系統。整個過程如下圖。

由於餘額系統的失敗,我們需要撤銷這次過程中所有更改,所以我們向訂單系統發送撤銷通知,向紅包系統發出撤銷通知。

因此系統引入 TCC 事務後,我們需要改造我們的調用過程。

系統如何引入 TCC 事務

根據 TCC 事務三步,這個時候我們必須將各個服務改造成 Try Confirm Cancle 三步、

TCC TRY:

根據上面的業務,訂單系統增加 try 方法將訂單狀態修改成 PAYING。餘額系統增加一個 try 方法,先檢查用於餘額是否充足,然後先將餘額扣減,然後將扣減的餘額增加到凍結金額。紅包系統同餘額系統。從改造過程可以看出,TCC try 方法需檢查各業務資源,且這過程需要引入中間狀態。我們根據下圖來看整個過程。

TCC Confirm:

TCC 第一步 TRY 如果所有子服務調用都成功,這個時候我們就需要確認各服務。各個服務增加 confirm 方法。如餘額系統 confirm 方法用來將凍結金額置為0,紅包系統如上。訂單系統將訂單狀態修改為 SUCCESS。confirm 方法需要注意實現冪等。如訂單系統更新前,一定要先判斷該筆訂單狀態處於 PAYING,才能更新訂單。整個過程如下圖。

講到這裡,必須用到 TCC 事務框架推動各服務。TCC 事務管理器感知到 TRY 方法結束後,自動調用各服務提供的 confirm 方法,將各服務狀態修改為終態。

TCC Cancle:

如若 TCC Try 過程中,凍結紅包方法失敗,這時我們就需要將之前修改都撤銷,修改成其初始狀態。cancle 方法也需要實現冪等如 confirm 方法 如下圖:

看到這,我們我們可以看出 TCC Try 成功,confirm 必定要成功,try 失敗,cancle 必定要成功。因為 confirm 是系統更新為終態的關鍵。但是現實這麼無情,生產系統 confirm 或 cancle 肯定會有機率失敗,這個時候就需要 TCC 框架記錄調用 confirm 結果。如果 confirm 調用失敗,TCC 框架需要記錄下來,然後間隔一定時間再次去調用。

總結與思考

看完全文,基本上對分布式事務又一定了解了吧。

我們基於此對此總結下。使用分布式事務,我們需要結合我們實際場景應用。

如果業務還處於開始階段,我們其實可以選擇資料庫事務來保證快速上線迭代。

等到業務一定階段,系統開始拆分,資料庫也拆分,這時如果業務需要保證一致性,這時必須使用分布式事務。這時候使用分布式事務,我們需要基於業務考慮使用哪種。

使用 2PC 或 3PC 實現的分布式框架,業務應用層無需改動,接入較簡單。但是相對應能較低,數據資源鎖定較長。不太適合網際網路等高並發業務場景。

而使用基於 TCC 實現分布式框架,相對 2PC 性能較高,可以保證數據最終一致性。但是對於應用層來說,一個方法必須改造成三個方法,且業務中需引入一些中間狀態,相對而言應用改造程度較大。


如果覺得好的話,請幫作者點個讚唄~ 謝謝


喜歡本文的讀者們,歡迎長按關注訂閱號小黑十一點半~

讓我與你分享程序那些事。


我的夢想是做科學家,你支持我嗎?

相關焦點

  • 面試官問:你有什麼要問我的嗎?若希望稱心如意,這4個問題你應問清楚
    在我們求職面試的過程中,面試官若問道:「你還有什麼需要問我的嗎?」我想了解一下品質部目前存在的主要問題有哪些?「 你提這樣的問題,能讓面試官感覺到你的確是有管理崗位歷練的人並且具備管理思維。 二、哪些問題不適合提? 1、不要回答說:」我沒有什麼好問的了。
  • 上海面試官:我出生到現在已經吹了233支生日蠟燭,請問我幾歲?
    在找工作的時候,那一定要面對的一關就是面試。即使你在面試之前,自己的想法再周全,想要通過一場面試也不是很容易的。小峰是一名剛剛畢業的大學生,他在畢業了以後,和很多大學生一樣開始自己找工作,因為自己沒有工作經驗,所以他遭到了很多公司的拒絕,但是他沒有放棄,終於在一天他在58同城上投遞簡歷後收到了一家商務公司的面試邀請,可把他高興壞了。
  • 面試官:20年前我20歲,20年後我多少歲?本科生回答39歲被淘汰!
    面試官:20年前我20歲,20年後我多少歲?回答39歲直接被淘汰!隨著社會壓力越來越大,職場競爭越來越激烈,很多大學生畢業後面臨著嚴峻的就業形勢。想要進入心儀的公司,必須先經過一場面試。為了選出優秀的未來員工,面試官針對行業特點和崗位需求,往往會設計出許多意味深長的面試題,想要通過面試獲得一份好的工作,求職者必須認真思考才能脫穎而出,得到企業的青睞!李暖是一個95後小夥,今年剛剛從大學畢業,剛剛踏出社會,不得不面對找工作的難題。他首先根據自己的自畫像,精心製作了一份特色專長突出的面試簡歷,隨後給他符合他就業意願的公司投去。
  • 面試官問你對於加班的看法?怎樣回答最得體,面試官最滿意
    金九銀十的招聘季,又到了面試的季節,在面試的時候,前面問的差不多了,這個時候,面試官會問:「你對加班有什麼看法? 」雖然當你聽到對方問你這個問題的時候,內心就「這看來是個要加班的公司了」。在工作中,每個人對於加班有不同的看法,甚至同一個人不同事情都會有不同的看法,年輕的時候,希望通過加班多學習,到了中年,則要兼顧家庭,越是希望少加班。
  • 問你職業規劃是什麼?原來這才是面試官想知道的
    求職面試時候被問到職業規劃,面試官(不論是經理還是HR),他們其實真的是想了解什麼內容?A、你個人的宏圖大志?B、你未來的成就方便他提前巴結?C、你的眼光格局?D、如果你得到這份工作,工作思路如何,打算怎麼幹!
  • 揭秘小公司出身的我是怎樣拿下網際網路大公司offer,滿滿的都是套路
    大家都想進大公司,畢竟大公司的待遇和前景等都是優於小公司的,下面為大家揭秘,一個不知名的小公司java程式設計師,原先年薪不到15萬,通過自己的努力不斷的提升技術,最終收穫多個知名網際網路公司的Offer,年薪達到30多萬!
  • 面試時遇到的奇葩經歷,網友:老闆說我八字克他
    面試時遇到的奇葩經歷,網友:老闆說我八字克他無論你是剛出社會的應屆畢業生,還是身經百戰的職場老專家,都在求職這條道路上,會遇到很多奇葩的情況。如何節省不必要的應聘時間,就看各位的火眼金睛了。來自網友海小仙兒留言:在面試的時候,突然問我生日的具體時間,最後面試沒通過,HR告訴我老闆算了你的八字太硬!會克他!在小編看來,老闆果然是老闆,想的問題都比較深遠,希望老闆真的能找到屬於自己的貴人去上班吧!來自網友小哪吒的留言:某企業終面,部門領導問我數理化都學得怎麼樣?我說都還好。領導說:小夥子你讓我驚喜,我也會給你一個驚喜。
  • 面試官:告訴我,成語緩兵之計是什麼意思?小姑娘神回復六個字
    面試官:告訴我,成語緩兵之計是什麼意思?小姑娘神回復六個字哈嘍,大家好,歡迎大家來到這裡,我是小清,每天給您帶來最新最有意思的職場小故事,每天都會推送,記得點擊關注我哦。職場中,想要進入一家公司上班,或許需要你有一些經驗,或者你得對產品了解,或者你有一些技術。但其實最主要的,是你要先通過公司的面試。
  • 面試官:日月一同來,不是「明」是什麼字?專科生:我能寫3個
    面試官:日月一同來,不是「明」是什麼字?專科生:我能寫3個隨著職場各行業的飛速發展,公司越來越需要有自主性,有獨立思維的全能型人才。可是如今社會同質化太嚴重,想要找到一個適合崗們的人才也是不那麼容易的。
  • 女面試官:我昨晚夢到抬棺材,什麼意思?90後「另類」回復被錄用
    當然,一個聰明的求職者肯定會懂得如何應對面試官們的這一些奇葩提問,下面就有這樣的一個面試現場的例子,值得我們好好學習,一起來看看吧!近日,某公司需要招聘一名行政助理的崗位,有三位求職者參加了這樣的一場面試。但是因為求職者的履歷都各有千秋各有特色,所以面試官一時難以抉擇,究竟該錄用誰作為他們公司的行政助理。
  • 面試官:個字加一筆是什麼字?90後小夥:我能說三個字
    為了能在眾多的面試者中選取適合自己公司的職員,面試官們也在學習進步中。所以如今在面試中,考核我們的內容不僅是很多專業知識,更多的是增加了專業知識除外的內容。小李是名剛畢業的大學生,畢業之後他便向各家公司投簡歷,幸運的是,他收到了一家大公司面試邀請,這是一家發展前景很不錯的公司,小李決定去這家公司試一試。
  • 面試被拒,HR告訴我「星座不合、八字太硬」?
    甚至還做了一套心理測試和數獨,雖然他也不知道這跟廣告策劃有什麼關係。一場面試下來,他覺得自己對答如流,信心滿滿,感覺明天就能入職。這時,HR突然問他是什麼星座,他回答:「雙魚座。」HR卻說:「不好意思,我們認為只有雙子座、天秤座和射手座適合做策劃。」這位粉絲一頭霧水,滿腦袋黑人問號。???
  • 科比-布萊恩特凱爾特人面試【在我做夢的時候,我夢到的是籃球】
    科比面試凱爾特天 1996年,科比-布萊恩特參加凱爾特人的選秀試訓 面試官問科比關於凱爾特人的問題: 主教練ML-卡爾被小科比嚇到了,這個小屁孩比他自己還了解凱爾特人的歷史。拉塞爾到伯德,某一年某一場經典戰役,某個球員特別的技術細節,科比無所不知。面試官非常享受地聽著,整場面試持續了一個小時,是其他試訓球員的幾倍。
  • 面試官:「我想你」加哪兩個字最扎心?女研究生霸氣回答,被錄取
    導語:面試官: 「我想你」加哪兩個字最扎心?我的室友茜茜是剛畢業的女研究生,平時在學校裡面,就她的鬼點子最多,後來畢業了之後她接到了一家企業的面試邀請,讓我們很多同學都很羨慕,後來她到那裡面試的時候才發現,原來對方採用的面試方式是如此的奇葩!而且當時除了她之外,其他人的回答都被劃掉了。面試官:「我想考驗一下你們的腦力」在「我想你」中加入哪兩個字最扎心?期待你們的回答。
  • 面試官:請用30秒時間讓我記住你,小夥說了3個詞,HR豎起大拇指
    面試時,有時候會聽到面試官問你這樣的問題:請用30秒時間(也可能是15秒,總之是非常短的時間)讓我記住你。遇到這樣的問題時,應該如何回答呢?今天我們一起來分析一下。不要作妖是第一要務……當你聽到這個問題時,我建議您收起一切作妖的念頭。不管是拿起桌上的一杯水直接潑過去,還是抽出紙巾來幫他把臉上的水擦掉。
  • 面試官的刁鑽問題,有哪些回答套路?
    1、套路A——從工作內容出發:如果你已經是二面三面,甚至面過了直線經理,對崗位需求有 個比較清晰的認識,可以直截了當的從崗位需求出發分析自己的長處,這樣會讓面試官感覺你對這個崗位已經瞭若指掌。……謝謝,您提到了A和B亮點,正如我之前向您介紹的,這兩點恰恰是我的強項(如果是弱項,就問應該如何提高和改善,展示好學的一面)……(舉例證明)如果你博得了面試官的好感,雙方談笑風生的話,候選人甚至可以在面試結束前再補一句:我冒昧問一句,如您所說,您也面試了一些候選人,您覺得我的機會大嗎?
  • 面試官:「我愛你」中加上哪兩個字最傷人?美女高情商作答被錄取
    每個人進入社會找工作都會經歷一個階段,那就是面試。最讓人感到頭疼的就是面試這一關怎麼攻破,作為一個求職者需要做好的就是如何讓面試官願意接受自己,面試官除了對面試者進行專業的技能,專業的知識等能力的測試之外,還會進行其他一些另類的測試,從而達到尋找更優秀的人才的目的。
  • 面試官問「你有什麼特長」,這三種回答堪稱完美,拿走不謝
    為尋得一份稱心如意的工作,許多人開啟面試模式,一場面試接著一場面試。雖說每次面試企業不同,但遇到的問題卻大同小異。今天我們就來談談面試中出鏡率最高的一個問題,即你有什麼特長/優勢該如何回答?按理說,都已經到找工作的年齡了,特長優勢一大堆才對。然而,很多人前思後想之後,發現自己並沒有能拿出手的特長。但面試官問了,又不能說硬著頭皮說:我沒有。這多尷尬啊,並且還會給面試官留下不好的印象。
  • 面試官問「你有什麼缺點」這些雷千萬不要踩!3條保命指南快收藏
    1、面試官問你有什麼缺點,到底考的是什麼?(1)考你是否與崗位匹配舉個例子,如果你來面試銷售崗,面試官問你有什麼缺點,你回答的支支吾吾,半天也說不出所以然,或者你既然回答上來,說平常不愛熱鬧,喜歡一個人呆者。你的這些表現,與銷售崗位的要求經常與人打交道,口齒伶俐要求,相差甚遠。面試官通過你的表現,知道你的缺點。
  • 面試官問你的缺點是什麼,別只會支支吾吾,高手這樣回
    面試官問你的缺點是什麼,別只會支支吾吾,高手這樣回我們在進行面試的時候,總會遇到一些比較奇葩的面試問題。比如說如果有八個梨子,你怎樣把它分給五個人 且每個人所分到的數量是一樣多的?有的面試問題則會是問你有什麼樣的缺點。當我們遇到這種問題,通常會感到啞口無言。那麼我們究竟應該怎麼回答,才能使面試官滿意呢?閱讀以下三點,讓你面試順利通過。