經過實際業務場景理解後端接口的冪等性

寫在前面:以前在設計接口時因經驗尚淺,並未過多考慮冪等性,但這兩天出現的一個線上問題讓我認識到了某些狀況下接口冪等性的重要性;網絡

非冪等場景:
服務A單據A信息經過RPC遠程過程調用傳給下游服務B接口(非冪等接口)用於生成關聯單據B,服務B接口會校驗是否已經接收過單據A,若是已接收過,會報錯『重複的單據』,若是未接收過,則生產關聯單據B並寫庫,將結果返回服務A,服務A收到結果後修改此單據狀態,將結果返回客戶端。簡化流程圖以下所示:
圖片描述學習

非冪等出現的問題:
服務A調用服務B後,服務B生成關聯單據B寫庫成功,返回成功給服務A;但因爲網絡抖動,服務A未接收到服務B返回的響應,默認認定失敗,返回客戶端失敗;業務人員重試,但因爲服務B已接受過此單據A,會拋出異常『重複單據A』,對於此單據A就永遠沒法接受到單據B的成功響應,永遠爲『處理失敗』狀態,與實際狀態不一致;(出現此問題後,首先確認單據A的關聯單據B已生成,而後手動修復服務A裏單據A的狀態爲『處理成功』)spa

冪等性解決:
爲了解決以上問題,就須要保證下游服務B接口單據A維度冪等性;判斷再次接受到單據A以後,不作任何操做,直接返回成功便可,服務A接受到成功後便可修改單據A狀態爲『處理成功』;設計

接口的冪等性實際上就是接口可重複調用,在調用方屢次調用的狀況下,接口最終獲得的結果是一致的。有些接口能夠自然的實現冪等性,好比查詢接口,對於查詢來講,你查詢一次和兩次,對於系統來講,沒有任何影響;但對於有寫庫操做的增刪改接口,屢次調用就會對系統有屢次影響。接口

實現冪等性的關鍵在於識別重複的請求,對重複的請求返回成功便可,無需再對系統形成影響;圖片

實現冪等性後的簡化流程圖:
圖片描述it

寫在最後:冪等性應用的場景還有不少,實現也有不少方式,更有不少須要考慮的問題,隨着工做學習的深刻,理解也必定會愈來愈深刻的,加油!class

相關文章
相關標籤/搜索