1. 程式人生 > >通過實際業務場景理解後端介面的冪等性

通過實際業務場景理解後端介面的冪等性

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

非冪等場景:
服務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狀態為『處理成功』;

介面的冪等性實際上就是介面可重複呼叫,在呼叫方多次呼叫的情況下,介面最終得到的結果是一致的。有些介面可以天然的實現冪等性,比如查詢介面,對於查詢來說,你查詢一次和兩次,對於系統來說,沒有任何影響。但對於有寫庫操作的增刪改介面,多次呼叫就會對系統有多次影響;

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

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

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