亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java常見分布式事務理論怎么解決

發布時間:2021-11-29 09:27:37 來源:億速云 閱讀:106 作者:iii 欄目:開發技術

本篇內容介紹了“java常見分布式事務理論怎么解決”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

CAP理論

先從定義開始:

C(Consistence):一致性

所有的節點訪問的是最新的數據副本,這是什么意思呢?我們知道在分布式系統中,為了高可用,往往一個節點會有若干個數據副本,簡稱Follower節點,比較常見的模式是我們的數據更新一般會寫入Leader節點,然后會同步給Follower節點,當我們讀取數據的時候,不論從哪個節點讀取都可以讀到最新的數據,這就是一致性。

java常見分布式事務理論怎么解決

A、B、C可以得到同樣的數據。

A(Availability):可用性

非故障節點可以正常的操作,簡單來說就是客戶端一直可以正常訪問并得到系統的正常響應,從用戶角度來看就是不會出現系統操作失敗或者訪問超時等問題,但是系統內部可能會出現網絡延遲等問題。

java常見分布式事務理論怎么解決

C節點因為自身問題不可用,正常情況會被剔除,B節點與A節點之間可能存在同步延遲,但是B節點本身沒有故障,所以B節點是可用的。

P(Partition tolerance):分區容錯性

網絡的問題錯綜復雜,分布式系統肯定是要考慮這一點的,如果出現某個節點因為網絡等問題造成數據不一致,或者數據延遲很久才同步過來,雖然會影響部分節點數據的時效性,但是服務節點依然是可用的,分布式系統要能容忍這種情況的。

java常見分布式事務理論怎么解決

B對應的節點雖然和Leader斷了聯系,但是依然可以對外服務,只不過提供的是老數據。

在分布式系統中,CAP是無法同時滿足的,首先由于存在多節點,并且網絡傳輸需要時間,所以可能會存在延遲,那么節點之間的數據我們無法保證某一時刻完全一致,因此P(分區容錯性)是要滿足的。在P滿足的情況下,為什么說CA不能同時滿足呢?我們來通過假設看一看,如果CA同時滿足會怎么樣。

  • 假設現在要求滿足C(一致性),那么就是說所有的節點在某一刻提供的數據都必須一致,我們知道在P的情況,是不可能保證的,要保證的話,就只能把其他節點全部干掉,比如禁止讀寫,那這其實就是和A是相悖的(某些節點雖然延遲,但是節點本身可用)。

  • 假設現在要求滿足A(可用性),那么就是說只要節點本身沒什么問題,就可以對外提供服務,哪怕有點數據延遲,很明顯這肯定是和C相悖的。

在實際的業務中,我們需要根據業務的場景來決定使用CP,還是AP。比如對一些和錢掛鉤的業務,數據的一致性按道理應該是最重要的,因此一般會采用CP,而對于一些不影響主體功能的業務,比如像新聞的閱讀量,不同的用戶看到的閱讀量不一樣并不會造成什么影響,可以采用AP。

BASE理論

由于CAP理論中C和A無法兼得,eBay的架構師提出了BASE理論,BASE理論主要是在CA之間做文章,它不要求強一致性,因此可以滿足一定的可用性。我們還是先從定義開始:

BA(Basically Available):基本可用

注意這個和不可用不是一回事,在分布式系統中出現不可預估的故障時,允許損失部分可用性,保證核心功能可用,比如正常一個接口響應200ms,在出現故障時響應超過1s,雖然響應時間變長了,但是接口還是可以對外提供服務的,再比如對于一個視頻網站,在突發流量到來時,把視頻的彈幕服務打掛了,但是視頻的播放功能依然正常。

java常見分布式事務理論怎么解決

S(Soft-state):軟狀態

即分布式系統允許存在一個中間的狀態,但是這個中間狀態并不會對服務造成嚴重的影響,比如對于主從復制這種,允許從節點短暫的延遲。

java常見分布式事務理論怎么解決

E(Eventually Consistent):最終一致性

由于軟狀態的存在,系統對延遲是可以容忍的,但是在一段時間后,延遲的數據需要最終保持一致。

java常見分布式事務理論怎么解決

總的來說,BASE理論適用性應該更廣泛,很多時候我們并不要求數據的強一致性,只要在短暫的延時之后能達到一致性也是可以的。

一致性hash

hash這個詞對我們來說并不陌生,以緩存服務器來說,一般會在線上配置好幾臺服務器,然后根據hash來決定請求哪臺緩存服務,比如常見的就是取模方式 hash(key)%num 來獲取目標機器。

