主頁 >  其他 > 一文解讀分布式事務 (轉)

一文解讀分布式事務 (轉)

2020-09-22 05:48:46 其他

這篇文章將介紹什么是分布式事務,分布式事務解決什么問題,對分布式事務實作的難點,解決思路,不同場景下方案的選擇,通過圖解的方式進行梳理、總結和比較,

相信耐心看完這篇文章,談到分布式事務,不再只是有“2PC”、“3PC”、“MQ的訊息事務”、“最終一致性”、“TCC”等這些知識碎片,而是能夠將知識連成一片,形成知識體系,

什么是事務

介紹分布式事務之前,先介紹什么是事務,

事務的具體定義

事務提供一種機制將一個活動涉及的所有操作納入到一個不可分割的執行單元,組成事務的所有操作只有在所有操作均能正常執行的情況下方能提交,只要其中任一操作執行失敗,都將導致整個事務的回滾,

簡單地說,事務提供一種“ 要么什么都不做,要么做全套(All or Nothing)”機制,

資料庫事務的 ACID 屬性

事務是基于資料進行操作,需要保證事務的資料通常存盤在資料庫中,所以介紹到事務,就不得不介紹資料庫事務的 ACID 特性,

ACID 指資料庫事務正確執行的四個基本特性的縮寫,包含:

原子性(Atomicity)

整個事務中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環節,

事務在執行程序中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣,

例如:銀行轉賬,從 A 賬戶轉 100 元至 B 賬戶,分為兩個步驟:

  • 從 A 賬戶取 100 元,
  • 存入 100 元至 B 賬戶,

這兩步要么一起完成,要么一起不完成,如果只完成第一步,第二步失敗,錢會莫名其妙少了 100 元,

一致性(Consistency)

在事務開始之前和事務結束以后,資料庫資料的一致性約束沒有被破壞,

例如:現有完整性約束 A+B=100,如果一個事務改變了 A,那么必須得改變 B,使得事務結束后依然滿足 A+B=100,否則事務失敗,

隔離性(Isolation)

資料庫允許多個并發事務同時對資料進行讀寫和修改的能力,如果一個事務要訪問的資料正在被另外一個事務修改,只要另外一個事務未提交,它所訪問的資料就不受未提交事務的影響,

隔離性可以防止多個事務并發執行時由于交叉執行而導致資料的不一致,

例如:現有有個交易是從 A 賬戶轉 100 元至 B 賬戶,在這個交易事務還未完成的情況下,如果此時 B 查詢自己的賬戶,是看不到新增加的 100 元的,

持久性(Durability)

事務處理結束后,對資料的修改就是永久的,即便系統故障也不會丟失,

簡單而言,ACID 是從不同維度描述事務的特性:

  • 原子性:事務操作的整體性,
  • 一致性:事務操作下資料的正確性,
  • 隔離性:事務并發操作下資料的正確性,
  • 持久性:事務對資料修改的可靠性,

一個支持事務(Transaction)的資料庫,需要具有這 4 種特性,否則在事務程序當中無法保證資料的正確性,處理結果極可能達不到請求方的要求,

什么時候使用資料庫事務

在介紹完事務基本概念之后,什么時候該使用資料庫事務?

簡單而言,就是業務上有一組資料操作,需要如果其中有任何一個操作執行失敗,整組操作全部不執行并恢復到未執行狀態,要么全部成功,要么全部失敗,

在使用資料庫事務時需要注意,盡可能短的保持事務,修改多個不同表的資料的冗長事務會嚴重妨礙系統中的所有其他用戶,這很有可能導致一些性能問題,

什么是分布式事務

介紹完事務相關基本概念之后,下面介紹分布式事務,

分布式產生背景與概念

隨著互聯網快速發展,微服務,SOA 等服務架構模式正在被大規模的使用,現在分布式系統一般由多個獨立的子系統組成,多個子系統通過網路通信互相協作配合完成各個功能,

有很多用例會跨多個子系統才能完成,比較典型的是電子商務網站的下單支付流程,至少會涉及交易系統和支付系統,

而且這個程序中會涉及到事務的概念,即保證交易系統和支付系統的資料一致性,此處我們稱這種跨系統的事務為分布式事務,

具體一點而言,分布式事務是指事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位于不同的分布式系統的不同節點之上,

舉個互聯網常用的交易業務為例:

上圖中包含了庫存和訂單兩個獨立的微服務,每個微服務維護了自己的資料庫,

在交易系統的業務邏輯中,一個商品在下單之前需要先呼叫庫存服務,進行扣除庫存,再呼叫訂單服務,創建訂單記錄,

可以看到,如果多個資料庫之間的資料更新沒有保證事務,將會導致出現子系統資料不一致,業務出現問題,

分布式事務的難點

事務的原子性

事務操作跨不同節點,當多個節點某一節點操作失敗時,需要保證多節點操作的要么什么都不做,要么做全套(All or Nothing)的原子性,

事務的一致性

當發生網路傳輸故障或者節點故障,節點間資料復制通道中斷,在進行事務操作時需要保證資料一致性,保證事務的任何操作都不會使得資料違反資料庫定義的約束、觸發器等規則,

事務的隔離性

