Tx-lcn 通識(1)

官    網:http://www.txlcn.org/zh-cn/index.html

git 地址:https://github.com/codingapi/tx-lcn

L:   鎖定事務單元(lock)
C:   確認事務模塊狀態(confirm)
N:   通知事務(notify)

一、產生背景

微服務架構將原本獨立的系統拆分成多個小型服務,這些小型服務在各自的進程中獨立運行,服務之間基於HTTP的RESful API進行通信。被拆分的每一個小型服務都圍繞着系統中某一項或一些耦合度較高的業務功能進行構建,並且每個服務都維護着自身的數據存儲、業務併發、自動化測試案例以及獨立部署。

由於採用微服務架構,各個模塊相互獨立,導致原先在Spring容器中的通過@Transactional註解實現的本地事務,無法滿足跨服務的分佈式事務處理。分佈式事務存在兩大理論依據:CAP定律 BASE理論。

二、CAP定律

這個定理的內容是指的是在一個分佈式系統中Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區容錯性),三者不可得兼。

一致性(C):在分佈式系統中的所有數據備份,在同一時刻是否同樣的值。(等同於所有節點訪問同一份最新的數據副本)

可用性(A):在集羣中一部分節點故障後,集羣整體是否還能響應客戶端的讀寫請求。(對數據更新具備高可用性)

分區容錯性(P):分區相當於對通信的時限要求。系統如果不能在時限內達成數據一致性,就意味着發生了分區的情況,必須就當前操作在C和A之間做出選擇。又因爲是分佈式(P)分區的情況 。所以需要在(C)和(A)中根據實際情況抉擇出另一個。(因爲CAP理論必滿足三個中有且只有兩個條件成立。)

三、BASE理論

BASE是Basically Available(基本可用)、Soft state(軟狀態)和 Eventually consistent(最終一致性)三個短語的縮寫。BASE理論是對CAP中一致性和可用性權衡的結果, 是基於CAP定理逐步演化而來的。BASE理論的核心思想是:即使無法做到強一致性,但每個應用都可以根據自身業務特點,採用適當的方式來使系統達到最終一致性。

基本可用:基本可用是指分佈式系統在出現不可預知故障的時候,允許損失部分可用性----注意,這絕不等價於系統不可用。

比如:

(1)響應時間上的損失。正常情況下,一個在線搜索引擎需要在0.5秒之內返回給用戶相應的查詢結果,但由於出現故障,查詢結果的響應時間增加了1~2秒

(2)系統功能上的損失:正常情況下,在一個電子商務網站上進行購物的時候,消費者幾乎能夠順利完成每一筆訂單,但是在一些節日大促購物高峯的時候,由於消費者的購物行爲激增,爲了保護購物系統的穩定性,部分消費者可能會被引導到一個降級頁面

軟狀態:軟狀態指允許系統中的數據存在中間狀態,並認爲該中間狀態的存在不會影響系統的整體可用性,即允許系統在不同節點的數據副本之間進行數據同步的過程存在延時

最終一致性:

    最終一致性強調的是所有的數據副本,在經過一段時間的同步之後,最終都能夠達到一個一致的狀態。因此,最終一致性的本質是需要系統保證最終數據能夠達到一致,而不需要實時保證系統數據的強一致性。

二、相關的基礎知識

1,事務傳播行爲

   基於註解@Transactional

1.1 REQUIRED 如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)

1.2 SUPPORTS 支持當前事務,如果當前沒有事務,就以非事務方式執行。

@Transactional(propagation = Propagation.SUPPORTS, rollbackFor = Exception.class)

1.3 MANDATORY 使用當前的事務,如果當前沒有事務,就拋出異常。

@Transactional(propagation = Propagation.MANDATORY, rollbackFor = Exception.class)

1.4 REQUIRES_NEW 新建事務,如果當前存在事務,把當前事務掛起。

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)

1.5 NOT_SUPPORTED 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

@Transactional(propagation = Propagation.NOT_SUPPORTED, rollbackFor = Exception.class)

1.6 NEVER 以非事務方式執行,如果當前存在事務,則拋出異常。

@Transactional(propagation = Propagation.NEVER, rollbackFor = Exception.class)

1.7 NESTED 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與REQUIRED類似的操作。

@Transactional(propagation = Propagation.NESTED, rollbackFor = Exception.class)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章