java常見分布式事務理論怎么解決

假設現在有3臺緩存服務器,并且當前有3個緩存的key,分別是k0,k1,k2,在經過hash以后,它們的分布情況如下:

hash(k0)%3=0 #No.0
hash(k1)%3=1 #No.1
hash(k2)%3=2 #No.2

很幸運,分布的非常均勻,每臺機器一個。某天,由于線上要做個活動,預計訪問量會加大,需要選擇加一臺服務器來分擔壓力,于是經過hash之后,k0,k1,k2的分布情況如下:

hash(k0)%4=0 #No.1
hash(k1)%4=1 #No.2
hash(k2)%4=2 #No.3

java常見分布式事務理論怎么解決

  • k0的目標緩存服務器由原本的No.0變成了No.1

  • k1的目標緩存服務器由原本的No.1變成了No.2

  • k2的目標緩存服務器由原本的No.2變成了No.3

可以發現因為添加了一臺緩存節點,導致了k0,k1,k2原來的緩存全部失效了,這似乎有點問題,類似緩存雪崩,嚴重的話會對DB造成很大的壓力,造成這個問題的主要原因是因為我們加了一個節點,導致hash結果發生了變動,此時的hash可以說是不穩定的。

為了解決rehash不穩定的問題,于是出現了一致性hash算法。一致性hash的原理比較簡單,首先存在一個hash圓環,這個圓環可以存放 0-2^32-1 個節點。

  • 第一步就是把我們的目標服務器節點通過hash映射到這個環上

  • 第二步根據我們需要查找的key,它應該也對應hash環上的某個位置

java常見分布式事務理論怎么解決

也許你會問,這k0、k1、k2也沒和某個緩存節點對上呀~,這就是一致性hash不同的地方,它此時查找的方式并不是 hash(key)=某個節點,而是根據key的位置,順時針找到第一個節點,這個節點就是當下這個key的目標節點。

我們再來看看在一致性hash的情況下,新增一個節點會發生什么。

java常見分布式事務理論怎么解決

此時唯一的變動就是k0原本應該打到cache0節點的,現在卻打到了我們新加的節點cache3上,而k1,k2是不變的,也就是說有且只有k0的緩存失效了,相比之前,大大降低了緩存失效的面積。

當然這樣的節點分布算是比較理想的了,如果我們的節點是這樣分布的:

java常見分布式事務理論怎么解決

幾個cache節點分布的比較集中,由于順時針查找法,所以最終k0,k1,k2都落在cache0節點上,也就是說cache1、cache2基本就是多余的,所以為了解決這種數據傾斜的問題,一致性hash又引入了虛擬節點的概念,每個節點可以有若干個虛擬節點,比如:

  • cache0->cache0#1

  • cache1->cache1#1

  • cache2->cache2#1

虛擬節點并不是真正的服務節點,它只是一個影子,它的目的就是站坑位,讓節點更加分散,更加均勻。

java常見分布式事務理論怎么解決

這樣通過映射出虛擬節點以后,k0打到cache2,k1打到cache0,k2打到cache1,虛擬節點越多,理論分布的越均勻。

Gossip協議

集群往往是由多個節點共同組成的,當一個節點加入集群或者一個節點從集群中下線的時候,都需要讓集群中其他的節點知道,這樣才能將數據信息分享給新節點而忽略下線節點。

java常見分布式事務理論怎么解決

A、B、C節點之間可以互相傳遞消息,但是D節點在下線之后會被廣播告訴其他存活節點。

這樣的廣播協議就是今天要說Gossip協議,Gossip協議也叫Epidemic協議(流行病協議),當一個消息到來時,通過Gossip協議就可以像病毒一樣感染全部集群節點,當然我們利用的是它這個極強的散播能力。

Gossip的過程是由一個種子節點發起的,當一個種子節點有信息需要同步到網絡中的其他節點時,它會隨機的選擇周圍幾個節點散播消息,收到消息的節點也會重復該過程,直至最終網絡中所有的節點都收到了消息。這個過程可能需要一定的時間,所以不能保證某個時間點所有的節點都有該條消息,但是理論上最終所有節點都會收到消息,因此它是一個最終一致性協議。

Gossip協議的特點:

  • Gossip協議是周期性散播消息,每隔一段時間傳播一次

  • 被感染的節點,每次可以繼續散播N個節點

  • 每次散播消息時,都會選擇尚未發送過的節點進行散播

  • 收到消息的節點,不會向發送的節點散播

  • 同一個節點可能會收到重復的消息,因為可能同時多個節點正好向它散播

  • 集群是去中心化的,節點之間都是平等的

  • 消息的散播不用等接收節點的ack,即消息可能會丟失,但是最終應該會被感染