事務隔離性的本質就是如何正確處理多個并發事務的讀寫沖突和寫寫沖突,因為在分布式事務控制中,可能會出現提交不同步的現象,這個時候就有可能出現“部分已經提交”的事務,

此時并發應用訪問資料如果沒有加以控制,有可能出現“臟讀”問題,

分布式系統的一致性

前面介紹到的分布式事務的難點涉及的問題,最終影響是導致資料出現不一致,下面對分布式系統的一致性問題進行理論分析,后面將基于這些理論進行分布式方案的介紹,

可用性和一致性的沖突:CAP 理論

CAP 定理又被稱作布魯爾定理,是加州大學的計算機科學家布魯爾在 2000 年提出的一個猜想,

2002 年,麻省理工學院的賽斯·吉爾伯特和南希·林奇發表了布魯爾猜想的證明,使之成為分布式計算領域公認的一個定理,

布魯爾在提出 CAP 猜想時并沒有具體定義 Consistency、Availability、Partition Tolerance 這 3 個詞的含義,不同資料的具體定義也有差別,

為了更好地解釋,下面選擇Robert Greiner的文章《CAP Theorem》作為參考基礎:

  • http://robertgreiner.com/about/
  • http://robertgreiner.com/2014/08/cap-theorem-revisited/

CAP 理論的定義

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

Consistency、Availability、Partition Tolerance 具體解釋如下:

C - Consistency 一致性:A read is guaranteed to return the most recent write for a given client.

對某個指定的客戶端來說,讀操作保證能夠回傳最新的寫操作結果,

這里并不是強調同一時刻擁有相同的資料,對于系統執行事務來說,在事務執行程序中,系統其實處于一個不一致的狀態,不同的節點的資料并不完全一致,

一致性強調客戶端讀操作能夠獲取最新的寫操作結果,是因為事務在執行程序中,客戶端是無法讀取到未提交的資料的,

只有等到事務提交后,客戶端才能讀取到事務寫入的資料,而如果事務失敗則會進行回滾,客戶端也不會讀取到事務中間寫入的資料,

A - Availability 可用性:A non-failing node will return a reasonable response within a reasonable amount of time (no error or timeout).

非故障的節點在合理的時間內回傳合理的回應(不是錯誤和超時的回應),

這里強調的是合理的回應,不能超時,不能出錯,注意并沒有說“正確”的結果,例如,應該回傳 100 但實際上回傳了 90,肯定是不正確的結果,但可以是一個合理的結果,

P - Partition Tolerance 磁區容忍性:The system will continue to function when network partitions occur.

當出現網路磁區后,系統能夠繼續“履行職責”,

這里網路磁區是指:一個分布式系統里面,節點組成的網路本來應該是連通的,

然而可能因為一些故障(節點間網路連接斷開、節點宕機),使得有些節點之間不連通了,整個網路就分成了幾塊區域,資料就散布在了這些不連通的區域中,

一致性、可用性、磁區容忍性的選擇

雖然 CAP 理論定義是三個要素中只能取兩個,但放到分布式環境下來思考,我們會發現必須選擇 P(磁區容忍)要素,因為網路本身無法做到 100% 可靠,有可能出故障,所以磁區是一個必然的現象,

如果我們選擇了 CA(一致性 + 可用性) 而放棄了 P(磁區容忍性),那么當發生磁區現象時,為了保證 C(一致性),系統需要禁止寫入,

當有寫入請求時,系統回傳 error(例如,當前系統不允許寫入),這又和 A(可用性) 沖突了,因為 A(可用性)要求回傳 no error 和 no timeout,

因此,分布式系統理論上不可能選擇 CA (一致性 + 可用性)架構,只能選擇 CP(一致性 + 磁區容忍性) 或者 AP (可用性 + 磁區容忍性)架構,在一致性和可用性做折中選擇,

①CP - Consistency + Partition Tolerance (一致性 + 磁區容忍性)

如上圖所示,因為 Node1 節點和 Node2 節點連接中斷導致磁區現象,Node1 節點的資料已經更新到 y,但是 Node1 和 Node2 之間的復制通道中斷,資料 y 無法同步到 Node2,Node2 節點上的資料還是舊資料 x,

這時客戶端 C 訪問 Node2 時,Node2 需要回傳 error,提示客戶端 “系統現在發生了錯誤”,這種處理方式違背了可用性(Availability)的要求,因此 CAP 三者只能滿足 CP,

②AP - Availability + Partition Tolerance (可用性 + 磁區容忍性)

同樣是 Node2 節點上的資料還是舊資料 x,這時客戶端 C 訪問 Node2 時,Node2 將當前自己擁有的資料 x 回傳給客戶端了,

而實際上當前最新的資料已經是 y 了,這就不滿足一致性(Consistency)的要求了,因此 CAP 三者只能滿足 AP,

注意:這里 Node2 節點回傳 x,雖然不是一個“正確”的結果,但是一個“合理”的結果,因為 x 是舊的資料,并不是一個錯亂的值,只是不是最新的資料,

值得補充的是,CAP 理論告訴我們分布式系統只能選擇 AP 或者 CP,但實際上并不是說整個系統只能選擇 AP 或者 CP,

在 CAP 理論落地實踐時,我們需要將系統內的資料按照不同的應用場景和要求進行分類,每類資料選擇不同的策略(CP 還是 AP),而不是直接限定整個系統所有資料都是同一策略,

