2902-接口冪等性和一致性

接口冪等性:只要保證接口內(nèi)的邏輯不涉及接口外的對(duì)象狀態(tài)累積或變遷即可。

冪等性在技術(shù)上同時(shí)要求可重入性;在分布式系統(tǒng)中,重試并發(fā)都是常態(tài)。

1.接口入口做來源+單號(hào)檢驗(yàn)

2.分布式鎖

3.數(shù)據(jù)庫(kù)(單庫(kù)多表【本地事務(wù)】、多庫(kù)【分布式事務(wù)】、單庫(kù)單字段【業(yè)務(wù)保證】)樂觀鎖(單號(hào)+【版本號(hào)、狀態(tài)機(jī):?jiǎn)蜗?支付中、支付成功 和 雙向 可用、不可用,庫(kù)存扣減】)、悲觀鎖(唯一健約束)、去重表、插入前狀態(tài)檢驗(yàn)。

狀態(tài)機(jī)原理:

在設(shè)計(jì)單據(jù)或任務(wù)相關(guān)的業(yè)務(wù),肯定會(huì)涉及到有限狀態(tài)機(jī),狀態(tài)在不同的情況下會(huì)發(fā)生變更。如果狀態(tài)機(jī)已經(jīng)處于下一個(gè)狀態(tài),新發(fā)起的上一個(gè)狀態(tài)的變更,理論上是不能夠變更的,可有效保證了有限狀態(tài)機(jī)的冪等。

分布式事務(wù)不可能實(shí)現(xiàn)絕對(duì)的一致性。從概率的角度思考問題,如果能將不一致的概率降到最低,比如保證冪等+重試(衰減重試),再輔以業(yè)務(wù)監(jiān)控和人工干預(yù),就可以實(shí)現(xiàn)系統(tǒng)整體上較高的一致性。

冪等的對(duì)象(交易流水和用戶ID)和范圍(幾秒、幾分鐘、永久)

比如訂單回傳憑證碼環(huán)節(jié):

場(chǎng)景1:如果我們先做本地的憑證碼數(shù)據(jù)落盤到數(shù)據(jù)庫(kù),在調(diào)用訂單中心;可能因?yàn)榫W(wǎng)絡(luò)中斷而沒有調(diào)用到訂單中心;結(jié)果是 本地成功,訂單中心失?。?/p>

場(chǎng)景2:如果先調(diào)用訂單中心;再做數(shù)據(jù)落盤;可能因?yàn)楸镜財(cái)?shù)據(jù)庫(kù)忽然斷連;結(jié)果是本地失敗, 訂單中心成功。

核心思想:1.分布式事務(wù)降緯為本地化事務(wù); 2.可靠事件投遞+冪等調(diào)用= ?數(shù)據(jù)最終一致性;

1.本地化事務(wù)

1.服務(wù)在同一個(gè)本地事務(wù)中記錄業(yè)務(wù)數(shù)據(jù)和事件數(shù)據(jù)

2.事件恢復(fù)服務(wù)定時(shí)從事件表中恢復(fù)未發(fā)布成功的事件,重新發(fā)布,重新發(fā)布成功后刪除記錄的事件,這樣能夠保證事件一定能夠被投遞。

優(yōu)點(diǎn):實(shí)現(xiàn)起來比較安全, 外部依賴比較少;

缺點(diǎn):事件表和本地表在統(tǒng)一數(shù)據(jù)庫(kù)中;以后事件表可能是性能瓶頸;系統(tǒng)擴(kuò)展性差;消息實(shí)時(shí)性差;

2.本地化事務(wù)+非事務(wù)性MQ

1.服務(wù)在同一個(gè)本地事務(wù)中記錄業(yè)務(wù)數(shù)據(jù)和事件數(shù)據(jù)

2.服務(wù)實(shí)時(shí)發(fā)布一個(gè)事件到MQ中,通過mq消費(fèi)事件,但是在消費(fèi)事件之前到數(shù)據(jù)庫(kù)中check 該事件是否真是落庫(kù);如果沒有落庫(kù)放棄執(zhí)行該事件;這樣能夠保證事件投遞的實(shí)時(shí)性。

3.事件恢復(fù)服務(wù)定時(shí)從事件表中恢復(fù)未發(fā)布成功的事件,重新發(fā)布,重新發(fā)布成功后刪除記錄的事件,這樣能夠保證事件一定能夠被投遞。

優(yōu)點(diǎn):實(shí)現(xiàn)起來比較安全,外部依賴比較少;比方案一消息實(shí)時(shí)性強(qiáng)

缺點(diǎn):事件表和本地表在統(tǒng)一數(shù)據(jù)庫(kù)中;以后事件表可能是性能瓶頸;系統(tǒng)擴(kuò)展性差。

3.事務(wù)性MQ

1.業(yè)務(wù)服務(wù)在事務(wù)提交前,通過實(shí)時(shí)事件服務(wù)向事件系統(tǒng)請(qǐng)求發(fā)送事件,事件系統(tǒng)只記錄事件并不真正發(fā)送

2.業(yè)務(wù)服務(wù)在提交后,通過實(shí)時(shí)事件服務(wù)向事件系統(tǒng)確認(rèn)發(fā)送,事件得到確認(rèn)后事件系統(tǒng)才真正發(fā)布事件到消息代理

3.業(yè)務(wù)服務(wù)在業(yè)務(wù)回滾時(shí),通過實(shí)時(shí)事件向事件系統(tǒng)取消事件

4.事件系統(tǒng)的事件恢復(fù)服務(wù)會(huì)定期找到未確認(rèn)發(fā)送的事件向業(yè)務(wù)服務(wù)查詢狀態(tài),根據(jù)業(yè)務(wù)服務(wù)返回的狀態(tài)決定事件是要發(fā)布還是取消

優(yōu)點(diǎn):系統(tǒng)擴(kuò)展性強(qiáng);事件表和本地表解耦;

缺點(diǎn):系統(tǒng)比較復(fù)雜;業(yè)務(wù)服務(wù)還要時(shí)間查詢未決事件接口。

4.有限狀態(tài)機(jī)

1.只保證本地事務(wù)的完整性;所有的對(duì)外的調(diào)用和交互通過基于當(dāng)前業(yè)務(wù)庫(kù)db的當(dāng)前數(shù)據(jù)的狀態(tài)判斷;基于類似狀態(tài)機(jī)模式;向下游發(fā)起重復(fù)調(diào)用;

2.本身業(yè)務(wù)狀態(tài)機(jī)代表了一定的事件性質(zhì);

優(yōu)點(diǎn):基于現(xiàn)有業(yè)務(wù);初期實(shí)現(xiàn)成本低;

缺點(diǎn):系統(tǒng)擴(kuò)展性差;依賴于對(duì)于業(yè)務(wù)狀態(tài)機(jī)的考慮;如果有后續(xù)缺少狀態(tài)或者新增狀態(tài)會(huì)很麻煩;后續(xù)改造成本高


結(jié)論

基于時(shí)間成本:

暫時(shí)決定實(shí)現(xiàn)方案一;

二期實(shí)現(xiàn)方案二(實(shí)時(shí)性考慮);

方案三依賴于事務(wù)性MQ支持,另外對(duì)現(xiàn)有系統(tǒng)改動(dòng)比較大;侵入比較高;放棄該方案。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容