1. 程式人生 > 其它 >介面保證冪等性該如何實現?

介面保證冪等性該如何實現?

冪等就是一個操作,不論執行多少次,產生的效果和返回的結果都是一樣的。
要做到冪等性,從介面設計上來說不設計任何非冪等的操作即可。
例如很常見的支付下單等場景,由於分散式環境中網路的複雜性,使用者誤操作,網路抖動,訊息重複,服務超時導致業務自動重試等等各種情況都可能會使線上資料產生了不一致,造成生產事故。

  • 業務欄位加唯一約束(簡單)
  • 令牌+唯一約束(簡單推薦)客戶端每次在呼叫介面的時候,需要在請求頭中,傳遞令牌引數(令牌可以儲存到redis中),每次令牌只能用一次。一旦使用之後,就會被刪除,這樣可以有效防止重複提交。
  • mysql的insert ignore或者on duplicate key update(簡單)
  • 共享鎖+普通索引(簡單)
  • 利用MQ或者Redis擴充套件(排隊)
  • 同步鎖(單執行緒,叢集可能會失效)
  • 分散式鎖如redis(實現複雜)
  • 其他方案如多版本控制MVCC 樂觀鎖 悲觀鎖 狀態機等。。。
  • 對客戶端請求排隊或者單執行緒都可以處理冪等問題,需要根據具體業務選擇合適的方案,但必須前後端一起做,前端做了可以提升使用者體驗,後端則可以保證資料安全。