冪等性
定義:
解釋1:一次和多次請求某一個資源應該具有同樣的副作用。
解釋2:同樣的請求被執行一次與連續執行多次的效果是一樣的,服務器的狀態是一樣的。
解釋3:任意多次執行對資源本身所產生的影響均與一次執行相同。
解釋4:調用接口成功,即使再多次調用,對系統的影響也是一致的。
解釋5:用戶對同一個操作發起的一次請求或多次請求的結果是一致的,不會因爲多次點擊而產生的副作用。
如果沒有冪等性的場景:
用戶在APP上點擊多次提交訂單,後臺會生產多個訂單
多次點擊支付,由於網絡原因,扣了多次錢
爲什麼需要冪等性?
用戶處理方便,雖然服務邏輯複雜,保證了用戶的體驗
HTTP的冪等性:
GET:從服務器獲取資源,雖然數據再變動,結果不同,但冪等性強調的是1次操作和N次操作不會對數據造成副作用,滿足冪等
DELETE:一次刪除和多次刪除造成的結果是一樣的,滿足
PUT:update語句沒有++等操作時候,一次更新和多次更新的結果都是一樣的,滿足
POST:一次和多次會給服務器造成多個不同的結果,即產生了副作用,不滿足
保證冪等性的關鍵:
唯一標識;
將並行變成串行;
- 比如秒殺業務中,可以將用戶id和秒殺訂單id聯合作爲唯一鍵,保證冪等性
- 多次點擊支付,可以攔截用戶請求,將請求進行排隊。只有一條請求可以在mysql將訂單狀態變爲支付成功,剩下的的請求在判斷該訂單是否支付過。此時滿足冪等性
保證冪等性的解決方案:(具體介紹看下面大佬的鏈接吧)
- 樂觀鎖
- 防重表
- 分佈式鎖
- token令牌
感謝:
深入理解冪等性
分佈式系統中的冪等設計