重復(fù)下單
案例1:
1. 用戶點擊“確認下單”按鍵進行下單操作;
2. 后臺系統(tǒng)接收到請求逼庞,并處理返回結(jié)果搜变;
3. 網(wǎng)絡(luò)發(fā)生問題把跨,用戶沒有收到成功返回鸳劳,以為沒有下單成功戈锻,再次發(fā)起請求;
案例2:
1. 用戶因為某種原因轩性,多次發(fā)起“確認下單”請求声登,但以為只請求一次;
2. 后臺系統(tǒng)在1秒內(nèi)接收到同一個用戶的多次相同請求揣苏,并處理返回結(jié)果悯嗓;
HTTP的冪等性
HTTP方法的冪等性是指一次和多次請求某一個資源應(yīng)該具有同樣的結(jié)果。在HTTP 1.1規(guī)范中冪等性定義是:
Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.
冪等性的數(shù)學(xué)表達:f(f(x)) = f(x)卸察。
冪等性的系統(tǒng)說明
冪等性是系統(tǒng)的接口對外一種承諾而不是實現(xiàn), 承諾只要調(diào)用接口成功, 外部多次調(diào)用對系統(tǒng)的影響是一致的. 聲明為冪等的接口會認為外部調(diào)用失敗是常態(tài), 并且失敗之后必然會有重試脯厨。
檢測重復(fù)下單
在下單接口中,使用隨機字符串來生成一個處理訂單Id來標識一個訂單接口傳入(由后端系統(tǒng)來生成)坑质;后臺系統(tǒng)保證每個訂單傳入的都必須是唯一合武,如果后臺系統(tǒng)發(fā)現(xiàn)處理訂單Id重復(fù)就拒絕成生訂單
接口的冪待性
接單接口中傳入的ID个少,至多只會被處理一次(處理完的,直接刪除傳入的ID)眯杏,且每次調(diào)用都返回第一次調(diào)用時的處理結(jié)果。這樣調(diào)用方就可以放心的多次調(diào)用壳澳,而不會造成系統(tǒng)數(shù)據(jù)混亂與結(jié)果的錯亂岂贩。
鑒于這個機制,案例1與2的解決方案如下:
- 每次進入下單場景,都需要獲取一個全新的Id
- 用戶一旦點擊“確認下單”按鍵進行下單操作巷波,此按建都要立刻Hold住萎津,設(shè)置為“不可用狀態(tài)”,等待后端接口返回抹镊;
- 如果超過一定的時限(1-2秒)沒有收到后端系統(tǒng)的返回锉屈,則進入到另一個頁面彈出相應(yīng)的提示告之用戶下單異常請查詢或訂單無法確定,引導(dǎo)用戶去查詢訂單狀態(tài)垮耳,反復(fù)確認直到訂單狀態(tài)是成功或失敗颈渊。
- 如果反復(fù)確認都不無法得后端返回的響應(yīng),請在相應(yīng)的界面上引導(dǎo)人戶去重新下單终佛。
- 后臺在接單接口上要符合冪等性俊嗽。