一致性框架:供應(yīng)鏈分布式事務(wù)問(wèn)題解決方案
一、前言
二、一致性理論基礎(chǔ)
1. 一致性模型概述
2. 最終一致性的必要性
三、供應(yīng)鏈一致性框架總體架構(gòu)
1. 一致性框架的核心功能
2. 一致性框架整體框架
3. 一致性框架整體流程
四、一致性框架實(shí)現(xiàn)原理
1. 核心組件設(shè)計(jì)
2. 異步執(zhí)行實(shí)現(xiàn)原理
3. 重試機(jī)制實(shí)現(xiàn)
五、領(lǐng)域模型
六、數(shù)據(jù)模型
七、一致性框架案例
八、結(jié)語(yǔ)
一、前言
在當(dāng)今微服務(wù)架構(gòu)盛行的時(shí)代,分布式系統(tǒng)已經(jīng)成為企業(yè)級(jí)應(yīng)用的標(biāo)準(zhǔn)模式。然而,隨之而來(lái)的分布式事務(wù)問(wèn)題也成為了開(kāi)發(fā)人員的一大挑戰(zhàn)。在復(fù)雜的供應(yīng)鏈系統(tǒng)中,
各個(gè)業(yè)務(wù)模塊之間的數(shù)據(jù)一致性一直是一個(gè)重要且棘手的問(wèn)題。物流、庫(kù)存、訂單等系統(tǒng)相互協(xié)作,如何在保證業(yè)務(wù)高效運(yùn)轉(zhuǎn)的同時(shí),確??缦到y(tǒng)操作的數(shù)據(jù)一致性?
今天,我們將深入探討一個(gè)專為解決供應(yīng)鏈分布式事務(wù)問(wèn)題而設(shè)計(jì)的框架——「一致性框架」。
二、一致性理論基礎(chǔ)
一致性模型概述
在分布式系統(tǒng)中,一致性模型主要分為幾種類型。
一致性模型類型
※ 強(qiáng)一致性
任何時(shí)刻,所有節(jié)點(diǎn)看到的數(shù)據(jù)都是一樣的。
※ 弱一致性
不保證所有節(jié)點(diǎn)同時(shí)看到相同的數(shù)據(jù)。
※ 最終一致性
在一段時(shí)間后,所有節(jié)點(diǎn)最終會(huì)看到相同的數(shù)據(jù)。
其中,最終一致性是CAP理論(一致性、可用性、分區(qū)容忍性)中的一個(gè)重要妥協(xié)方案,它在保證系統(tǒng)高可用性的同時(shí),通過(guò)異步機(jī)制確保數(shù)據(jù)的最終一致。
圖片
最終一致性的必要性
在微服務(wù)架構(gòu)的系統(tǒng)中,我們常常面臨著跨服務(wù)調(diào)用中的分布式事務(wù)問(wèn)題、網(wǎng)絡(luò)暫時(shí)性故障導(dǎo)致的調(diào)用失敗、第三方系統(tǒng)響應(yīng)慢導(dǎo)致的超時(shí)問(wèn)題等。這些問(wèn)題如果使用強(qiáng)一致性方案解決,往往會(huì)導(dǎo)致系統(tǒng)可用性下降、響應(yīng)時(shí)間增加。因此,"先完成本地事務(wù),異步確保遠(yuǎn)程調(diào)用的最終成功"的最終一致性方案被廣泛采用。
三、供應(yīng)鏈一致性框架總體架構(gòu)
一致性框架的核心功能
供應(yīng)鏈一致性框架包含以下核心功能:
- 聲明式API:簡(jiǎn)潔易用的接口供開(kāi)發(fā)者使用
- 操作記錄持久化:記錄操作信息,以便重試
- 自動(dòng)重試機(jī)制:失敗后按策略自動(dòng)重試
- 并發(fā)控制:避免并發(fā)重試導(dǎo)致的問(wèn)題
- 超時(shí)與熔斷:防止無(wú)效重試消耗資源
- 監(jiān)控與告警:重試失敗達(dá)閾值時(shí)進(jìn)行告警
一致性框架整體框架
圖片
一致性框架整體流程
供應(yīng)鏈的一致性框架基于Spring Boot生態(tài),這提供了簡(jiǎn)單易用的注解式API 。其總體流程如下:
初始化階段
- 應(yīng)用啟動(dòng)時(shí),加載一致性框架配置。
- 初始化線程池、策略組件、監(jiān)聽(tīng)器等核心組件。
- 注冊(cè)定時(shí)任務(wù)(重試任務(wù)、清理任務(wù))。
方法攔截階段
- AOP攔截標(biāo)注了 @EventualConsistency 注解的方法。
- 解析注解參數(shù)(referenceNo、是否異步、重試策略等)。
- 創(chuàng)建一致性操作上下文(ConsistencyContext)。
事務(wù)處理階段
- 執(zhí)行業(yè)務(wù)方法,記錄執(zhí)行結(jié)果。
- 事務(wù)提交后,進(jìn)行一致性操作的執(zhí)行。
一致性框架執(zhí)行階段
- 根據(jù)配置決定同步執(zhí)行或異步執(zhí)行。
- 保存執(zhí)行記錄到數(shù)據(jù)庫(kù)。
- 同步執(zhí)行直接調(diào)用目標(biāo)方法,異步執(zhí)行提交到線程池。
- 根據(jù)執(zhí)行結(jié)果更新記錄狀態(tài)(DONE、EXCEPTION、FAILED)。
重試階段
- 從數(shù)據(jù)庫(kù)找出異常狀態(tài)的記錄,包含執(zhí)行方法名、方法參數(shù)等。
- 執(zhí)行器重試方法。
- 根據(jù)執(zhí)行結(jié)果更新記錄狀態(tài)(DONE、EXCEPTION、FAILED)。
一致性框架整體流程如下 :
圖片
四、一致性框架實(shí)現(xiàn)原理
核心組件設(shè)計(jì)
我們的一致性框架包含以下核心組件:
注解層
@EventualConsistency 注解是框架的入口,它是一個(gè)運(yùn)行時(shí)注解,可以應(yīng)用于方法和類。其核心屬性如下:
- async() :控制第一次執(zhí)行是否為異步執(zhí)行,默認(rèn)為 true 。
- maxRetryTimes() :設(shè)置最大重試次數(shù),默認(rèn)為6次。
- delay() : 配置重試延遲策略,使用嵌套的 @Delay 注解。
- listeners() :指定監(jiān)聽(tīng)器的Bean名稱,用于監(jiān)聽(tīng)重試過(guò)程。
- beanName() :指定Bean名稱,用于定位執(zhí)行目標(biāo)。
- referenceNo() :設(shè)置業(yè)務(wù)參考號(hào),用于業(yè)務(wù)追蹤和冪等性控制。
- serializerListener() :指定用于序列化和反序列化的監(jiān)聽(tīng)器Bean名稱。
攔截層
AnnotationAwareRetryOperationsInterceptor 負(fù)責(zé)攔截帶有注解 @EventualConsistency 的方法,根據(jù)注解配置創(chuàng)建相應(yīng)的執(zhí)行策略。
執(zhí)行層
執(zhí)行層負(fù)責(zé)根據(jù)當(dāng)前帶有一致性注解方法的狀態(tài)來(lái)選擇合適的執(zhí)行器,執(zhí)行帶有一致性框架注解的方法。一致性框架會(huì)記錄執(zhí)行方法的狀態(tài),包含初始化、異常、失敗和完成狀態(tài)。
根據(jù)狀態(tài)不同,會(huì)選擇不同的執(zhí)行器:
- SyncConsistencyExecutor :同步執(zhí)行器,在當(dāng)前線程中執(zhí)行。
- AsyncConsistencyExecutor :異步執(zhí)行器,通過(guò)異步線程執(zhí)行,不等待執(zhí)行結(jié)果立即返回成功。
- RetryConsistencyExecutor :重試執(zhí)行器,專門對(duì)執(zhí)行狀態(tài)為異常的記錄進(jìn)行重試。
- NestedConsistencyExecutor :嵌套執(zhí)行器,專門處理嵌套一致性調(diào)用場(chǎng)景,記錄執(zhí)行信息但不立即執(zhí)行方法,通過(guò)重試機(jī)制來(lái)執(zhí)行嵌套任務(wù),解決同一事務(wù)中嵌套調(diào)用的問(wèn)題。
持久層
使用數(shù)據(jù)庫(kù)存儲(chǔ)執(zhí)行記錄,支持記錄的創(chuàng)建、更新和查詢。大消息存儲(chǔ)到MongoDB,避免數(shù)據(jù)庫(kù)性能問(wèn)題。
異步執(zhí)行實(shí)現(xiàn)原理
異步執(zhí)行的核心是將操作持久化,然后在事務(wù)提交后異步執(zhí)行。這種設(shè)計(jì)確保了只有當(dāng)原事務(wù)提交成功后,才會(huì)執(zhí)行異步操作,避免了事務(wù)回滾后執(zhí)行異步操作的問(wèn)題。
圖片
重試機(jī)制實(shí)現(xiàn)
重試機(jī)制基于以下幾個(gè)關(guān)鍵點(diǎn):
- 持久化記錄:記錄每次執(zhí)行的參數(shù)和狀態(tài)
- 定時(shí)掃描:定期掃描需要重試的記錄
- 分布式鎖:確保在集群環(huán)境下只有一個(gè)實(shí)例執(zhí)行重試
- 反射調(diào)用:通過(guò)反射動(dòng)態(tài)調(diào)用目標(biāo)方法
五、領(lǐng)域模型
圖片
六、 數(shù)據(jù)模型
圖片
七、一致性框架案例
買家在得物App下單后,供應(yīng)鏈會(huì)接收商品發(fā)貨單據(jù)。商品從倉(cāng)庫(kù)發(fā)貨時(shí),倉(cāng)儲(chǔ)域要將發(fā)貨信息通知履約域,并扣減倉(cāng)儲(chǔ)庫(kù)存。代碼如下:
public void ship(String orderCode){
//通知履約域
notifyOfcShip(orderCode);
//庫(kù)存扣減
inventorySubtract(orderCode);
}
@EventualConsistency(referenceNo = "#orderCode")
public void notifyOfcShip(String orderCode){
// 發(fā)貨調(diào)用履約域
}
效果:即使履約系統(tǒng)出現(xiàn)異常,庫(kù)存也能正??蹨p,確保商品發(fā)貨成功。一致性框架會(huì)重試通知履約域的方法,確保履約域發(fā)貨單狀態(tài)變更并通知交易域。
八、結(jié)語(yǔ)
在分布式系統(tǒng)中,一致性框架是確保系統(tǒng)可靠性的重要工具。通過(guò)正確使用一致性框架,我們可以構(gòu)建既高可用又最終一致的系統(tǒng),應(yīng)對(duì)各種復(fù)雜的分布式場(chǎng)景。希望本文能幫助您更好地理解一致性框架的原理和應(yīng)用,為您的系統(tǒng)添磚加瓦。