重複提交 系統冪等性設計

2021-10-01 07:53:34 字數 667 閱讀 8039

http/1.1中對冪等性的定義是:一次和多次請求某乙個資源對於資源本身應該具有同樣的結果(網路超時等問題除外)。也就是說,其任意多次執行對資源本身所產生的影響均與一次執行的影響相同

簡單來說,是指無論呼叫多少次都不會有不同結果的 http 方法。

業務開發中,經常會遇到重複提交的情況,無論是由於網路問題無法收到請求結果而重新發起請求,或是前端的操作抖動而造成重複提交情況。 在交易系統,支付系統這種重複提交造成的問題有尤其明顯,比如:

向支付寶發起支付請求,由於網路問題或系統bug重發,支付寶應該只扣一次錢。很顯然,宣告冪等的服務認為,外部呼叫者會存在多次呼叫的情況,為了防止外部多次呼叫對系統資料狀態的發生多次改變,將服務設計成冪等。樂觀鎖:基於版本號version實現, 在更新資料那一刻校驗資料(會出現aba問題)

布式鎖:redis 或 zookeeper 實現

version令牌: 防止頁面重複提交

防重表:防止新增髒資料

訊息佇列:把請求快速緩衝起來,然後非同步任務處理,優點:提高吞吐量,不足:不能及時響應返回對應結果,需要後續介面監聽非同步介面

實現冪等性

本次採用version令牌的方式實現冪等性,即採用 redis + version機制***實現介面冪等性校驗;

解決支付冪等,訂單重複提交

建立資料庫的唯一約束是目前比較常用解決辦法。在實際的支付業務中,通常把訂單號orderid和請求系統編碼system no 或是請求商戶號merchantno 做為資料庫的聯合唯一約束。保證同樣的訂單在資料庫只有唯一的一條記錄。當有重複資料請求時,應用程式在捕獲此sql異常後,進行回滾 去重表 流水...

介面冪等性設計

在系統中,乙個介面執行多次,與執行一次的效果是一致的 冪等性的核心思想 通過唯一的業務單號保證冪等 update自身帶鎖。直接update不會出現併發修改問題。樂觀鎖是先查詢在修改 update 商品表 set 庫存 庫存 購買量 version 查詢version值 1 where version...

分布式系統 冪等性設計

web資源或api方法的冪等性是指一次和多次請求某乙個資源應該具有同樣的 冪等性是系統的介面對外一種承諾 而不是實現 承諾只要呼叫介面成功,外部多次呼叫對系統的影響是一致的。冪等性是分布式系統設計中的乙個重要概念,對超時處理 系統恢復等具有重要意義。宣告為冪等的介面會認為外部呼叫失敗是常態,並且失敗...