簡介
Hbase Procedure是HBASE服務(wù)端負責事物處理的一個架構(gòu),寫的非常棒。。??梢园窍聛砀囊桓淖约河玫哪欠N。。。
背景知識
實現(xiàn)事物,需要處理的問題很多,主要的三個如下
- 程序掛掉
- 事物異常處理
- 未知狀態(tài)處理(分布式事物常有)
對于程序掛掉,需要將整個事物分為幾個流程,多個流程之間的狀態(tài)要存儲在不易失性存儲上,流程需要實現(xiàn)冪等。
對于事物的異常處理,要實現(xiàn)回滾操作。
對于未知狀態(tài)處理,需要實現(xiàn)冪等與重試,當然實現(xiàn)分布式事物還有很多別的方面,這里省略。
HBASE的Procedure就是依據(jù)以上背景實現(xiàn)。
組件
Procedure
Procedure代表上述的流程部分,多個流程的劃分為如果要執(zhí)行下一個流程,那么需要將這兩個流程之間的狀態(tài)存儲下來,也是冪等執(zhí)行的最小單位。
最主要的三個方法為
- execute 負責執(zhí)行這個流程
- rollback 負責回滾這個流程
- abort 負責終止這個流程
Procedure之間是有派生關(guān)系的,即一個Procedure會派生出一個子Procedure,父Procedure和子Procedure共同組成一個事物,最頂層的流程為Root Procedure
對于資源的鎖定:
- acquireLock 獲取Procedure所需資源的鎖
- releaseLock 釋放Procedure所需資源的鎖
ProcedureExecutor
執(zhí)行Procedure的線程池。
RootProcedureState
保存事物的執(zhí)行過程,用來在事物出錯的時候,依次回滾事務(wù),是一個棧結(jié)構(gòu)。
ProcedureStore
用來在執(zhí)行Procedure前存儲Procedure的信息,用以在程序死亡重啟時恢復(fù)執(zhí)行事物。
ProcedureScheduler
用于組織執(zhí)行Procedure的優(yōu)先級
WorkerThread
對Procedure的執(zhí)行線程邏輯實現(xiàn)
Procedure狀態(tài)流轉(zhuǎn)圖

Procedure狀態(tài)流轉(zhuǎn)圖
Procedure 繼承簡圖

Procedure 繼承簡圖