每個工程師都應該了解的 聊聊冪等

2021-08-03 10:03:12 字數 1203 閱讀 2974

什麼是冪等(idempotency)?簡單來說,乙個操作如果具有任意多次執行所產生的影響均與一次執行的影響相同,我們就稱之為冪等。

這樣說來,似乎很容易理解。但要知道,這樣的定義,其實是乙個語義範疇對行為結果的定義。如何用語法和規則去確保行為能達到這個結果,往往需要很謹慎的設計和實現。實際系統中,冪等是乙個極為重要的概念。無論是在大型網際網路應用還是企業級架構中,我們都見到 rest api 被越來越多的採用。而正確實現冪等,往往是 api 中最難的技術點之一。

先說為什麼重要。舉乙個簡單易懂的例子。

那如果發出請求後,有個請求超時,你再也沒有收到關於這個請求是成功還是失敗的的回執,又該如何呢?

這裡就有很多種可能情況:

很直觀的乙個想法,也是現實中使用者最常見的做法,是重新提交一次支付請求。但是這樣就有乙個潛在的問題:請求超時是上面的哪一種情況?會不會引發多次支付的可能性?

這就涉及到系統中的冪等是如何實現的了。

那麼冪等又該如何實現呢?「多次執行所產生的影響均與一次執行的影響相同」,簡而言之,我們需要乙個 dedup(去重)的機制。這往往有很多不同的實現方法,但是有兩個很關鍵的因素:

一是 idempotency key(冪等令牌)。也就是客戶端和伺服器端通過什麼來識別這實際上是同乙個請求,或是同乙個請求的多次 retry(嘗試)。這往往需要雙方又乙個既定的協議。往往是類似賬單號或者交易 token(令牌)這樣乙個可以唯一標識同乙個請求意願的元素。通常由客戶端生成。

如果乙個系統可以正確的處理和實現上面的兩個要素,那麼基本就能達到冪等的需求。那麼現實系統中常見的問題都出在**呢?

三是各種競爭條件。上面說的用 db 讀來確保唯一性經常因為競爭而不工作。其實乙個需要冪等的系統中,保證唯一性的各個環節和實現,都要考慮 race condition。

五是乙個系統中需要多層冪等。什麼意思呢?a 傳送請求給 b,b 處理的一部分是要傳送請求給另乙個系統 c,c 在處理的過程中還可能需要發請求給另乙個系統 d…… d 處理完了返回給 c,c 返回給 b,b 返回給 a。在這個鏈條中,如果 a b c d 中任何乙個系統並沒有正確實現冪等,也就是出現了 「冪等漏洞」,那麼乙個請求還是有可能被多次執行,產生區別於一次執行的影響。

在回到本文的開頭,什麼是冪等?乙個操作如果具有任意多次執行所產生的影響均與一次執行的影響相同,我們就稱之為冪等。

這樣的語義範疇對行為結果的定義,只有當你的實現中所有的細節都做對了,你才能得到想要的效果。任何乙個地方設計有漏洞,或是實現有 bug,那還是不成。

每個工程師都應該了解的 聊聊冪等

至 什麼是冪等 idempotency 簡單來說,乙個操作如果具有任意多次執行所產生的影響均與一次執行的影響相同,我們就稱之為冪等。這樣說來,似乎很容易理解。但要知道,這樣的定義,其實是乙個語義範疇對行為結果的定義。如何用語法和規則去確保行為能達到這個結果,往往需要很謹慎的設計和實現。實際系統中,冪...

每個Linux使用者都應該了解的命令行省時技巧

為了獲取文中提到的乙個命令的更多資訊,先試下 man 命令名稱 在一些情況下,為了讓這條命令可以正常執行,你必須安裝相應的包,可以用aptitude 或者 yum。如果失敗了,求助google。1 2 find.name py xargsgrepsome function cathosts xarg...

每個 MySQL 開發者都應該了解的 12 個技巧

mysql是世界上實際最流行的資料庫管理系統,是遍布全球程式設計社群的首選。它有乙個系列有趣的特性,在很多方面都很擅長。由於其巨大的人氣,在網上可以找到許多mysql的使用技巧。這裡有12個最好的技巧和竅門,所有mysql資料庫開發者都應該了解一下。mysql mysqldump建立的轉儲檔案原本是...