冪等在軟體開發中,是乙個非常重要的設計考量點。在實際開發中越來越多的 rest api 被採用,正確的實現冪等,對很多 api 尤其是涉及金融業務的 api 來說非常重要。
冪等(idempotency)在實際開發中是指:乙個操作,多次任意執行或一次執行,所產生的結果相同。
但實際業務場景中,我們要考慮的場景很多,例如,請求超時。
當客戶端發出請求後,並沒有收到服務端的響應,這個時候客戶端該怎麼做呢?
這種場景下,有很多種可能情況:
在面對以上四種不同的業務場景的時候,如果我們直接重新提交一次支付請求, 就會存在乙個潛在的問題:會不會引起多次支付的可能性?
這就涉及到系統中冪等是如何實現的了。
根據冪等的定義多次執行所產生的影響均與一次執行的影響相同。
所以,我們需要乙個去重機制。有很多方法可以實現,但是有兩個很關鍵的因素。
因素一:冪等令牌(idempotency key)。
客戶端和服務端通過什麼方式來識別,這實際上是同乙個請求或者同乙個請求的多次嘗試。這往往許要雙方有乙個既定的協議,比如訂單號或者交易令牌,這些訂單號或者交易令牌是唯一標識的元素,這種元素通常由客戶端生成。因素二:確保唯一性(uniqueness guarantee)
服務端用什麼機制去確保同乙個請求不會被處理兩次?乙個系統能正確處理和實現上面兩個要素,基本就實現了冪等的要求,那麼,在實際業務中常見的問題都會出在**呢?最常見的作法是利用資料庫,比如把冪等令牌所在的資料庫表的列作為唯一性索引,這樣,當我們試圖儲存含有兩個相同令牌的請求時,會報錯。注意:簡單的讀建查並不一定成功,因為讀與讀之間會有競爭條件(race condition),因此還是可能出錯。
冪等令牌什麼時候產生,怎樣產生。
是令牌有沒有可能被誤刪的可能。
是各種競爭條件。
是對請求重試的處理。
系統中許要多層冪等。
這是什麼意思呢?a 傳送請求給 b,b 處理的一部分是要傳送請求給另乙個系統 c,c同理需要請求另外乙個系統 d 。在請求與響應的過程中(a—>b—>c—>d—>c—>b—>a )如果 abcd 中任何乙個系統沒有正確的實現冪等性,也就是出現了「冪等漏洞」,那麼一次請求還是有可能被多次執行的。
你知道我在等你嗎
你知道我在等你嗎 偶然的路遇其實是為了故意等你。擦肩而過的時候,用目光默默的向你問候,你卻無從察覺沒有回頭,只任期待的注視遺落在不知名的道口,任青春的臉峽被那抹遙遠的去霞看透。每個有月的夜晚,都在虔誠的為你祈禱為你祝福,相信佛祖總會讓清風帶來關於你的話題,讓我聽到關於你的訊息。心坎堆滿凡塵絡世的雜物...
你知道我在等你嗎
歌手 張洪量 情定日落橋 莫名我就喜歡你深深地愛上你 沒有理由沒有原因 莫名我就喜歡你深深地愛上你 從見到你的那一天起 你知道我在等你嗎?你如果真的在乎我 又怎會讓無盡的夜陪我度過 你知道我在等你嗎?你如果真的在乎我 又怎會讓握花的手在風中顫抖 莫名我就喜歡你深深地愛上你 沒有理由沒有原因 莫名我就...
你知道我們在等你嗎
的發展快四年了,四年的努力僅僅是乙個開始,乙個新的發展階段的開始,四年的酸甜苦辣,留下的只有興奮 激動和更加堅定的信念,在回味難忘的2007 暢想美好的2008之際,要開始做等了四年的事 組建的開發團隊 四年來,一直最讓我痛苦和慚愧的是為開發人員服務的 開發卻一直跟不上 的發展,現在,要化四年的痛苦...