我們來看個例子:

java常見分布式事務理論怎么解決

  • 種子節點是A

  • A節點選擇B、C節點進行散播

  • C散播到D,B散播D和E,可以發現D收到兩次

  • D散播到F,最終整個網絡都同步到了消息

Gossip有點類似圖的廣度優先遍歷算法,一般用于網絡拓撲結構信息的分享和維護,像redis、consul都有使用到。

Raft算法

分布式協議的難點之一就是數據的一致性,當由多個節點組成的集群中只有一個節點收到數據,我們就算成功的話,風險太大,當要求所有節點都收到數據才響應成功,性能又太差,所以一般會在數據的安全和性能之間做個折中,只要保證絕大部分節點同步數據成功,我們就算成功,Raft算法作為比較知名的一致性算法,被廣泛應用于許多中間件中,比如像etcd,接下來我們就看看Raft算法是如何工作的。

首先介紹下在Raft算法中,幾種情況下每個節點對應的角色:

Leader節點:同大多數分布式中的Leader節點一樣,數據的變更都是通過它的

Follower節點:Leader節點的追隨者,負責復制數據并且在選舉時候投票的節點

Candidate候選節點:參與選舉的節點,就是Follower節點參與選舉時會切換的角色

Raft算法將一致性問題分解為兩個的子問題,Leader選舉和狀態復制。

選舉

首先我們來看看Leader的選舉,系統在剛開始的時候,所有節點都為Follower節點,這時大家都有機會參與選舉,也就是把自己變成Candidate,但是如果每個Follower節點都變成Candidate那么就會陷入無限的死循環,于是每個Follower都一個定時器,并且定時器的時間是隨機的,當某個Follower的定時器時間走完之后,會確認當前是否存在Leader節點,如果不存在就會把自己變成Candidate,這時會投自己1票,同時告訴其它節點,讓它們來投票,當拿到超過半數以上的投票時,當前的Candidate就會變成Leader節點。

java常見分布式事務理論怎么解決

  • 由于A節點的定時器時間最短(10ms),所以A會成為Candidate

  • A投自己一票,同時B、C也投出自己的同意票,因此A會變成Leader節點,同時會記錄是第M任。這個M是做版本校驗的,比如一個編號是10的節點,收到了一個編號是9的節點的投票請求,那么就會拒絕這個請求。

在Leader節點選舉出來以后,Leader節點會不斷的發送心跳給其它Follower節點證明自己是活著的,其他Follower節點在收到心跳后會清空自己的定時器,并回復給Leader,因為此時沒必要觸發選舉了。

如果Leader節點在某一刻掛了,那么Follower節點就不會收到心跳,因此在定時器到來時就會觸發新一輪的選舉,流程還是一樣,但是如果恰巧兩個Follower都變成了Candidate,并且都得到了同樣的票數,那么此時就會陷入僵局,為了打破僵局,這時每個Candidate都會隨機推遲一段時間再次請求投票,當然一般情況下,就是先來先得,優先跑完定時器的Candidate理論成為Leader的概率更大。

好的選舉流程大致如上,接下來我們來看看數據的復制。

復制

當Leader節點收到Client的請求變更時,會把變更記錄到log中,然后Leader會將這個變更隨著下一次的心跳通知給Follower節點,收到消息的Follower節點把變更同樣寫入日志中,然后回復Leader節點,當Leader收到大多數的回復后,就把變更寫入自己的存儲空間,同時回復client,并告訴Follower應用此log。至此,集群就變更達成了共識。

java常見分布式事務理論怎么解決

最后,Raft算法是能夠實現分布式系統強一致性的算法,每個系統節點有三種狀態Leader、Follower、Candidate,實現Raft算法兩個最重要的事是:主的選舉和日志的復制。

分布式事務

事務相信大家不陌,事務的本質是要么一起向前沖,要么一起保持不動。對于MySQL的InnoDB來說,我們只需要執行begin、commit就行,有時候我們可能需要回滾rollback。但是這是在同一數據庫的前提下,如果我們的數據表分庫了或者說我們要操作的資源在不同的網絡節點上該怎么辦?這就得用到我們今天要說的分布式事務了,分布式事務有2PC、3PC、TCC等, 但是無論哪種都無法保證完美的ACID,我們來一起看看是怎么回事吧。

