分佈式系統中的冪等性

分佈式系統中的冪等性

1.冪等性介紹

冪等的概念來自數學,比如對於一元函數來說滿足:f(f(x))=f(x)

即可稱爲滿足冪等性

在計算機科學中,一個操作如果多次執行產生的影響與一次執行產生的影響相同,這樣的操作即符合冪等性

在分佈式系統中,服務消費方調用服務提供方的接口,多次調用的結果應該與一次調用的結果一樣,這正是分佈式環境下冪等性的語義。

爲什麼冪等性對於分佈式系統而言如此重要?

因爲子啊分佈式環境下,服務調用方一般採用http協議或rpc或MQ的方式,即雙方需要通過網絡進行通信,而因爲網絡故障或者消息超時的存在,可能服務消費方已經成功調用了服務提供方的服務接口,但是消費方沒有收到來自對方的成功響應,導致消費方以爲服務調用失敗從而再次進行調用,也就是網絡的不可靠性導致了服務接口被多次調用的可能。

分佈式系統必須保證在這種情況下,即使接口被多次調用,它對系統產生的影響應該與該接口只被調用一次的結果一樣

2.冪等性場景

在微服務架構下,不同的微服務間會有大量的基於http,rpc或MQ消息的網絡通信,接口的重複調用以及消息的重複消費可能會經常發生,比如以下情況

  • 調用訂單創建接口,第一次調用超時,調用方又嘗試了一次,但其實第一次調用已經成功,只是調用方沒有及時收到響應
  • 訂單支付成功後,需要向MQ發送一條消息,但該消息重複發送兩條
  • 網絡波動導致服務方的接口被調用了兩次
  • 用戶在使用產品時,無意地觸發多筆交易
  • 某些未關閉的重試機制

微服務架構應該具有冪等性,當接口被重複調用時,消息被重複消費時,對系統的產生的影響應該和接口被調用一次,消息被消費時一樣

3.crud操作的冪等性分析

  • 新增請求:不具備冪等性
  • 查詢請求:重複查詢不會影響系統狀態,查詢天然具有冪等性
  • 基於主鍵的更新請求
    要更新的值依賴於前值,不具備冪等性
    要更新的值不依賴於前值,具有冪等性
  • 刪除請求
    基於主鍵的物理刪除具有冪等性
    基於主鍵的邏輯刪除也具有冪等性

總結:通常只需要對新增請求和更新請求作冪等性保證

4.如何解決冪等性問題

  • 全局唯一ID
    根據業務生成一個全局唯一ID,在調用接口時會傳入該ID,接口提供方會從相應的存儲系統,比如redis中去檢索這個全局ID是否存在,如果存在則說明該操作已經執行過了,將拒絕本次服務請求;否則將相應該服務請求並將全局ID存入存儲系統中,之後包含相同業務ID參數的請求將拒絕
  • 去重表
    這種方法適用於在業務中有唯一標識的插入場景。比如支付場景中,一個訂單隻會支付一次,可以建立一張去重表,將訂單ID作爲唯一索引。把支付並且寫入支付單據到去重表放入一個事務中,這樣當出現重複支付時,數據庫就會拋出唯一約束異常,操作就會回滾。這樣保證了訂單隻會被支付一次
  • 多版本併發控制
    適合對更新請求作冪等性控制,比如要更新商品的名字,這是就可以在更新的接口中增加一個版本號來做冪等性控制
  • 狀態機控制
    適合有狀態機流轉情況下,比如訂單的創建和付款,訂單的創建肯定是在付款之前。這是可以添加一個int類型的字段來表示訂單狀態,創建狀態爲0,付款成功爲100,付款失敗爲99。
  • 插入或更新
    在MySQL數據庫中,如果insert語句後面帶上ON DUPLICATE KEY UPDATE子句,而要插入的行與表中現有記錄的唯一索引或者主鍵索引產生重複值,則對舊值進行更新;否則執行新紀錄的插入
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章