1. 程式人生 > >分散式開發中的冪等性問題

分散式開發中的冪等性問題

分散式開發中的冪等性問題

什麼是冪等性

在分散式系統中大多為SOA,或者微服務,多個系統之間服務到呼叫主要採用RPC或restful 這兩種主流方式呼叫,既然是通訊,那麼存在一定風險導致返回處理結果的時候服務down掉,客戶端沒有感知,會多次點選按鈕,這樣多次請求,就要要求系統處理的結果統一,比如支付扣款。
冪等性 :使用者對於同一操作發起多次請求,請求的結果是一致的,不會因為多次點選而產生副作用。主要出現在資料庫的增加和修改場景中。

如何設計接口才能做到冪等性

  1. 使用ticketID


    單次支付請求,也就是直接支付了,不需要額外的資料庫操作了,這個時候發起非同步請求建立一個唯一的ticketId,就是門票,這張門票只能使用一次就作廢,具體步驟如下:

    1.非同步請求獲取門票

    2.呼叫支付,傳入門票

    3.根據門票ID查詢此次操作是否存在,如果存在則表示該操作已經執行過,直接返回結果;如果不存在,支付扣款,儲存結果

    4.返回結果到客戶端

    如果步驟4通訊失敗,使用者再次發起請求,那麼最終結果還是一樣的.

  2. 分散式環境下各個服務互相呼叫該
    這邊就要舉例我們的系統了,我們支付的時候先要扣款,然後更新訂單,這個地方就涉及到了訂單服務以及支付服務了。

    使用者呼叫支付,扣款成功後,更新對應訂單狀態,然後再儲存流水。

    而在這個地方就沒必要使用門票ticketId了,因為會比較閒的麻煩

    (支付狀態:未支付,已支付)

    步驟:

    1、查詢訂單支付狀態

    2、如果已經支付,直接返回結果

    3、如果未支付,則支付扣款並且儲存流水

    4、返回支付結果

    如果步驟4通訊失敗,使用者再次發起請求,那麼最終結果還是一樣的

    對於做過支付的朋友,冪等,也可以稱之為衝正,保證客戶端與服務端的交易一致性,避免多次扣款。