一個在傳統行業作業了7年的粉絲私信我,
他最近去很多互聯網公司面試,遇到的很多技術和概念都沒聽過,
其中就有一道題是:”什么是冪等、如何解決冪等性問題“?
他說,這個概念聽都沒聽過,怎么可能回答出來,
好的,對于這個問題,看看普通人和高手的回答,
普通人:
嗯,,,,,,,,,,,,,,
高手:
好的,
所謂冪等,其實它是一個數學上的概念,在計算機編程領域中,冪等是指一個方法被多次重復執行的時候產生的影響和第一次執行的影響相同,
之所以要考慮到冪等性問題,是因為在網路通信中,存在兩種行為可能會導致介面被重復執行,
- 用戶的重復提交或者用戶的惡意攻擊,導致這個請求會被多次重復執行,
- 在分布式架構中,為了避免網路通信導致的資料丟失,在服務之間進行通信的時候都會設計超時重試的機制,而這種機制有可能導致服務端介面被重復呼叫,
所以在程式設計中,對于資料變更類操作的介面,需要保證介面的冪等性,
而冪等性的核心思想,其實就是保證這個介面的執行結果只影響一次,后續即便再次呼叫,也不能對資料產生影響,所以基于這樣一個訴求,常見的解決方法有很多,
- 使用資料庫的唯一約束實作冪等,比如對于資料插入類的場景,比如創建訂單,因為訂單號肯定是唯一的,所以如果是多次呼叫就會觸發資料庫的唯一約束例外,從而避免一個請求創建多個訂單的問題,
- 使用redis里面提供的setNX指令,比如對于MQ消費的場景,為了避免MQ重復消費導致資料多次被修改的問題,可以在接受到MQ的訊息時,把這個訊息通過setNx寫入到redis里面,一旦這個訊息被消費過,就不會再次消費,
- 使用狀態機來實作冪等,所謂的狀態機是指一條資料的完整運行狀態的轉換流程,比如訂單狀態,因為它的狀態只會向前變更,所以多次修改同一條資料的時候,一旦狀態發生變更,那么對這條資料修改造成的影響只會發生一次,
當然,除了這些方法以外,還可以基于token機制、去重表等方法來實作,但是不管是什么方法,無非就是兩種,
- 要么就是介面只允許呼叫一次,比如唯一約束、基于redis的鎖機制,
- 要么就是對資料的影響只會觸發一次,比如冪等性、樂觀鎖
以上就是我對這個問題的理解,
總結
技術這個行業的發展是很快的,如果自己的技術能力和認知跟不上變化,
那基本上可以說是被時代淘汰了,所以保持持續學習是非常重要的,
喜歡我的作品的小伙伴記得點贊和收藏,
如果你在面試的時候遇到一些不懂的問題,可以隨時來私信我
著作權宣告:本博客所有文章除特別宣告外,均采用 CC BY-NC-SA 4.0 許可協議,轉載請注明來自
Mic帶你學架構!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力,歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術干貨!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/482121.html
標籤:Java