另外,只能選擇 CP 或者 AP 是指系統發生磁區現象時無法同時保證 C(一致性)和 A(可用性),但不是意味著什么都不做,當磁區故障解決后,系統還是要保持保證 CA,

CAP 理論的延伸:BASE 理論

BASE 是指基本可用(Basically Available)、軟狀態( Soft State)、最終一致性( Eventual Consistency),

它的核心思想是即使無法做到強一致性(CAP 的一致性就是強一致性),但應用可以采用適合的方式達到最終一致性,

BA - Basically Available 基本可用

分布式系統在出現故障時,允許損失部分可用性,即保證核心可用,

這里的關鍵詞是“部分”和“核心”,實際實踐上,哪些是核心需要根據具體業務來權衡,

例如登錄功能相對注冊功能更加核心,注冊不了最多影響流失一部分用戶,如果用戶已經注冊但無法登錄,那就意味著用戶無法使用系統,造成的影響范圍更大,

S - Soft State 軟狀態

允許系統存在中間狀態,而該中間狀態不會影響系統整體可用性,這里的中間狀態就是 CAP 理論中的資料不一致,

E - Eventual Consistency 最終一致性

系統中的所有資料副本經過一定時間后,最終能夠達到一致的狀態,

這里的關鍵詞是“一定時間” 和 “最終”,“一定時間”和資料的特性是強關聯的,不同業務不同資料能夠容忍的不一致時間是不同的,

例如支付類業務是要求秒級別內達到一致,因為用戶時時關注;用戶發的最新微博,可以容忍 30 分鐘內達到一致的狀態,因為用戶短時間看不到明星發的微博是無感知的,

而“最終”的含義就是不管多長時間,最侄訓是要達到一致性的狀態,

BASE 理論本質上是對 CAP 的延伸和補充,更具體地說,是對 CAP 中 AP 方案的一個補充:CAP 理論是忽略延時的,而實際應用中延時是無法避免的,

這一點就意味著完美的 CP 場景是不存在的,即使是幾毫秒的資料復制延遲,在這幾毫秒時間間隔內,系統是不符合 CP 要求的,

因此 CAP 中的 CP 方案,實際上也是實作了最終一致性,只是“一定時間”是指幾毫秒而已,

AP 方案中犧牲一致性只是指發生磁區故障期間,而不是永遠放棄一致性,

這一點其實就是 BASE 理論延伸的地方,磁區期間犧牲一致性,但磁區故障恢復后,系統應該達到最終一致性,

資料一致性模型

前面介紹的 BASE 模型提過“強一致性”和“最終一致性”,下面對這些一致性模型展開介紹,

分布式系統通過復制資料來提高系統的可靠性和容錯性,并且將資料的不同的副本存放在不同的機器上,由于維護資料副本的一致性代價很高,因此許多系統采用弱一致性來提高性能,

下面介紹常見的一致性模型:

  • 強一致性:要求無論更新操作是在哪個資料副本上執行,之后所有的讀操作都要能獲得最新的資料, 對于單副本資料來說,讀寫操作是在同一資料上執行的,容易保證強一致性,對多副本資料來說,則需要使用分布式事務協議,
  • 弱一致性:在這種一致性下,用戶讀到某一操作對系統特定資料的更新需要一段時間,我們將這段時間稱為"不一致性視窗",
  • 最終一致性:是弱一致性的一種特例,在這種一致性下系統保證用戶最終能夠讀取到某操作對系統特定資料的更新(讀取操作之前沒有該資料的其他更新操作), "不一致性視窗"的大小依賴于互動延遲、系統的負載,以及資料的副本數等,

系統選擇哪種一致性模型取決于應用對一致性的需求,所選取的一致性模型還會影響到系統如何處理用戶的請求以及對副本維護技術的選擇等,

后面將基于上面介紹的一致性模型分別介紹分布式事務的解決方案,

柔性事務

柔性事務的概念

在電商等互聯網場景下,傳統的事務在資料庫性能和處理能力上都暴露出了瓶頸,在分布式領域基于 CAP 理論以及 BASE 理論,有人就提出了柔性事務的概念,

基于 BASE 理論的設計思想,柔性事務下,在不影響系統整體可用性的情況下(Basically Available 基本可用),允許系統存在資料不一致的中間狀態(Soft State 軟狀態),在經過資料同步的延時之后,最終資料能夠達到一致,

并不是完全放棄了 ACID,而是通過放寬一致性要求,借助本地事務來實作最終分布式事務一致性的同時也保證系統的吞吐,

實作柔性事務的一些特性

下面介紹的是實作柔性事務的一些常見特性,這些特性在具體的方案中不一定都要滿足,因為不同的方案要求不一樣,

可見性(對外可查詢) :在分布式事務執行程序中,如果某一個步驟執行出錯,就需要明確的知道其他幾個操作的處理情況,這就需要其他的服務都能夠提供查詢介面,保證可以通過查詢來判斷操作的處理情況,

為了保證操作的可查詢,需要對于每一個服務的每一次呼叫都有一個全域唯一的標識,可以是業務單據號(如訂單號)、也可以是系統分配的操作流水號(如支付記錄流水號),除此之外,操作的時間資訊也要有完整的記錄,

