【Java面試】什麼是冪等?如何解決冪等性問題?

跟著Mic學架構 發表於 2022-06-02
Java 面試

一個在傳統行業工作了7年的粉絲私信我。

他最近去很多網際網路公司面試,遇到的很多技術和概念都沒聽過。

其中就有一道題是:”什麼是冪等、如何解決冪等性問題“?

他說,這個概念聽都沒聽過,怎麼可能回答出來。

好的,對於這個問題,看看普通人和高手的回答。

普通人:

嗯。。。。。。。。。。。。。。

高手:

好的。

所謂冪等,其實它是一個數學上的概念,在計算機程式設計領域中,冪等是指一個方法被多次重複執行的時候產生的影響和第一次執行的影響相同。

之所以要考慮到冪等性問題,是因為在網路通訊中,存在兩種行為可能會導致介面被重複執行。

  1. 使用者的重複提交或者使用者的惡意攻擊,導致這個請求會被多次重複執行。
  2. 在分散式架構中,為了避免網路通訊導致的資料丟失,在服務之間進行通訊的時候都會設計超時重試的機制,而這種機制有可能導致服務端介面被重複呼叫。

所以在程式設計中,對於資料變更類操作的介面,需要保證介面的冪等性。

而冪等性的核心思想,其實就是保證這個介面的執行結果隻影響一次,後續即便再次呼叫,也不能對資料產生影響,所以基於這樣一個訴求,常見的解決方法有很多。

  1. 使用資料庫的唯一約束實現冪等,比如對於資料插入類的場景,比如建立訂單,因為訂單號肯定是唯一的,所以如果是多次呼叫就會觸發資料庫的唯一約束異常,從而避免一個請求建立多個訂單的問題。
  2. 使用redis裡面提供的setNX指令,比如對於MQ消費的場景,為了避免MQ重複消費導致資料多次被修改的問題,可以在接受到MQ的訊息時,把這個訊息通過setNx寫入到redis裡面,一旦這個訊息被消費過,就不會再次消費。
  3. 使用狀態機來實現冪等,所謂的狀態機是指一條資料的完整執行狀態的轉換流程,比如訂單狀態,因為它的狀態只會向前變更,所以多次修改同一條資料的時候,一旦狀態發生變更,那麼對這條資料修改造成的影響只會發生一次。

當然,除了這些方法以外,還可以基於token機制、去重表等方法來實現,但是不管是什麼方法,無非就是兩種,

  • 要麼就是介面只允許呼叫一次,比如唯一約束、基於redis的鎖機制。
  • 要麼就是對資料的影響只會觸發一次,比如冪等性、樂觀鎖

以上就是我對這個問題的理解。

總結

技術這個行業的發展是很快的,如果自己的技術能力和認知跟不上變化。

那基本上可以說是被時代淘汰了,所以保持持續學習是非常重要的。

喜歡我的作品的小夥伴記得點贊和收藏。

如果你在面試的時候遇到一些不懂的問題,可以隨時來私信我

file

版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!