冪等性問題是面試中常見的面試問題,也是分佈式系統最常遇到的問題之一。在說冪等性之前,我們先來看一種情況,假如老王在某電商平臺進行購物,付款的時候不小心手抖了一下,連續點擊了兩次支付,但此時服務器沒做任何驗證,於是老王賬戶裏面的錢被扣了兩次,這顯然對當事人造成了一定的經濟損失,並且還會讓用戶喪失對平臺的信任。而冪等性問題說的就是如何防止接口的重複無效請求。
我們本課時的面試題是,什麼是冪等性?如何保證接口的冪等性?
回答:
冪等性最早是數學裏面的一個概念,後來被用於計算機領域,用於表示任意多次請求均與一次請求執行的結果相同,也就是說對於一個接口而言,無論調用了多少次,最終得到的結果都是一樣的。比如以下代碼:
public class IdempotentExample {
// 變量
private static int count = 0;
/**
* 非冪等性方法
*/
public static void addCount() {
count++;
}
/**
* 冪等性方法
*/
public static void printCount() {
System.out.println(count);
}
}
對於變量 count 來說,如果重複調用 addCount() 方法的話,會一直累加 count 的值,因爲 addCount() 方法就是非冪等性方法;而 printCount() 方法只是用來打印控制檯信息的。因此,它無論調用多少次結果都是一樣的,所以它是冪等性方法。
知道了冪等性的概念,那如何保證冪等性呢?
冪等性的實現方案通常分爲以下幾類:
前端攔截
使用數據庫實現冪等性