操作冪等性:冪等性,其實是一個數學概念,冪等函式,或冪等方法,是指可以使用相同引數重復執行,并能獲得相同結果的函式,

冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同,也就是說,同一個方法,使用同樣的引數,呼叫多次產生的業務結果與呼叫一次產生的業務結果相同,

之所以需要操作冪等性,是因為為了保證資料的最終一致性,很多事務協議都會有很多重試的操作,如果一個方法不保證冪等,那么將無法被重試,

冪等操作的實作方式有多種,如在系統中快取所有的請求與處理結果、檢測到重復操作后,直接回傳上一次的處理結果等,

常見分布式事務解決方案

介紹完分布式系統的一致性相關理論,下面基于不同的一致性模型介紹分布式事務的常見解決方案,后面會再介紹各個方案的使用場景,

分布式事務的實作有許多種,其中較經典是由 Tuxedo 提出的 XA 分布式事務協議,XA 協議包含二階段提交(2PC)和三階段提交(3PC)兩種實作,

2PC(二階段提交)方案:強一致性

方案簡介

二階段提交協議(Two-phase Commit,即 2PC)是常用的分布式事務解決方案,即將事務的提交程序分為兩個階段來進行處理:準備階段和提交階段,事務的發起者稱協調者,事務的執行者稱參與者,

在分布式系統里,每個節點都可以知曉自己操作的成功或者失敗,卻無法知道其他節點操作的成功或失敗,

當一個事務跨多個節點時,為了保持事務的原子性與一致性,而引入一個協調者來統一掌控所有參與者的操作結果,并指示它們是否要把操作結果進行真正的提交或者回滾(rollback),

二階段提交的演算法思路可以概括為:參與者將操作成敗通知協調者,再由協調者根據所有參與者的反饋情報決定各參與者是否要提交操作還是中止操作,

核心思想就是對每一個事務都采用先嘗試后提交的處理方式,處理后所有的讀操作都要能獲得最新的資料,因此也可以將二階段提交看作是一個強一致性演算法,

處理流程

簡單一點理解,可以把協調者節點比喻為帶頭大哥,參與者理解比喻為跟班小弟,帶頭大哥統一協調跟班小弟的任務執行,

階段 1:準備階段

準備階段有如下三個步驟:

  • 協調者向所有參與者發送事務內容,詢問是否可以提交事務,并等待所有參與者答復,
  • 各參與者執行事務操作,將 undo 和 redo 資訊記入事務日志中(但不提交事務),
  • 如參與者執行成功,給協調者反饋 yes,即可以提交;如執行失敗,給協調者反饋 no,即不可提交,

階段 2:提交階段

如果協調者收到了參與者的失敗訊息或者超時,直接給每個參與者發送回滾(rollback)訊息;否則,發送提交(commit)訊息,

參與者根據協調者的指令執行提交或者回滾操作,釋放所有事務處理程序中使用的鎖資源,(注意:必須在最后階段釋放鎖資源) 接下來分兩種情況分別討論提交階段的程序,

情況 1,當所有參與者均反饋 yes,提交事務,如上圖:

  • 協調者向所有參與者發出正式提交事務的請求(即 commit 請求),
  • 參與者執行 commit 請求,并釋放整個事務期間占用的資源,
  • 各參與者向協調者反饋 ack(應答)完成的訊息,
  • 協調者收到所有參與者反饋的 ack 訊息后,即完成事務提交,

情況 2,當任何階段 1 一個參與者反饋 no,中斷事務,如上圖:

  • 協調者向所有參與者發出回滾請求(即 rollback 請求),
  • 參與者使用階段 1 中的 undo 資訊執行回滾操作,并釋放整個事務期間占用的資源,
  • 各參與者向協調者反饋 ack 完成的訊息,
  • 協調者收到所有參與者反饋的 ack 訊息后,即完成事務中斷,

方案總結

2PC 方案實作起來簡單,實際專案中使用比較少,主要因為以下問題:

  • 性能問題:所有參與者在事務提交階段處于同步阻塞狀態,占用系統資源,容易導致性能瓶頸,
  • 可靠性問題:如果協調者存在單點故障問題,如果協調者出現故障,參與者將一直處于鎖定狀態,
  • 資料一致性問題:在階段 2 中,如果發生區域網路問題,一部分事務參與者收到了提交訊息,另一部分事務參與者沒收到提交訊息,那么就導致了節點之間資料的不一致,

3PC(三階段提交)方案

方案簡介

三階段提交協議,是二階段提交協議的改進版本,與二階段提交不同的是,引入超時機制,同時在協調者和參與者中都引入超時機制,

三階段提交將二階段的準備階段拆分為 2 個階段,插入了一個 preCommit 階段,使得原先在二階段提交中,參與者在準備之后,由于協調者發生崩潰或錯誤,而導致參與者處于無法知曉是否提交或者中止的“不確定狀態”所產生的可能相當長的延時的問題得以解決,

處理流程

階段 1:canCommit

協調者向參與者發送 commit 請求,參與者如果可以提交就回傳 yes 回應(參與者不執行事務操作),否則回傳 no 回應:

  • 協調者向所有參與者發出包含事務內容的 canCommit 請求,詢問是否可以提交事務,并等待所有參與者答復,
  • 參與者收到 canCommit 請求后,如果認為可以執行事務操作,則反饋 yes 并進入預備狀態,否則反饋 no,

