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

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