互聯網高頻面試題,什么是冪等?如何解決冪等性問題
一個在傳統行業工作了 7 年的粉絲私信我。說他最近去很多互聯網公司面試,遇到的很多技術和概念都沒聽過。其中就有一道題是:”什么是冪等、如何解決冪等性問題“?他說,這個概念聽都沒聽過,怎么可能回答出來。
接下來,我借這位同學的問題,給大家分享一下我對這個問題的理解。
1.什么是冪等?
其實冪等,是一個數學上的概念。而在計算機編程領域中,冪等是指一個方法被多次重復執行的時候所期望的結果要和第一次執行所期望的結果保持一致。簡單理解就是,一個邏輯即使被重復執行多次,也不影響最終結果的一致性,這叫冪等。
之所以要考慮到冪等性問題,是因為在網絡通信中,有這兩種行為都有可能會導致接口被重復執行。
第一種是,用戶的重復提交或者用戶的惡意攻擊;
第二種是,分布式系統中,為了避免數據丟失,采用的超時重試機制。
這兩種情況都有可能導致服務接口被重復調用。所以在程序設計中,對于數據變更類操作的接口,需要保證接口的冪等性。
而冪等性的核心思想,其實就是保證這個接口的執行結果只影響一次,后續即便再次調用,也不能對數據產生影響,所以基于這樣一個需求,我們如何解決冪等性問題呢?
2.如何解決?
解決冪等性問題的方法有很多,下面我分享一下常用幾種方案。
第1種方案,就是使用數據庫的唯一約束來實現冪等,比如對于數據插入類的場景,比如創建訂單,因為訂單號肯定是唯一的,所以如果是多次調用就會觸發數據庫的唯一約束異常,從而避免一個請求創建多個訂單的問題。
第2種方案,就是使用 Redis 提供的 setNX 指令,比如對于 MQ 消費的場景,為了避免 MQ 重。
復消費導致數據多次被修改的問題,可以在接受到 MQ 的消息時,把這個消息通過 setNX 寫入到 Redis 中,一旦這個消息被消費過,就不會再次消費。
第3種方案,使用狀態機來實現冪等,所謂的狀態機是指一條數據的完整運行狀態的轉換流程,比如 ,因為它的狀態只會向前變更,所以多次修改同一條數據的時候,一旦狀態發生變更,那么對這條數據修改造成的影響只會發生一次。
當然,除了以上3種常用的意外,還可以基于 Token 機制或者增加去重表等方法來實現,但是不管是什么方法,無非就是兩種思路,要么就是接口只允許調用一次,比如唯一約束、基于 Redis 的鎖機制。
要么就是對數據的影響只會觸發一次,比如樂觀鎖等。
以上就是我對這個問題的理解。
技術這個行業的發展是很快的,如果自己的技術能力和認知跟不上變化。那基本上可以說是被時代淘汰了,所以保持持續學習是非常重要的。