階段 2:preCommit

協調者根據階段 1 canCommit 參與者的反應情況來決定是否可以進行基于事務的 preCommit 操作,根據回應情況,有以下兩種可能,

情況 1:階段 1 所有參與者均反饋 yes,參與者預執行事務,如上圖:

  • 協調者向所有參與者發出 preCommit 請求,進入準備階段,
  • 參與者收到 preCommit 請求后,執行事務操作,將 undo 和 redo 資訊記入事務日志中(但不提交事務),
  • 各參與者向協調者反饋 ack 回應或 no 回應,并等待最終指令,

情況 2:階段 1 任何一個參與者反饋 no,或者等待超時后協調者尚無法收到所有參與者的反饋,即中斷事務,如上圖:

  • 協調者向所有參與者發出 abort 請求,
  • 無論收到協調者發出的 abort 請求,或者在等待協調者請求程序中出現超時,參與者均會中斷事務,

階段 3:do Commit

該階段進行真正的事務提交,也可以分為以下兩種情況,

情況 1:階段 2 所有參與者均反饋 ack 回應,執行真正的事務提交,如上圖:

  • 如果協調者處于作業狀態,則向所有參與者發出 do Commit 請求,
  • 參與者收到 do Commit 請求后,會正式執行事務提交,并釋放整個事務期間占用的資源,
  • 各參與者向協調者反饋 ack 完成的訊息,
  • 協調者收到所有參與者反饋的 ack 訊息后,即完成事務提交,

情況 2:階段 2 任何一個參與者反饋 no,或者等待超時后協調者尚無法收到所有參與者的反饋,即中斷事務,如上圖:

  • 如果協調者處于作業狀態,向所有參與者發出 abort 請求,
  • 參與者使用階段 1 中的 undo 資訊執行回滾操作,并釋放整個事務期間占用的資源,
  • 各參與者向協調者反饋 ack 完成的訊息,
  • 協調者收到所有參與者反饋的 ack 訊息后,即完成事務中斷,

注意:進入階段 3 后,無論協調者出現問題,或者協調者與參與者網路出現問題,都會導致參與者無法接收到協調者發出的 do Commit 請求或 abort 請求,此時,參與者都會在等待超時之后,繼續執行事務提交,

方案總結

優點:相比二階段提交,三階段提交降低了阻塞范圍,在等待超時后協調者或參與者會中斷事務,避免了協調者單點問題,階段 3 中協調者出現問題時,參與者會繼續提交事務,

缺點:資料不一致問題依然存在,當在參與者收到 preCommit 請求后等待 do commite 指令時,此時如果協調者請求中斷事務,而協調者無法與參與者正常通信,會導致參與者繼續提交事務,造成資料不一致,

TCC 事務:最終一致性

方案簡介

TCC(Try-Confirm-Cancel)的概念,最早是由 Pat Helland 于 2007 年發表的一篇名為《Life beyond Distributed Transactions:an Apostate’s Opinion》的論文提出,

TCC 是服務化的二階段編程模型,其 Try、Confirm、Cancel 3 個方法均由業務編碼實作:

  • Try 操作作為一階段,負責資源的檢查和預留,
  • Confirm 操作作為二階段提交操作,執行真正的業務,
  • Cancel 是預留資源的取消,

TCC 事務的 Try、Confirm、Cancel 可以理解為 SQL 事務中的 Lock、Commit、Rollback,

處理流程

為了方便理解,下面以電商下單為例進行方案決議,這里把整個程序簡單分為扣減庫存,訂單創建 2 個步驟,庫存服務和訂單服務分別在不同的服務器節點上,

①Try 階段

從執行階段來看,與傳統事務機制中業務邏輯相同,但從業務角度來看,卻不一樣,

TCC 機制中的 Try 僅是一個初步操作,它和后續的確認一起才能真正構成一個完整的業務邏輯,這個階段主要完成:

  • 完成所有業務檢查( 一致性 ) ,
  • 預留必須業務資源( 準隔離性 ) ,
  • Try 嘗試執行業務,

TCC 事務機制以初步操作(Try)為中心的,確認操作(Confirm)和取消操作(Cancel)都是圍繞初步操作(Try)而展開,

因此,Try 階段中的操作,其保障性是最好的,即使失敗,仍然有取消操作(Cancel)可以將其執行結果撤銷,

假設商品庫存為 100,購買數量為 2,這里檢查和更新庫存的同時,凍結用戶購買數量的庫存,同時創建訂單,訂單狀態為待確認,

②Confirm / Cancel 階段

根據 Try 階段服務是否全部正常執行,繼續執行確認操作(Confirm)或取消操作(Cancel),

Confirm 和 Cancel 操作滿足冪等性,如果 Confirm 或 Cancel 操作執行失敗,將會不斷重試直到執行完成,

Confirm:當 Try 階段服務全部正常執行, 執行確認業務邏輯操作

這里使用的資源一定是 Try 階段預留的業務資源,在 TCC 事務機制中認為,如果在 Try 階段能正常的預留資源,那 Confirm 一定能完整正確的提交,

