接口冪等性不只是分布式事務方便回滾的保證,同時也是SOA服務實現中摒除重復消息的保證。
現產品都是走DUBBO,調用超時重試3次這個常見吧,莫名的網絡問題就會引起。所以永遠不要指望調用方每次請求消息不一樣,對於讀操作,重復消息可能無害,可對於寫操作很可能就是災難。
冪等性是系統的接口對外一種承諾(而不是實現), 承諾只要調用接口成功, 外部多次調用對系統的影響是一致的。(聲明為冪等的接口會認為外部調用失敗是常態, 並且失敗之后必然會有重試。這一重試就是分布式事務沖正(或者叫補償)的一種方式)
舉個例子更能說明:
一個冪等的操作典型如:
把編號為5的記錄的A字段設置為0
這種操作不管執行多少次都是冪等的。
一個非冪等的操作典型如:
把編號為5的記錄的A字段增加1
這種操作顯然就不是冪等的。
要做到冪等性,從接口設計上來說不設計任何非冪等的操作即可。
譬如說需求是:
當用戶點擊贊同時,將答案的贊同數量+1。
改為:
當用戶點擊贊同時,確保答案贊同表中存在一條記錄,用戶、答案。
贊同數量由答案贊同表統計出來。