冪等性學習及接口的冪等性

2020-12-16 凱哥Java

冪等性學習

一:什麼是冪等性

在這裡需要有以下幾個問題需要注意:

1:冪等性的實質是一次或多次請求同一個資源,其結果是相同的。其關注的是對資源產生的影響(副作用)而不是結果,結果可以不同。比如列表查詢的時候,一邊在save或者是update,而你這邊還是在select,其結果肯定是不同的,但是你的select操作並未對數據(資源)產生影響(副作用);

2:冪等性不僅僅只是一次或者多次請求的時候對資源沒有副作用。比如根據id對資料庫的查詢操作,此操作對資料庫沒有增刪改,所以多次查詢操作對資料庫結果是沒有任何影響的;

3:冪等性還包括了第一次請求資源的時候,對資源產生了副作用,但是在以後多次同樣的請求操作的時候,都不會在對資源產生副作用了。比如我們根據id更新訂單狀態從支付中變為支付完成這個操作,在執行第一次的時候,會更新為支付完成。之後在根據這個id執行此操作,無論執行多少次其結果和第一次執行後的結果一樣;

4:冪等性關注的是以後的多次請求是否對資源產生了副作用,而不是關注的結果;

5:需要說明的是網絡超時、服務宕機等問題,不是冪等的範圍。

冪等性是系統服務對外的一種承諾(注意,是一種承諾,而不是一種實現),接口服務提供方承諾只要調用接口成功了,外部多次調用對系統的影響是一致的。這裡需要強調一點就是,聲明為冪等的服務會認為調用方調用失敗是常態,是正常業務,並且允許在調用失敗後必然會有重試的。

來源:凱哥Java(kaigejava)

二:什麼情況下需要使用冪等

在我們開發中,經常會遇到一個頭疼的事情—重複提交的情況。重複提交情況有多種原因產生的。如由於網絡問題無法收到請求結果情況下而重新發起的請求或者是因為調用方前端操作抖動而造成的重複提交。

重複提交操作帶來的嚴重後果在交易系統、支付系統中因重複提交而產生的問題尤其的明顯。如:我們發起支付的時候向支付寶支付請求,無論是交易系統自身bug還是交易系統與支付寶之間的網絡問題導致重複發送,支付寶應該並且必須只能扣用戶一次錢的。在這種需求下的系統在設計的時候,我們就需要將系統或者服務設計成冪等的。

三:冪等和防重複提交比較

重複提交:重複提交是在第一次請求成功的情況下,人為的進行多次操作,從而導致不滿足冪等性要求的服務多次改變數據狀態。

冪等:更多使用的情況是第一次請求知道結果(比如常見的網絡抖動導致連接超時)或者失敗異常情況下,發起多次請求的,其目的是多次確認第一次請求成功,卻不會因為多次請求而出現多次的狀態變化。

什麼情況下需要保障冪等性?

在這裡,我們以sql為例來講解。在下面三種場景中,只要第三種場景需要開發人員使用其他策略來保障冪等性:

1:查詢情況

Select * from table where id = 2

無論執行多少次都不會對資源造成副作用,所以可以說是天然的冪等

2:根據id更新

Update table set status =1 where id =2

無論執行成功多少次狀態都是一致的,第一次執行成功對資源造成的副作用和多次執行成功對數據造成的副作用是一樣的。因此可以說這種場景也是冪等操作

3:不是冪等情況

Update table set version = version+1 where id = 2

每次執行的結果都會發生變化,也就是說對資源造成了副作用,這種不是冪等的。這種情況如果想要保證冪等,語句可以這麼寫:update table set version = version+1 where id = 2 and version = 1.這樣就可以保證冪等了。

為什麼要設計冪等性的服務?

冪等性的服務可以使得客戶端的處理業務邏輯變的簡單了,但是確實以犧牲服務端邏輯變複雜為代價的。因為在滿足冪等服務的需求下邏輯至少需要包含以下兩點:

1:首選去查詢上一次的執行狀態(結果),如果沒有則認為是第一次請求。這樣就增加了業務難度

2:在服務改變狀態的業務邏輯前,保證防重複提交的邏輯

冪等的不足:

通過上面我們知道了冪等服務是以犧牲服務提供者邏輯和成本為代價的。所以,是否有必要,需要根據具體場景具體來分析的。因此除了業務上的特殊要求外,儘量不要提供冪等的接口。

1:增加了額外的控制冪等的業務邏輯,複雜了業務功能;

2:把並行執行的功能改為串行執行,這樣就降低了執行的效率。

保證冪等策略

