分散式之介面冪等性

新亮 發表於 2021-09-20

前言

什麼是冪等性?一次和多次請求某一個資源,對資源本身所產生的的影響均與一次執行的影響相同。

冪等性是系統服務對外的一種承諾,承諾只要呼叫介面成功了,多次呼叫對系統的影響是一致的。

冪等性與重複提交比較

冪等性 更多使用的情況是第一次請求知道結果,但是由於網路抖動或連線超時等情況未進行正常返回,在這種情況下系統自動再次發起請求,其目的是確認第一次是否請求完成。

重複提交 更多使用的情況是第一次請求成功或請求結果暫未返回的情況下,人為的進行多次操作。

SQL 語句冪等性

SELECT

SELECT * FROM `user` WHERE id = 1

無論執行多少次都不會對資源造成影響,查詢具有天然的冪等性。

UPDATE

UPDATE `user` SET status = 1 WHERE id = 1;

無論執行成功多少次狀態都是一致的,這種場景是冪等操作。

UPDATE `user` SET score = score+1 WHERE id = 1;

每次執行的結果都會發生變化,這種場景不是冪等操作。

根據具體場景看能否寫成這樣的 SQL

UPDATE `user` SET score = score+1 WHERE id = 1 AND score = 59;

無論執行成功多少次分數都是一致的,這種場景是冪等操作。

DELETE

DELETE FROM `user` WHERE id = 1;

無論執行成功多少次資料都是一致的,這種場景是冪等操作。

INSERT

INSERT INTO `user` (`name`, `status`, `score`) VALUES ('tom', 1, 80);

每次執行的結果都會發生變化,這種場景不是冪等操作。

根據具體場景看能否為 name 建立一個唯一索引,或執行型別這樣的 SQL

INSERT INTO ... values ... ON DUPLICATE KEY UPDATE ...

// 注意,要使用這條語句,前提條件是這個表必須有一個唯一索引或主鍵。

實現方案

方案一

下游系統提供相應查詢介面。

上游系統在 timeout 後,首先去查詢一下,如果查到了,就表明已經做了,成功了就不用做了,失敗了就走失敗流程。

方案二

將這個查詢操作交給下游系統,上游系統只管重試,下游系統保證一次和多次的請求產生的影響是一樣的。這時我們就說下游系統提供的介面支援冪等性。

小結

冪等性關注的是多次請求是否對資源產生了副作用,而不是關注的結果。SELECT 語句有可能每次查詢的資料不一致,但是它是冪等性的。

關於 實現方案 -> 方案二 的具體實現方案,根據業務的實際情況考慮合適的解決方案,比如:通過 SQL 語句就可以實現冪等,就沒必要引入 全域性唯一ID 的解決方案。

推薦閱讀

  1. 分散式事務之理解篇
  2. 分散式事務之最終一致性實現方案
  3. 分散式之非同步通訊元件選擇
  4. 分散式之配置中心