天天看點

通過實際業務場景了解後端接口的幂等性

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

非幂等場景:

服務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的狀态為『處理成功』)

幂等性解決:

為了解決以上問題,就需要保證下遊服務B接口對單據A次元做幂等性;判斷再次接受到單據A之後,不做任何操作,直接傳回成功即可,服務A接受到成功後即可修改單據A狀态為『處理成功』;

接口的幂等性實際上就是接口可重複調用,在調用方多次調用的情況下,接口最終得到的結果是一緻的。有些接口可以天然的實作幂等性,比如查詢接口,對于查詢來說,你查詢一次和兩次,對于系統來說,沒有任何影響。但對于有寫庫操作的增删改接口,多次調用就會對系統有多次影響;

實作幂等性的關鍵在于識别重複的請求,對重複的請求傳回成功即可,無需再對系統造成影響;

實作幂等性後的簡化流程圖:

通過實際業務場景了解後端接口的幂等性

寫在最後:幂等性應用的場景還有很多,實作也有很多方式,更有很多需要考慮的問題,随着工作學習的深入,了解也一定會越來越深入的,加油!

部落格搬家:https://segmentfault.com/blog/leeonfancy

繼續閱讀