1.1. 冪等性
表達的是N次變換與1次變換的結果相同
1.2. Http 維度
::: alert-info
從定義上看,Http方法的冪等性是指一次和多次調用某一個資源應該具有相同的副作用.
:::
1.2.1. GET 方法
HTTP Get 方法用於獲取資源,不應有副作用
1.2.2. 後臺解決接口冪等性問題
-
token + 分佈式鎖
-
狀態機冪等性
:::alert-info
針對更新操作,比如業務上需要訂單狀態,訂單有 待支付,支付中,支付成功,支付失敗,訂單超時關閉燈,在設計時最好支持狀態的單向改變(不可逆),這樣在更新時where條件里加上status= 我期望的原來的status, 多次調用的話實際上也只會執行一次.
update xxx set xxx=xxx where status = 'daizhifu' and id=xxx
:::
- 樂觀鎖
-
如果更新已有數據,可以進行加鎖更新,也可以設計表結構時使用樂觀鎖,通過version來做樂觀鎖,這樣保證執行效率,又能保證冪等性。樂觀鎖的version版本在更新業務數據時要自增。
-
也可使用
update with condition
, 更新帶條件,實現樂觀鎖,通過version或者其他條件實現樂觀鎖。
-
- 防重表實現冪等性
- 增加一個防重複表 ,利用數據實現分佈式鎖
- select + insert 實現冪等性
- 該方案就是在操作前先查詢一下,燈符合要求再插入,該方案在沒有併發的系統中可以解決冪等性問題,在但JVM有併發的時候可以JVM加鎖來保證冪等性,在分佈式環境無法保證冪等性,可以使用分佈式鎖來保證。
- 分佈式鎖保證冪等性
-
進入方法時,先獲取鎖,加入獲取到鎖,就繼續後面的流程。加入沒有獲取到鎖,就等待鎖的示範指導獲取到鎖,當執行完方法是,釋放鎖,當然,鎖要設置個超時,防止意外沒有釋放,它可以用來解決分佈式系統的冪等性。
-
常規的分佈式鎖方案是radis和zookeeper等工具。
-
- 緩衝隊列
- 將請求都快速接收,放入緩衝隊列,後續使用異步任務處理隊列中的數據,過濾掉重複請求,此方式有點事銅鼓該異步處理,高吞吐,不足是不能及時處理返回結果,需要後續輪詢處理結果。
- 全局唯一號實現冪等性