其實在保證冪等的業務會通過唯一的業務單號來保證的。也就是說相同的單號,被認為是同一筆業務。使用唯一的業務單號來確保,後面多次相同的業務單號的的處理邏輯和執行兄啊過是一致的。我們以常見的支付為例(在不考慮並發情況下),實現冪等很簡單:

1:先查詢一下訂單是否已經支付過

2:如果已經支付過,則返回支付成功;如果沒有支付,在進行支付流程操作後,將訂單狀態修改為已支付。

相關焦點

  • 接口的冪等性,Restful接口的冪等性
    接口的冪等性,Restful接口的冪等性說到接口的冪等性,我們先看看什麼是冪等?什麼是冪等?為什麼需要冪等在計算機應用中,可能遇到網絡抖動,臨時故障,或者服務調用失敗,尤其是分布式系統中,接口調用失敗更為常見。為了保證服務的完整性,我們可能會發起接口的重試調用,如果接口不處理冪等,可能對系統造成很大的影響,因此接口的冪等設計尤其更為重要。
  • SpringBoot 接口冪等性的實現方案
    在計算機中編程中,一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函數或冪等方法是指可以使用相同參數重複執行,並能獲得相同結果的函數。這些函數不會影響系統狀態,也不用擔心重複執行會對系統造成改變。二、什麼是接口冪等性在HTTP/1.1中,對冪等性進行了定義。
  • 微服務冪等性
    HTTP的冪等性指的是一次和多次請求某一個資源應該具有相同的副作用。如通過PUT接口將數據的Status置為1,無論是第一次執行還是多次執行,獲取到的結果應該是相同的,即執行完成之後Status =1。1.2 冪等概念        微服務架構中,冪等是一致性方面的一個重要概念。
  • 接口的冪等性的多重考慮,你會了嗎?
    本文約: 2300字 預計閱讀時間:6分鐘目錄前言正文1 接口冪等性2.5 樂觀鎖(更新操作)2.6 悲觀鎖(更新操作)結語前言今天的主題:接口冪等性的解決方案當然,在接口設計中我們要考慮很多問題,安全性,格式,設計等等,今天我們先來聊聊,在高並發環境下,接口冪等性的解決方案有哪些。正文1 接口冪等性就是說在多次相同的操作下保證最終的結果是一致的。
  • 以微信紅包為例講解實現接口冪等性的幾種方案
    類似的接口在我們的開發過程中會有很多,比如在電商的下單過程中:訂單創建接口,第一次調用返回超時了,重試機制一般會再次調用這個接口,此時我們不能因為這個接口被調了兩次就創建兩個一樣的訂單;庫存扣減接口,支付接口也是類似的邏輯;今天的文章就來講講什麼是接口的冪等性,並介紹幾種實現接口冪等性的方案
  • 深入的理解冪等性
    什麼是冪等性?為什麼要考慮冪等性?開始今天,是6月10日。前天,2019年度的高考結束了。又有一批莘莘學子,放下了心中的重擔,踏上新的旅程。今天,我們要聊聊冪等性。對了,如果你剛考完,準備以後幹程式設計師的話,不妨看看。(這個開始段落的模式,估計還能用10天)
  • 如何確保分布式場景下的並發冪等性?
    Java面試筆試面經、Java技術每天學習一點 作者:_BKing 來源:https://www.cnblogs.com/xiaowei123/ 冪等是什麼 ?
  • 保證MQ消費消息的冪等性,真可以用版本號的方式?
    你們都說可以用版本號來解決冪等性消費?什麼才是消息冪等性消費的根本性問題?隨著系統的複雜性不斷增加,多數系統都會引入MQ來進行解耦,其實從引入MQ的初衷來說,多數系統是為了解耦多個模塊帶來的複雜性,而有些「架構師」卻說的:為了解決性能問題。
  • 高並發分布式場景最全的MQ消息重發冪等性解決方案
    一、冪等性是什麼?在編程中,一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函數,或冪等方法,是指可以使用相同參數重複執行,並能獲得相同結果的函數。三、防重複消息冪等性解決方案1、生產者重複發消息MQ冪等性設計MQ在接收生產者傳來的消息時,MQ內部會生成一個全局唯一與業務無關的消息ID:inner-msg-id。
  • RabbitMQ消息中間件技術精講10 高級篇三 冪等性保障不重複消費
    利用冪等性保障消息不被重複消費本文主要內容:一:冪等性概念什麼是冪等性?關於冪等性更詳細的介紹,可以參見《拓展知識一:冪等性》這篇文章。關於mysql資料庫樂觀鎖和悲觀鎖的詳細介紹,可以參見《拓展知識二:mysql資料庫中樂觀鎖和悲觀鎖》二:消費端如何保障冪等性消費問題:在海量訂單產生的業務高峰期,如何避免消息被重複的消費呢?答案:在消費端實現冪等性即可。
  • 高並發的核心技術 - 冪等的實現方案
    等等很多重要的情況,這些邏輯都需要冪等的特性來支持。 二、冪等性概念 冪等(idempotent、idempotence)是一個數學與計算機學概念,常見於抽象代數中。select是天然的冪等操作 2. 刪除操作 刪除操作也是冪等的,刪除一次和多次刪除都是把數據刪除。
  • 冪函數是奇函數嗎?是增函數嗎?所有冪函數具有的性質都在這!
    冪函數的奇偶性⑴當冪函數的冪指數a是奇數時,冪指數y=x^a是奇函數。⑷當冪函數的冪指數a是分數且分母是偶數時,冪函數y=x^a是非奇非偶函數。當冪指數為分數且分母是偶數時說明該冪指數要開偶次方根,所以x取值範圍是(0,+∞),所以此時的冪函數的定義域並不關於原點對稱,即冪函數y=x^a此時是非奇非偶函數。
  • 冪級數是個什麼鬼?
    1.冪級數的形式先來看看冪級數的一般形式:冪級數其實是特殊的多項式,其最高次冪是無窮大量。在學習微分中值定理,其實就已經接觸了冪級數,那泰勒展開式就是冪級數。2.冪級數的阿貝爾定理阿貝爾定理的內容可以分為兩部分,第一部分:若冪級數在點x=b處收斂,其中b>0,那麼冪級數在區間(-b, b)內絕對收斂。
  • 冪的運算小結+測驗(同底數冪的乘法、冪的乘方、積的乘方)
    冪的運算包括同底數冪的乘法、冪的乘方和積的乘方。同底數冪的乘法即相同底數的冪相乘,冪的乘方即乘方再乘方,積的乘方即乘積的乘方。要理解這三個概念,首先要明白什麼是乘方和冪。求幾個相同因數的積的運算叫做乘方,乘方的結果叫做冪。乘方是一種運算,強調過程;冪是結果,強調整體。很多時候二者可以通用,比如2^3可以讀作2的3次方,也可以讀作2的3次冪。
  • 黃明昊叫楊冪「冪姐」,鄧倫叫「冪」,而大張偉的稱呼最與眾不同
    最新一季的《密室大逃脫》也終於開播了,這一期的節目也新增加了郭麒麟,大張偉,而女嘉賓也只剩下楊冪一個人了,所以完全就是一個團寵的地位,每個人對於她也都是非常照顧,甚至每個人的稱呼都完全的不同,因為黃明昊一直都比楊冪小,所以在節目中中,也一直都稱呼楊冪為冪姐,而且黃明昊作為膽子最大的一個
  • 必修一——冪函數
    一、前言(廢話)在這之前,我們已經學習了指數函數,對數函數,這兩類函數(如果對此有不了解的地方,可以翻看一下之前作者發布的文章),這次要講的內容就是冪函數。二、冪函數冪函數也是高中階段很重要的一類函數,但對這一類函數讀者們需要牢牢的掌握常見函數的性質以及圖像特點。
  • 2017考研數學:方陣冪的計算方法
    考研數學中線性代數部分的分數佔了整體的百分之二十二,是整個考研數學不可缺少的部分,其章節內容與高等數學和概率統計沒有太多聯繫,其知識點具有細緻性和整體性,前後章節聯繫比較密切。線性代數中的矩陣部分是整個線代非常重要的部分,也是要求我們同學要掌握透徹的一個部分,而其中關於方陣冪的問題是需要重點掌握的。
  • 教學研討|2.3.1冪函數
    四、教學目標:本節課主要通過學生的研究性學習自己歸納出冪函數的圖像及性質, 加深對 定義域、值域、奇偶性、單調性的理解 , 掌握了從這幾個方面研究函數性質的方法1.知識目標(1)通過實例,了解冪函數的概念;
  • 初中數學:冪運算(同底數冪乘除、冪的乘方、積的乘方)經典題
    冪的運算是整式的乘法和除法的基礎,同學們計算易出錯,主要就是在冪的運算上出錯多,一是對冪的內涵理解不夠,導致計算方法(公式)混淆;二是思路不明確,無從下手。冪的運算:同底數冪的乘法、冪的乘方、積的乘方。
  • 七年級零指數冪與負整數指數冪練習題
    在小學階段,數學學的都是基礎中的基礎,很多知識點你只要將其掌握,考試就不會考得太差,但到了初中就不能這樣了,因為初中的數學學習會更加深入,光是一個普通的公式就可以做出各種各樣的題型,常常讓人絞盡腦汁也做不出來。