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