防止重複提交的解決方案—防重 Token
如果在電商大促期間,由於用戶重複點擊下單按鈕、接口超時重試、消息重複消費等原因,假設沒有做防重機制,那麼瞬間就可能會產生大量重複訂單,這樣就會出現無效下單使得庫存超賣、用戶重複支付、財務對賬出現差額等等問題。下面我們介紹防重 Token 解決用戶重複提交的問題。
防重 Token 方案的實現原理:客戶端請求服務端獲取防重 Token,同時服務端將這個防重 Token 保存在 Redis 中,然後客戶端通過攜帶 Token 訪問服務端,服務端檢驗防重 Token,校驗通過之後才處理業務。防重 Token 的的實現流程圖如下所示:
(1)客戶端獲取防重 Token
在執行核心的重要業務前,客戶端請求服務器獲取到防重 Token 令牌,如下圖所示的執行流程:
服務器端生成防重 Token(生成 Token 最簡單的方式是使用 UUID),生成 Token 後,服務端要將這個防重 Token 保存在 Redis 中(需要給防重 Token 設置過期時間),最後服務端將防重 Token 返回給客戶端。
(2)攜帶防重 Token 請求服務端
客戶端獲取到防重 Token 後,客戶端需要攜帶防重 Token 請求服務器,處理的流程如下所示:
當請求到達服務端的時候,服務端通過防重 Token 請求 Redis,查詢當前的 Token 是否存在:
(a)如果存在防重 Token 信息,此時允許用戶請求繼續執行接下來的業務操作,當業務處理完成後,刪除 Redis 中的防重 Token;
(b)如果在 Redis 中檢查發現防重 Token 已經沒有了,那麼認爲這個請求是重複的請求,直接給客戶端提示下單失敗。
總結:
(1)防重 Token 方案需生成全局唯唯一的 Token,並使用 Redis 進行數據校驗。
(2)防重 Token 方案的實現中是無鎖化操作、性能較高,但是這種方案多了一次網絡 I/O 請求、高併發場景下需保證 Redis 查詢與刪除操作的原子性,可使用 Lua 腳本實現。
(3)防重 Token 方案適用於中小型業務系統,所以在實際應用中,我們可以根據業務需求和場景靈活選擇。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/GxzMjxOSlQWs-HWgIyhpfw