手把手教你五分鐘搞定冪等本質
冪等概念
冪等性原本是數學上的概念,即使公式:f(f(x)) =f(x)能夠成立的數學性質。用在編程領域,則意為對同一個系統,使用同樣的條件,一次請求和重復的多次請求對系統資源的影響是一致的。冪等性是系統服務對外一種承諾,承諾只要調用接口成功,外部多次調用對系統的影響是一致的。聲明為冪等的服務會認為外部調用失敗是常態,并且失敗之后必然會有重試。比如我們發起一筆付款請求,應該只扣用戶賬戶一次錢,當遇到網絡重發或系統問題重發,也應該只扣一次錢,具體冪等處理流程如下圖所示:

SQL中的冪等
SELECT col1 FROM tab1 WHER col2=1,無論執行多少次都不會改變狀態,是天然的冪等。
UPDATE tab1 SET col1=1 WHERE col2=1,無論執行成功多少次狀態都是一致的,因此也是冪等操作。
UPDATE tab1 SET col1=col1+1 WHERE col2=1,每次執行的結果都會發生變化,這種不是冪等的。
insert into user(userid,name) values(123456,'kevin') 如userid為唯一主鍵,即重復操作上面的業務,只會插入一條用戶數據,具備冪等性。
如userid不是主鍵,可以重復,那上面業務多次操作,數據都會新增多條,不具備冪等性。
delete from user where userid=123456,多次操作,結果一樣,具備冪等性
HTTP方法中的冪等
HTTP方法的冪等性是指一次和多次請求某一個資源應該具有同樣的副作用。
- GET方法用于獲取資源,不應有副作用,所以是冪等的。
- DELETE方法用于刪除資源,有副作用,但它應該滿足冪等性。例如:刪掉id為123456的帖子,調用者可以多次調用或刷新頁面而不必擔心引起錯誤。
- POST方法不具備冪等性,兩次相同的POST請求會在服務器端創建兩份資源,它們具有不同的URI
- PUT方法具備冪等性,他所對應的URI是要創建或更新資源的本身,對同一URI進行多次PUT的副作用和一次PUT是相同的。
- PATCH不具備冪等性 他會將一組描述在請求實體里的更改應用到URI標志的資源。這組更改以 "補丁文檔" 的格式表示,如果URI未指向現有資源,服務器可能根據補丁文檔的類型和權限等來創建一個新資源。
測試角度看冪等
核心測試點包括:
- 用戶重復提交
- 網絡重發
- 消息重發
- 系統間重試
重點關注的內容如下:
1)需要關注業務性質和產品設計,是否需要做到冪等,是時間維度的冪等(即冪等對象的范圍,是個人還是機構,是某一次交易還是某種類型的交易)還是空間維度的冪等(即冪等的保證時間,是幾秒、幾分鐘還是永久性的)。
2)接口的冪等測試,在做接口測試時對每個接口都思考一下是否需要冪等。
3)業務場景,特別是涉及到錢的業務場景,對失敗重試機制一定要驗證。