摘要:有些接口可以天然的實現(xiàn)冪等性,比如查詢接口,對于查詢來說,你查詢一次和兩次,對于系統(tǒng)來說,沒有任何影響但對于有寫庫操作的增刪改接口,多次調(diào)用就會對系統(tǒng)有多次影響。
寫在前面:之前在設(shè)計接口時因經(jīng)驗尚淺,并未過多考慮冪等性,但這兩天出現(xiàn)的一個線上問題讓我認(rèn)識到了某些情況下接口冪等性的重要性;
非冪等場景:
服務(wù)A將單據(jù)A信息通過RPC遠(yuǎn)程過程調(diào)用傳給下游服務(wù)B接口(非冪等接口)用于生成關(guān)聯(lián)單據(jù)B,服務(wù)B接口會校驗是否已經(jīng)接收過單據(jù)A,如果已接收過,會報錯『重復(fù)的單據(jù)』,如果未接收過,則生產(chǎn)關(guān)聯(lián)單據(jù)B并寫庫,將結(jié)果返回服務(wù)A,服務(wù)A收到結(jié)果后修改此單據(jù)狀態(tài),將結(jié)果返回客戶端。簡化流程圖如下所示:
非冪等出現(xiàn)的問題:
服務(wù)A調(diào)用服務(wù)B后,服務(wù)B生成關(guān)聯(lián)單據(jù)B寫庫成功,返回成功給服務(wù)A;但由于網(wǎng)絡(luò)抖動,服務(wù)A未接收到服務(wù)B返回的響應(yīng),默認(rèn)認(rèn)定失敗,返回客戶端失敗;業(yè)務(wù)人員重試,但由于服務(wù)B已接受過此單據(jù)A,會拋出異?!褐貜?fù)單據(jù)A』,對于此單據(jù)A就永遠(yuǎn)無法接受到單據(jù)B的成功響應(yīng),永遠(yuǎn)為『處理失敗』狀態(tài),與實際狀態(tài)不一致;(出現(xiàn)此問題后,首先確認(rèn)單據(jù)A的關(guān)聯(lián)單據(jù)B已生成,然后手動修復(fù)服務(wù)A里單據(jù)A的狀態(tài)為『處理成功』)
冪等性解決:
為了解決以上問題,就需要保證下游服務(wù)B接口對單據(jù)A維度做冪等性;判斷再次接受到單據(jù)A之后,不做任何操作,直接返回成功即可,服務(wù)A接受到成功后即可修改單據(jù)A狀態(tài)為『處理成功』;
接口的冪等性實際上就是接口可重復(fù)調(diào)用,在調(diào)用方多次調(diào)用的情況下,接口最終得到的結(jié)果是一致的。有些接口可以天然的實現(xiàn)冪等性,比如查詢接口,對于查詢來說,你查詢一次和兩次,對于系統(tǒng)來說,沒有任何影響;但對于有寫庫操作的增刪改接口,多次調(diào)用就會對系統(tǒng)有多次影響。
實現(xiàn)冪等性的關(guān)鍵在于識別重復(fù)的請求,對重復(fù)的請求返回成功即可,無需再對系統(tǒng)造成影響;
實現(xiàn)冪等性后的簡化流程圖:
寫在最后:冪等性應(yīng)用的場景還有很多,實現(xiàn)也有很多方式,更有很多需要考慮的問題,隨著工作學(xué)習(xí)的深入,理解也一定會越來越深入的,加油!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/28491.html
摘要:解決冪等問題的三部曲,也是作者的思考框架。這是解決冪等問題的第二部曲列出并減少副作用的分析維度。所以在并發(fā)執(zhí)行的維度,將并發(fā)重復(fù)執(zhí)行變成串行重復(fù)執(zhí)行是最好的冪等解決方案。 綱要 文章目的:本文旨在提煉一套分布式冪等問題的思考框架,而非解決某個具體的分布式冪等問題。在這個框架體系內(nèi),會有一些方案舉例說明。文章目標(biāo):希望讀者能通過這套思考框架設(shè)計出符合自己業(yè)務(wù)的完備的冪等解決方案。文章內(nèi)容...
摘要:而純函數(shù),主要強調(diào)相同的輸入,多次調(diào)用,輸出也相同且無副作用。對于組合可能不返回值的函數(shù)很有用在其它的一些地方,也稱為,也稱為,也稱為 參考文檔1 參考文檔2 函數(shù)式編程術(shù)語 高階函數(shù) Higher-Order Functions 以函數(shù)為參數(shù)的函數(shù) 返回一個函數(shù)的函數(shù) 函數(shù)的元 Arity 比如,一個帶有兩個參數(shù)的函數(shù)被稱為二元函數(shù) 惰性求值 Lazy evaluation 是...
閱讀 2638·2021-11-23 09:51
閱讀 631·2019-08-30 13:59
閱讀 1920·2019-08-29 11:20
閱讀 2606·2019-08-26 13:41
閱讀 3324·2019-08-26 12:16
閱讀 808·2019-08-26 10:59
閱讀 3421·2019-08-26 10:14
閱讀 678·2019-08-23 17:21