Confirm 階段也可以看成是對 Try 階段的一個補充,Try+Confirm 一起組成了一個完整的業務邏輯,

Cancel:當 Try 階段存在服務執行失敗, 進入 Cancel 階段

Cancel 取消執行,釋放 Try 階段預留的業務資源,上面的例子中,Cancel 操作會把凍結的庫存釋放,并更新訂單狀態為取消,

方案總結

TCC 事務機制相對于傳統事務機制(X/Open XA),TCC 事務機制相比于上面介紹的 XA 事務機制,有以下優點:

  • 性能提升:具體業務來實作控制資源鎖的粒度變小,不會鎖定整個資源,
  • 資料最終一致性:基于 Confirm 和 Cancel 的冪等性,保證事務最終完成確認或者取消,保證資料的一致性,
  • 可靠性:解決了 XA 協議的協調者單點故障問題,由主業務方發起并控制整個業務活動,業務活動管理器也變成多點,引入集群,

缺點: TCC 的 Try、Confirm 和 Cancel 操作功能要按具體業務來實作,業務耦合度較高,提高了開發成本,

本地訊息表:最終一致性

方案簡介

本地訊息表的方案最初是由 eBay 提出,核心思路是將分布式事務拆分成本地事務進行處理,

方案通過在事務主動發起方額外新建事務訊息表,事務發起方處理業務和記錄事務訊息在本地事務中完成,輪詢事務訊息表的資料發送事務訊息,事務被動方基于訊息中間件消費事務訊息表中的事務,

這樣設計可以避免”業務處理成功 + 事務訊息發送失敗",或"業務處理失敗 + 事務訊息發送成功"的棘手情況出現,保證 2 個系統事務的資料一致性,

處理流程

下面把分布式事務最先開始處理的事務方稱為事務主動方,在事務主動方之后處理的業務內的其他事務稱為事務被動方,

為了方便理解,下面繼續以電商下單為例進行方案決議,這里把整個程序簡單分為扣減庫存,訂單創建 2 個步驟,

庫存服務和訂單服務分別在不同的服務器節點上,其中庫存服務是事務主動方,訂單服務是事務被動方,

事務的主動方需要額外新建事務訊息表,用于記錄分布式事務的訊息的發生、處理狀態,

整個業務處理流程如下:

步驟1:事務主動方處理本地事務,

事務主動方在本地事務中處理業務更新操作和寫訊息表操作,上面例子中庫存服務階段在本地事務中完成扣減庫存和寫訊息表(圖中 1、2),

步驟 2:事務主動方通過訊息中間件,通知事務被動方處理事務通知事務待訊息,

訊息中間件可以基于 Kafka、RocketMQ 訊息佇列,事務主動方主動寫訊息到訊息佇列,事務消費方消費并處理訊息佇列中的訊息,

上面例子中,庫存服務把事務待處理訊息寫到訊息中間件,訂單服務消費訊息中間件的訊息,完成新增訂單(圖中 3 - 5),

步驟 3:事務被動方通過訊息中間件,通知事務主動方事務已處理的訊息,

上面例子中,訂單服務把事務已處理訊息寫到訊息中間件,庫存服務消費中間件的訊息,并將事務訊息的狀態更新為已完成(圖中 6 - 8),

為了資料的一致性,當處理錯誤需要重試,事務發送方和事務接收方相關業務處理需要支持冪等,

具體保存一致性的容錯處理如下:

  • 當步驟 1 處理出錯,事務回滾,相當于什么都沒發生,
  • 當步驟 2、步驟 3 處理出錯,由于未處理的事務訊息還是保存在事務發送方,事務發送方可以定時輪詢為超時訊息資料,再次發送到訊息中間件進行處理,事務被動方消費事務訊息重試處理,
  • 如果是業務上的失敗,事務被動方可以發訊息給事務主動方進行回滾,
  • 如果多個事務被動方已經消費訊息,事務主動方需要回滾事務時需要通知事務被動方回滾,

方案總結

方案的優點如下:

  • 從應用設計開發的角度實作了訊息資料的可靠性,訊息資料的可靠性不依賴于訊息中間件,榷訓了對 MQ 中間件特性的依賴,
  • 方案輕量,容易實作,

缺點如下:

  • 與具體的業務場景系結,耦合性強,不可公用,
  • 訊息資料與業務資料同庫,占用業務系統資源,
  • 業務系統在使用關系型資料庫的情況下,訊息服務性能會受到關系型資料庫并發性能的局限,

MQ 事務:最終一致性

方案簡介

基于 MQ 的分布式事務方案其實是對本地訊息表的封裝,將本地訊息表基于 MQ 內部,其他方面的協議基本與本地訊息表一致,

處理流程

下面主要基于 RocketMQ 4.3 之后的版本介紹 MQ 的分布式事務方案,

在本地訊息表方案中,保證事務主動方發寫業務表資料和寫訊息表資料的一致性是基于資料庫事務,RocketMQ 的事務訊息相對于普通 MQ,相對于提供了 2PC 的提交介面,方案如下:

正常情況:事務主動方發訊息

