分布式–1概述cap和base
分布式–2分布式事務
分布式–3分布式一致性演算法
分布式-4集群
分布式–5服務限流演算法
分布式–6分布式id
分布式–7效能壓測
分布式–8日誌鏈路跟蹤
分布式-9分布式鎖|redis鎖的幾種實現
參考 分布式系統間各種問題:宕機、網路不穩定
本地事務無法滿足需求:
1)遠端服務假失敗: 遠端服務其實成功了,由於網路故障等沒有返回 導致:訂單回滾,庫存卻扣減
2)遠端服務執行完成,下面的其他方法出現問題 導致:已執行的遠端請求,肯定不能回滾
兩階段提交系統中,存在乙個節點作為協調者,其他節點為參與者。
所有的節點都採用預寫式日誌。日誌記錄不會丟失。
所有的節點不會永久性的宕機,即使宕機後仍可以恢復。
第一階段:事務管理器要求每個涉及到事務的資料庫預提交此操作,並反映是否可以提交.
第二階段:根據第一階段的反饋,事務協調器要求每個資料庫提交資料,或者回滾資料。
事務管理器為單點,故障以後整個資料庫集群無法使用
在執行過程中,所有參與事務的節點都是事務獨佔狀態,當有參與者占用公共資源時,那麼其他第三方節點對公共資源的訪問會被阻塞。
第二階段中,假設協調者發出了事務commit的通知僅被一部分參與者所收到並執行,其餘的參與者則因為沒有收到通知一直處於阻塞狀態,這時候就產生了資料的不一致性。
為解決兩階段提交協議中,公共資源占用堵塞的問題,三階段提交協議中協調者和參與者都引入了超時機制,然後把兩階段提交協議裡的第乙個階段拆分為兩步:先詢問(cancommit),再鎖資源(precommit),再最後提交(docommit)。
cancommit:
協調者向參與者傳送commit請求,參與節點反映是否可以調節。
precommit:
根據cancommit響應情況有以下兩種執**況。
如果所有的參與節點返回yes,則進行事務的預執行:協調者向參與者傳送precommit請求,使參與者進入prepare階段。並向協調者反饋ack。
如果任意乙個節點返回了no,或者等待超時進進行中斷操作。則協調者向所有的參與者傳送abort請求,參與者執行abort請求放棄事務的執行。
docommit:
階段根據precommit的響應也有兩種執**況。
如果協調者收到所有參與者的ack響應,則傳送docommit請求,所有的參與者提交事務釋放資源,並向協調者反饋ack響應。
如果協調者沒有到所有參與者的ack響應,則會執行中斷事務
在docommit階段中,假設協調者發出了事務commit的通知僅被一部分參與者所收到並執行,其餘的參與者則因為沒有收到通知一直處於阻塞狀態,這時候就產生了資料的不一致性。
很多框架都實現了tcc,我們只需要把自己的**業務拆成三部分,放在對應的是三個方法裡,框架就可以幫我們按時機執行。
相當於三階段的手動版
1)定義
tcc是支付寶提出的分布式事務解決方案,每個分布式事務的參與者都需要實現3個介面:try、confirm、cancel。
try階段:
呼叫方呼叫各個服務的 try 介面,各個服務執行資源檢查和鎖定,看自己是否有能力完成,如果允許,則鎖定資源.
confirm階段:
各個服務的 try 介面都返回了 yes,則進入提交階段,呼叫方呼叫各個服務的 confirm 介面,各個服務對 try 階段鎖定的資源進行處理。如果 try 階段有一方返回了 no,或者超時,呼叫方呼叫各個服務的 cancel 介面,釋放鎖定的資源
cancel階段:
取消執行,釋放try階段預留的業務資源
confirm階段和cancel階段是互斥的,只能進行乙個,而且都是冪等性的,允許失敗重試。
2)優點
1. tcc解決了跨服務的業務操作原子性問題,可以讓應用自己定義資料庫操作的粒度,降低鎖衝突,提高系統的業務吞吐量。
2. tcc的每一階段都由業務自己控制,避免了長事務,提高了效能。
3)缺點
1. 業務侵入性強:業務邏輯必須都要實現try,confirm,cancel三個操作
異常情況
4)空回滾
現象是 try 沒被執行,就呼叫了 cancel:呼叫 try 時出現異常,try 介面實際沒有被呼叫,自然沒有返回 yes,那麼會按照正常流程進入第2階段,呼叫 cancel 介面,這就形成了空回滾。
解決方法:讓 cancel 能夠識別出這是乙個空回滾,可以記錄事務執行狀態,cancel 中判斷 try 是否執行了。
5)重複呼叫
提交階段異常時可能會重複呼叫 confirm 和 cancel,所以要實現冪等,保證多次執行效果一致。
解決方法:記錄事務執行狀態,如果執行過了,就不再執行。
6)懸掛
現象是先執行了 cancel,後執行的 try,造成資源沒人釋放:呼叫 try 時網路擁堵超時,被認為失敗,然後呼叫 cancel,這時事務相當於結束了,但後來網路好點之後 try 開始執行了,鎖定了相關資源,因為事務已經結束,confirm、cancel 都不會再呼叫了,就造成資源懸掛,無法釋放。
解決方法:還是記錄事務執行狀態,try 執行時判斷 cancel 是否執行了。
在大規模高併發服務化系統中,乙個功能被拆分成多個具有單一功能的元功能,乙個流程會有多個系統的多個元功能組合實現,如果使用兩階段提交協議和三階段提交協議,確實能解決系統間一致性問題,除了這兩個協議帶來的自身的問題,這些協議的實現比較複雜、成本比較高,最重要的是效能並不好,相比來看,tcc協議更簡單、容易實現,但是tcc協議由於每個事務都需要執行try,再執行confirm,略微顯得臃腫,因此,在現實的系統中,底線要求僅僅需要能達到最終一致性,而不需要實現專業的、複雜的一致性協議,實現最終一致性有一些非常有效的、簡單粗暴的模式
詳見 分布式–3分布式一致性演算法
利用mq延時佇列,實現高併發下的定時任務,最終一致解除訂單或者解除庫存鎖定。
1)下單之後,鎖定庫存。
2)傳送乙個訊息給交換機,key為lock,經交換機發給延時佇列
3)延時佇列50分鐘後經過交換機,路由到relase
4)relase被監聽消費後,檢查訂單狀態是否要解鎖,業務處理
上圖還有個庫存解鎖模組,是可以手動或其他情況觸發解鎖(也可以其他業務直接放入relase佇列進行解鎖)
**:myrabbitconifg
分布式事務(二)分布式事務方案
首先這是普通事務 下面是分布式事務 在微服務系統中,每個微服務應用都可能會有自己的資料庫,它們首先需要控制自己的本地事務。一項業務操作可能會呼叫執行多個微服務。如何保證多個服務執行的多個資料庫的操作整體成功或整體失敗?這就是分布式事務要解決的問題。cap 和 base 是對大規模網際網路系統分布式實...
分布式 分布式事務
是資料庫執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。事務的acid四大特性 原子性 atomicity 事務作為乙個整體被執行。一致性 consistency 從乙個一致的狀態轉換到另乙個一致的狀態。隔離性 isolation 多個事務併發執行時,併發事務之間互相影響的程度。永續性 d...
分布式之分布式事務
被人問到分布式事務,之前學rabbitmq 的時候學到過rabbitmq 高階的事務,因為沒有用過,所有沒有回答好。這裡總結一下。1.單機版事務。事務的四大特性 acid a.原子性 b.一致性 c.隔離性 d.永續性 單機事務可以通過設定事務的隔離級別 參見spring 的事務隔離級別 2.分布式...