冪等性概念
數學中的定義:其任意多次執行所產生的影響均與一次執行的影響相同。比如f(f(x)) = f(x).
HTTP協議中的定義:在HTTP/1.1規范中冪等性的定義是:HTTP方法的冪等性是指一次和多次請求某一個資源應該具有同樣的副作用。其中GET,PUT, DELETE
如何測試冪等性
冪等性如此重要,那我們在具體的測試執行中該如何設計用例場景呢。主要有以下幾種方法(有其他方法手段,歡迎補充)
-
前端重復快速點擊(一般前端會做提交)
-
網絡重發,比如在掃碼支付時,商戶在掃碼時,先斷網掃碼一次再重連掃碼
-
對同一筆訂單,不同商戶同時掃碼
-
對同一筆業務並發請求,比如並發提現
-
Nginx重發情況(這種情況還沒試過,要對nginx比較熟悉才行)
開發如何保障冪等性
1.insert前先select
2.加悲觀鎖
3.加樂觀鎖
4.加唯一索引
5.建防重表
6.更據狀態機
7.加分布式鎖
8.獲取token
「去重」是對請求或者消息在「一定時間內」進行去重「N次」
「冪等」則是保證請求或消息在「任意時間內」進行處理,都需要保證它的結果是一致的
不論是「去重」還是「冪等」,都需要對有一個「唯一 Key」,並且有地方對唯一Key進行「存儲」
去重 前端form表單提交按鈕禁用時間,后端10s相同內容消息去重 強調下
「冪等」和「去重」的本質:「唯一Key」+「存儲」
唯一key:「5分鍾相同內容消息去重」,我直接MD5請求參數作為唯一Key。「1小時模板去重」則是「模板ID+userId」作為唯一Key,「一天內渠道去重」則是「渠道ID+userId」作為唯一Key…
「去重」,使用布隆過濾器