這種情況下,事務主動方服務正常,沒有發生故障,發訊息流程如下:

  • 圖中 1:發送方向 MQ 服務端(MQ Server)發送 half 訊息,
  • 圖中 2:MQ Server 將訊息持久化成功之后,向發送方 ack 確認訊息已經發送成功,
  • 圖中 3:發送方開始執行本地事務邏輯,
  • 圖中 4:發送方根據本地事務執行結果向 MQ Server 提交二次確認(commit 或是 rollback),
  • 圖中 5:MQ Server 收到 commit 狀態則將半訊息標記為可投遞,訂閱方最終將收到該訊息;MQ Server 收到 rollback 狀態則洗掉半訊息,訂閱方將不會接受該訊息,

例外情況:事務主動方訊息恢復

在斷網或者應用重啟等例外情況下,圖中 4 提交的二次確認超時未到達 MQ Server,此時處理邏輯如下:

  • 圖中 5:MQ Server 對該訊息發起訊息回查,
  • 圖中 6:發送方收到訊息回查后,需要檢查對應訊息的本地事務執行的最終結果,
  • 圖中 7:發送方根據檢查得到的本地事務的最終狀態再次提交二次確認,
  • 圖中 8:MQ Server基于 commit/rollback 對訊息進行投遞或者洗掉,

介紹完 RocketMQ 的事務訊息方案后,由于前面已經介紹過本地訊息表方案,這里就簡單介紹 RocketMQ 分布式事務:

事務主動方基于 MQ 通信通知事務被動方處理事務,事務被動方基于 MQ 回傳處理結果,

如果事務被動方消費訊息例外,需要不斷重試,業務處理邏輯需要保證冪等,

如果是事務被動方業務上的處理失敗,可以通過 MQ 通知事務主動方進行補償或者事務回滾,

方案總結

相比本地訊息表方案,MQ 事務方案優點是:

  • 訊息資料獨立存盤 ,降低業務系統與訊息系統之間的耦合,
  • 吞吐量由于使用本地訊息表方案,

缺點是:

  • 一次訊息發送需要兩次網路請求(half 訊息 + commit/rollback 訊息) ,
  • 業務處理服務需要實作訊息狀態回查介面,

Saga 事務:最終一致性

方案簡介

Saga 事務源于 1987 年普林斯頓大學的 Hecto 和 Kenneth 發表的如何處理 long lived transaction(長活事務)論文,

Saga 事務核心思想是將長事務拆分為多個本地短事務,由 Saga 事務協調器協調,如果正常結束那就正常完成,如果某個步驟失敗,則根據相反順序一次呼叫補償操作,

處理流程

Saga 事務基本協議如下:

  • 每個 Saga 事務由一系列冪等的有序子事務(sub-transaction) Ti 組成,
  • 每個 Ti 都有對應的冪等補償動作 Ci,補償動作用于撤銷 Ti 造成的結果,

可以看到,和 TCC 相比,Saga 沒有“預留”動作,它的 Ti 就是直接提交到庫,

下面以下單流程為例,整個操作包括:創建訂單、扣減庫存、支付、增加積分,

Saga 的執行順序有兩種,如上圖:

  • 事務正常執行完成:T1, T2, T3, ..., Tn,例如:扣減庫存(T1),創建訂單(T2),支付(T3),依次有序完成整個事務,
  • 事務回滾:T1, T2, ..., Tj, Cj,..., C2, C1,其中 0 < j < n,例如:扣減庫存(T1),創建訂單(T2),支付(T3,支付失敗),支付回滾(C3),訂單回滾(C2),恢復庫存(C1),

Saga 定義了兩種恢復策略:

向前恢復(forward recovery):對應于上面第一種執行順序,適用于必須要成功的場景,發生失敗進行重試,執行順序是類似于這樣的:T1, T2, ..., Tj(失敗), Tj(重試),..., Tn,其中j是發生錯誤的子事務(sub-transaction),該情況下不需要Ci,

向后恢復(backward recovery):對應于上面提到的第二種執行順序,其中 j 是發生錯誤的子事務(sub-transaction),這種做法的效果是撤銷掉之前所有成功的子事務,使得整個 Saga 的執行結果撤銷,

Saga 事務常見的有兩種不同的實作方式:

①命令協調(Order Orchestrator):中央協調器負責集中處理事件的決策和業務邏輯排序,

中央協調器(Orchestrator,簡稱 OSO)以命令/回復的方式與每項服務進行通信,全權負責告訴每個參與者該做什么以及什么時候該做什么,

以電商訂單的例子為例:

  • 事務發起方的主業務邏輯請求 OSO 服務開啟訂單事務
  • OSO 向庫存服務請求扣減庫存,庫存服務回復處理結果,
  • OSO 向訂單服務請求創建訂單,訂單服務回復創建結果,
  • OSO 向支付服務請求支付,支付服務回復處理結果,
  • 主業務邏輯接收并處理 OSO 事務處理結果回復,

中央協調器必須事先知道執行整個訂單事務所需的流程(例如通過讀取配置),如果有任何失敗,它還負責通過向每個參與者發送命令來撤銷之前的操作來協調分布式的回滾,

基于中央協調器協調一切時,回滾要容易得多,因為協調器默認是執行正向流程,回滾時只要執行反向流程即可,

②事件編排(Event Choreography0):沒有中央協調器(沒有單點風險)時,每個服務產生并觀察其他服務的事件,并決定是否應采取行動,

