作者:叁滴水
博客:https://blog.csdn.net/qq_30285985/
前言
在訂單的狀態發生改變后,支付寶會通過異步方式同志商家服務器,商家服務器需要回傳success這7個字符,如果不是,則會不斷重復發送,
微信也是如此,必須需要商家服務器的正確反饋,既然這樣,在回呼介面就需要進行冪等處理,
一、什么是冪等?
冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同,
細想一下回呼介面一般會這樣處理:
- 查看訂單是否存在,
- 修改訂單狀態,
- 如果是支付成功狀態,則進行發貨,
這種邏輯本身是沒有什么問題的,但是它不是一個冪等介面,如果收到好幾次訂單1001支付成功的請求,則會對訂單1001的商品多次發貨,這就導致了一個訂單多次發貨的現象,這種在電商開發時是災難性的bug,
因此,我們需要對此介面做一個處理,使得即使有很多請求都告訴商戶服務器訂單1001支付成功的請求,商戶也只發貨一次,
二、如何進行冪等處理
對于這種介面的冪等處理,我也是思量許久,最終決定再生使用修改狀態的方式,
具體實作方式如下:
- 訂單表
t_order存在訂單號1001的訂單是未支付狀態, - 支付寶轉賬成功,告訴商家服務器訂單
1001的訂單轉賬成功, - 商家服務器驗簽,
- 查看訂單是否存在,基本資訊是否一致,
- 修改此訂單狀態,通過
update t_order set 狀態=已支付 where order_id=1001 and 狀態=未支付 - 通過如上sql樂觀鎖的思想對發貨進行控制,只有sql執行的時候有修改成功,則進行發貨,修改失敗則不發貨,
通過樂觀鎖可以有效的控制發貨次數,不管幾次回呼通知,只有當前訂單是未支付狀態并且成功修改成已支付狀態之后才進行發貨,
如下圖,兩個sql一起執行修改訂單狀態,但是肯定只會有一個sql修改成功,
修改成功的執行緒進行發貨即可,

如果思路有什么缺點,或者您還有更好的實作方式,請留言點評,
最后,關注公眾號Java技術堆疊,在后臺回復:面試,可以獲取我整理的 Java 系列面試題和答案,非常齊全,
本文來自作者「叁滴水」投稿,謝謝分享,也歡迎愛好技術分享的各位技術朋友向「Java技術堆疊」投稿,讓更多人看到,投稿方式:關注公眾號「Java技術堆疊」在后臺回復:投稿,
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2021最新版)
2.終于靠開源專案弄到 IntelliJ IDEA 激活碼了,真香!
3.阿里 Mock 工具正式開源,干掉市面上所有 Mock 工具!
4.Spring Cloud 2020.0.0 正式發布,全新顛覆性版本!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/288201.html
標籤:其他
下一篇:VNPY官方發布VNTrader,VNPY性能提升380%,python的便捷,C++性能加持, 期貨CTP介面Python和PyQT框架