2PC

從名字可以看出它是分兩個階段的,所以它也叫做二階段提交,即準備和提交,2PC要求有個事務的協調者,相比常規的事務,我們的請求是發給這個協調者的,然后由協調者幫我們協調各個節點資源的提交。

  • 準備階段:協調者會讓各個參與事務的參與者,把除了提交之外所有的事情都干好,也就是就等著提交了

  • 提交階段:協調者收到各個參與者的準備消息后,根據準備情況通知各個參與者提交(commit)或者回滾(rollback)

java常見分布式事務理論怎么解決

可以發現整個過程非常依賴協調者,如果協調者掛了,那么整個分布式事務就不可用,所以一般建議協調者至少有個備份節點。

如果協調者在收到所有節點的ok之后,在準備發送commit消息的時候,由于網絡問題,導致其中一個節點始終收不到消息,那么收不到消息的節點就會一直占著資源不釋放,出現這種情況的時候,建議協調者有個重試功能,在commit失敗之后,不停的重試,直至成功。2PC協議是一種強一致性協議,它是同步阻塞的,所以在高并發的場景它的性能可能還會有問題。

3PC

2PC存在一些問題,比如協調者從掛了到恢復后并不知道當前節點的狀態,現在應該做什么(是該提交還是回滾等等),還有就是當發生網絡問題的時候,無法通信的節點只會傻傻的等待,造成資源一直處于鎖定狀態。鑒于這些問題,出現了3PC。

首先3PC顧名思義,會分為3個階段,分別是準備階段、預提交階段和提交階段。

  • 準備階段:主要是詢問參與者自身的狀況,比如你的負載情況如何?能參與接下來的任務吧?

  • 預提交階段:除了commit之外的所有準備工作,就等著commit了

  • 提交階段:執行真正的commit或者rollback

java常見分布式事務理論怎么解決

如果在事務期間,有新的協調者頂替進來,它就可以根據一個參與者的狀態來判斷當前應該干嘛,比如如果一個參與者處于提交階段,那么表明當前的事務正處于提交階段。當因為網絡問題某個節點一直收不到提交信息,那么此時也不會傻等了,會有超時時間,當超時時間過去了,節點可以自動提交,但是這里有個問題,對于參與者節點來說,當前應該是commit還是rollback呢?

其實2PC和3PC都無法保證絕對的一致性,因為某個參與者節點可能就是因為網絡問題收不到消息,但是其他參與者節點已經提交了事務,一般為了預防這種問題,最好加一個報警,比如監控到事務異常的時候,通過腳本自動補償差異的信息。

TCC

TCC事務的全程是Try、Commit、Cancel,TCC事務使用場景更貼近實際應用,因此它的使用也更廣泛。

Try:Try這個過程,一般表示鎖定資源的過程,比如常見的下單,在try階段,我們不是真正的減庫存,而是把下單的庫存給鎖定住。

Commit:真正的執行業務邏輯了,帶提交的。

Cancel:撤銷,如果Commit失敗可以把鎖定的資源釋放回來

java常見分布式事務理論怎么解決

TCC對應用的侵入性強。業務邏輯的每個分支都需要實現try、confirm、cancel三個操作,代碼改造成本高。在出現網絡或者其他系統故障時,TCC要根據實際業務場景實現對應的回滾邏輯。Commit或者Cancel有可能會重試,因此對應的部分最好支持冪等。

最后其實上面3種分布式事務理論上都無法保證絕對的一致性,因為無法解決網絡等帶來的意外因素,要解決它,要么只能無限重試,但是這個無限重試最好通過消息隊列+守護進程的方式來自動補數據,前提還是得保證消息隊列不丟失數據。總之不僅僅是分布式事務會帶來這些問題,分布式本身也會帶來許許多多的問題,沒有絕對的解決方案,只有更好的解決方案。

“java常見分布式事務理論怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

茌平县| 阳泉市| 昌吉市| 北海市| 永平县| 巫山县| 达孜县| 柘城县| 化德县| 玛纳斯县| 赤水市| 濮阳市| 军事| 蓬溪县| 沭阳县| 崇信县| 宝山区| 孝昌县| 灵武市| 原平市| 南安市| 长乐市| 于都县| 遵义市| 乐业县| 大渡口区| 耿马| 惠安县| 稷山县| 裕民县| 从化市| 徐州市| 民勤县| 蓝山县| 高邑县| 泸水县| 青岛市| 互助| 彩票| 甘洛县| 政和县|