在事件編排方法中,第一個服務執行一個事務,然后發布一個事件,該事件被一個或多個服務進行監聽,這些服務再執行本地事務并發布(或不發布)新的事件,

當最后一個服務執行本地事務并且不發布任何事件時,意味著分布式事務結束,或者它發布的事件沒有被任何 Saga 參與者聽到都意味著事務結束,

以電商訂單的例子為例:

  • 事務發起方的主業務邏輯發布開始訂單事件,
  • 庫存服務監聽開始訂單事件,扣減庫存,并發布庫存已扣減事件,
  • 訂單服務監聽庫存已扣減事件,創建訂單,并發布訂單已創建事件,
  • 支付服務監聽訂單已創建事件,進行支付,并發布訂單已支付事件,
  • 主業務邏輯監聽訂單已支付事件并處理,

事件/編排是實作 Saga 模式的自然方式,它很簡單,容易理解,不需要太多的代碼來構建,如果事務涉及 2 至 4 個步驟,則可能是非常合適的,

方案總結

命令協調設計的優點如下:

  • 服務之間關系簡單,避免服務之間的回圈依賴關系,因為 Saga 協調器會呼叫 Saga 參與者,但參與者不會呼叫協調器,
  • 程式開發簡單,只需要執行命令/回復(其實回復訊息也是一種事件訊息),降低參與者的復雜性,
  • 易維護擴展,在添加新步驟時,事務復雜性保持線性,回滾更容易管理,更容易實施和測驗,

命令協調設計缺點如下:

  • 中央協調器容易處理邏輯容易過于復雜,導致難以維護,
  • 存在協調器單點故障風險,

事件/編排設計優點如下:

  • 避免中央協調器單點故障風險,
  • 當涉及的步驟較少服務開發簡單,容易實作,

事件/編排設計缺點如下:

  • 服務之間存在回圈依賴的風險,
  • 當涉及的步驟較多,服務間關系混亂,難以追蹤調測,

值得補充的是,由于 Saga 模型中沒有 Prepare 階段,因此事務間不能保證隔離性,

當多個 Saga 事務操作同一資源時,就會產生更新丟失、臟資料讀取等問題,這時需要在業務層控制并發,例如:在應用層面加鎖,或者應用層面預先凍結資源,

總結

各方案使用場景

介紹完分布式事務相關理論和常見解決方案后,最終的目的在實際專案中運用,因此,總結一下各個方案的常見的使用場景:

  • 2PC/3PC:依賴于資料庫,能夠很好的提供強一致性和強事務性,但相對來說延遲比較高,比較適合傳統的單體應用,在同一個方法中存在跨庫操作的情況,不適合高并發和高性能要求的場景,
  • TCC:適用于執行時間確定且較短,實時性要求高,對資料一致性要求高,比如互聯網金融企業最核心的三個服務:交易、支付、賬務,
  • 本地訊息表/MQ 事務:都適用于事務中參與方支持操作冪等,對一致性要求不高,業務上能容忍資料不一致到一個人工檢查周期,事務涉及的參與方、參與環節較少,業務上有對賬/校驗系統兜底,
  • Saga 事務:由于 Saga 事務不能保證隔離性,需要在業務層控制并發,適合于業務場景事務并發操作同一資源較少的情況, Saga 相比缺少預提交動作,導致補償動作的實作比較麻煩,例如業務是發送短信,補償動作則得再發送一次短信說明撤銷,用戶體驗比較差,Saga 事務較適用于補償動作容易處理的場景,

分布式事務方案設計

本文介紹的偏向于原理,業界已經有不少開源的或者收費的解決方案,篇幅所限,就不再展開介紹,

實際運用理論時進行架構設計時,許多人容易犯“手里有了錘子,看什么都覺得像釘子”的錯誤,設計方案時考慮的問題場景過多,各種重試,各種補償機制引入系統,導致系統過于復雜,落地遙遙無期,

世界上解決一個計算機問題最簡單的方法:“恰好”不需要解決它!

—— 阿里中間件技術專家沈詢

有些問題,看起來很重要,但實際上我們可以通過合理的設計或者將問題分解來規避,

設計分布式事務系統也不是需要考慮所有例外情況,不必過度設計各種回滾,補償機制,

如果硬要把時間花在解決問題本身,實際上不僅效率低下,而且也是一種浪費,

如果系統要實作回滾流程的話,有可能系統復雜度將大大提升,且很容易出現 Bug,估計出現 Bug 的概率會比需要事務回滾的概率大很多,

在設計系統時,我們需要衡量是否值得花這么大的代價來解決這樣一個出現概率非常小的問題,可以考慮當出現這個概率很小的問題,能否采用人工解決的方式,這也是大家在解決疑難問題時需要多多思考的地方,

參考資料:

  • technology-talk —— 事務
  • MySQL 中事務的實作
  • 分布式一致性演算法 2PC 和 3PC
  • 分布式開放訊息系統(RocketMQ)的原理與實踐
  • RocketMQ 事務訊息入門介紹
  • Saga 分布式事務解決方案與實踐 —— 姜寧
  • 分布式事務 Saga 模式
  • 從一筆金幣充值去思考分布式事務

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/102299.html

標籤:其他

上一篇:nginx中proxy_pass小斜杠

下一篇:釣魚個人資訊

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more