抄用一段數學上的定義:f(f(x)) = f(x)。x被函數f做用一次和做用無限次的結果是同樣的。冪等性應用在軟件系統中,我把它簡單定義爲:某個函數或者某個接口使用相同參數調用一次或者無限次,其形成的後果是同樣的,在實際應用中通常針對於接口進行冪等性設計。舉個栗子,在系統中,調用方A調用系統B的接口進行用戶的扣費操做時,因爲網絡不穩定,A重試了N次該請求,那麼無論B是否接收到多少次請求,都應該保證只會扣除該用戶一次費用。java
public class Main { private int i = 0; //這個方法不具備冪等性,每調用一次,它就會改變Main的狀態(即改變了i) public void idempotent() { i++; } //冪等性,不管這個方法調用多少次,它都不會改變Main類的狀態。 public void simple() { System.out.println(i); } }看完這些,你彷佛對冪等性有了更深的瞭解。那麼冪等性問題會出如今哪些場景呢?
冪等表示:請求服務器一次或是屢次,返回的結果均是同樣的【select 】通常是GET請求nginx
非冪等表示:請求服務器不一樣的次數,返回的結果將是不同的[update delete] 通常是POST請求web
HTTP協議自己是一種面向資源的應用層協議,但對HTTP協議的使用實際上存在着兩種不一樣的方式:一種是restful,它把HTTP當成應用層協議,另外一種是SOA,它並無徹底把HTTP當成應用層協議,而是把HTTP協議做爲了傳輸層協議,而後在HTTP之上創建了本身的應用層協議。redis
restful風格,想了解的能夠去看看webservice編程,這裏不是本文的主題。數據庫
本文所討論的HTTP冪等性主要針對RESTful風格的,不過正如上一節所看到的那樣,冪等性並不屬於特定的協議,它是分佈式系統的一種特性;因此,不管是SOA仍是RESTful的Web API設計都應該考慮冪等性。編程
重要方法 | 安全 | 冪等 |
GET | 是 | 是 |
POST | 否 | 否 |
PUT | 否 | 是 |
DELETE | 否 | 是 |