精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

前任開發在代碼里下毒,支付下單居然沒加冪等

開發
本文這個案例其實就是一個典型的接口冪等案例。那么老貓就和大家從以下幾個方面好好剖析一下接口冪等吧。

故事

又是一個風和日麗美好的一天,小貓戴著耳機,安逸地聽著音樂,擼著代碼,這種沒有會議的日子真的是巴適得板。

不料禍從天降,組長火急火燎地跑過來找到了小貓?!翱炫挪橐幌拢壳坝蠥公司用戶反饋積分被多扣了”。

小貓回憶了一下“不對啊,這接口我也沒動過啊,前幾天對外平臺的老六直接找我要個支付接口,我就給他了的,以前的代碼,我都沒有動過的......”。

于是小貓一邊疑惑一邊翻看著以前的代碼,越看臉色越差......

小貓做的是一個標準的積分兌換商城,以前和客戶合作的時候,客戶直接用的是小貓單位自己定制的h5頁面。這次合作了一家公司有點特殊,由于公司想要定制化自己個性化的H5,加上本身A公司自己有開發能力,所以經過討論就以接口的方式直接將相關接口給出去,A客戶H5開發完成之后自己來對接。

慢慢地,原因也水落石出,之前好好的業務一直沒有問題是因為商城的本身H5頁面做了防重復提交,由于量小,并且一般對接方式用的都是純H5,所以都沒有什么問題,然后這次是直接將接口給出去了,完了接口居然沒有加冪等......

小貓躺槍,數據訂正當然是少不了了,事故報告當然也少不了了。

正所謂前人挖坑,后人遭殃,前人鍋后人背。

聊聊冪等

1.接口冪等梗概

這個案例其實就是一個典型的接口冪等案例。那么老貓就和大家從以下幾個方面好好剖析一下接口冪等吧。

2.什么是接口冪等

比較專業的術語:其任意多次執行所產生的影響均與第一次執行的影響相同。大白話:多次調用的情況下,接口最終得到的結果是一致的。

3.那么為什么需要冪等呢?

  • 用戶進行提交動作的時候,由于網絡波動等原因導致后端同步響應不及時,這樣用戶就會一直點點點,這樣機會發生重復提交的情況。
  • 分布式系統之間調用的情況下,例如RPC調用,為了防止網絡波動超時等造成的請求失敗,都會添加重試機制,導致一個請求提交多次。
  • 分布式系統經常會用到消息中間件,當由于網絡原因,mq沒有收到ack的情況下,就會導致消息的重復投遞,從而就會導致重復提交行為。

還有就是惡意攻擊了,有些業務接口做的比較粗糙,黑客找到漏洞之后會發起重復提交,這樣就會導致業務出現問題。打個比方,老貓曾經干過,鄰居小孩報名了一個畫畫比賽,估計是機構培訓發起的,功能做的也差,需要靠投票贏得某些禮品,然后老貓抓到接口信息之后就模擬投票進行重復刷了投票。

4.那么哪些接口需要做冪等呢?

首先我們說是不是所有的接口都需要冪等?是不是加了冪等就好呢?顯然不是。因為接口冪等的實現某種意義上是要消耗系統性能的,我們沒有必要針對所有業務接口都加上冪等。

這個其實并不能做一個完全的定義說哪個就不用冪等,因為很多時候其實還是得結合業務邏輯一起看。但是其中也是有規律可循的。

既然我們說冪等就是多次調用,接口最終得到結果一致,那么很顯然,查詢接口肯定是不要加冪等的,另外一些簡單刪除數據的接口,無論是邏輯刪除還是物理刪除,看場景的情況下其實也不用加冪等。

但是大部分涉及到多表更新行為的接口,咱們最好還是得加上冪等。

接口冪等實戰方案

1.前端防抖處理

前端防抖主要可以有兩種方案,一種是技術層面的,一種是產品層面的:

  • 技術層面:例如提交控制在100ms內,同一個用戶最多只能做一次訂單提交的操作。
  • 產品層面:當然用戶點擊提交之后,按鈕直接置灰。

2.基于數據庫唯一索引

利用數據庫唯一索引。我們具體來看一下流程,咱們就用小貓遇到的例子。如下:

過程描述:

  • 建立一張去重表,其中某個字段需要建立唯一索引,例如小貓這個場景中,咱們就可以將訂單提交流水單號作為唯一索引存儲到我們的數據庫中,就模型上而言,可以將其定義為支付請求流水表。
  • 客戶端攜帶相關流水信息到后端,如果發現編號重復,那么此時就會插入失敗,報主鍵沖突的錯誤,此時我們針對該錯誤做一下業務報錯的二次封裝給到客戶另一個友好的提示即可。

3.數據庫樂觀鎖實現

什么是樂觀鎖,它假設多用戶并發的事務在處理時不會彼此互相影響,各事務能夠在不產生鎖的情況下處理各自影響的那部分數據。說得直白一點樂觀鎖就是一個馬大哈??偸羌僭O最好的情況,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,只在更新的時候會判斷一下在此期間別人有沒有去更新這個數據。

例如提交訂單的進行支付扣款的時候,本來可能更新賬戶金額扣款的動作是這樣的:

update Account set balance = balance-#{payAmount} where accountCode = #{accountCode}

加上版本號之后,咱們的代碼就是這樣的:

update Account set balance = balance-#{payAmount},version=version +1 where accountCode = #{accountCode} and version = #{currVersion}

這種情況下其實就要求客戶端每次在請求支付下單的時候都需要上層客戶端指定好當前的版本信息。不過這種冪等的處理方式,老貓用的比較少。

4.數據庫悲觀鎖實現

悲觀鎖的話具有強烈的獨占和排他特性。大白話誰都不信的主。所以我們就用select ... for update這樣的語法進行行鎖,當然老貓覺得單純的select ... for update只能解決同一時刻大并發的冪等,所以要保證單號重試這樣非并發的冪等請求還是得去校驗當前數據的狀態才行。就拿當前的小貓遇到的場景來說,流程如下:

悲觀鎖

begin;  # 1.開始事務
select * from order where order_code='666' for update # 查詢訂單,判斷狀態,鎖住這條記錄
if(status !=處理中){
   //非處理中狀態,直接返回;
   return ;
}
## 處理業務邏輯
update order set status='完成' where order_code='666' # 更新完成
update stock set num = num - 1 where spu='xxx' # 庫存更新
commit; # 5.提交事務

這里老貓一再想要強調的是在校驗的時候還是得帶上本身的業務狀態去做校驗,select ... for update并非萬能冪等。

5.后端生成token

這個方案的本質其實是引入了令牌桶的機制,當提交訂單的時候,前端優先會調用后端接口獲取一個token,token是由后端發放的。當然token的生成方式有很多種,例如定時刷新令牌桶,或者定時生成令牌并放到令牌池中,當然目的只有一個就是保住token的唯一性即可。

生成token之后將token放到redis中,當然需要給token設置一個失效時間,超時的token也會被刪除。

當后端接收到訂單提交的請求的時候,會先判斷token在緩存中是否存在,第一次請求的時候,token一定存在,也會正常返回結果,但是第二次攜帶同一個token的時候被拒絕了。

流程如下:

token機制

有個注意點大家可以思考一下:如果用戶用程序惡意刷單,同一個token發起了多次請求怎么辦?想要實現這個功能,就需要借助分布式鎖以及Lua腳本了,分布式鎖可以保證同一個token不能有多個請求同時過來訪問,lua腳本保證從redis中獲取令牌->比對令牌->生成單號->刪除令牌這一系列行為的原子性。

6.分布式鎖+狀態機(訂單狀態)

現在很多的業務服務都是分布式系統,所以就拿分布式鎖來說,關于分布式鎖,老貓在此不做贅述,之前老貓寫過redis的分布式鎖和實現,還有zk鎖和實現,具體可見鏈接:

  • 鎖的演化
  • 手撕redis分布式鎖
  • 手擼ZK鎖

當然和上述的數據庫悲觀鎖類似,咱們的分布式鎖也只能保證同一個訂單在同一時間的處理。其次也是要去校訂單的狀態,防止其重復支付的,也就是說,只要支付的訂單進入后端,都要將原先的訂單修改為支付中,防止后續支付中斷之后的重復支付。

在上述小貓的流程中還沒有涉及到現金補充,如果涉及到現金補充的話,例如對接了微信或者支付寶的情況,還需要根據最終的支付回調結果來最終將訂單狀態進行流轉成支付完成或者是支付失敗。

總結

在我們日常的開發中,一些重要的接口還是需要大家謹慎對待,即使是前任開發留下的接口,沒有任何改動,當有人咨詢的時候,其實就要好好去了解一下里面的實現,看看方案有沒有問題,看看技術實現有沒有問題,這應該也是每一個程序員的基本素養。

另外的,在一些重要的接口上,尤其是資金相關的接口上,冪等真的是相當的重要。小伙伴們,你們覺得呢?

責任編輯:趙寧寧 來源: 程序員老貓
相關推薦

2024-09-02 00:26:35

2020-10-16 09:09:56

代碼業務模型

2009-08-20 10:10:16

敏捷開發支付寶

2023-11-01 08:54:22

冪等性Python

2025-01-22 08:16:44

2017-04-03 21:23:44

消息總線冪等性消息

2021-04-14 17:18:27

冪等性數據源MySQL

2022-07-26 09:03:50

冪等性數據狀態機

2021-01-18 14:34:59

冪等性接口客戶端

2018-12-27 15:43:05

Python分析數據

2020-10-18 07:25:55

MQ消息冪等架構

2022-01-04 12:08:46

設計接口

2024-03-18 08:02:26

2023-09-01 15:27:31

2024-11-01 09:28:02

2023-06-08 09:55:03

冪等計算機系統

2024-03-13 15:18:00

接口冪等性高并發

2023-08-29 13:53:00

前端攔截HashMap

2022-04-25 11:26:16

開發SpringBoot
點贊
收藏

51CTO技術棧公眾號

国产精品入口免费视频一| 欧美va亚洲va国产综合| 欧美日韩国产精品一卡| 天堂在线免费观看视频| 亚洲v天堂v手机在线| 欧美性jizz18性欧美| 亚洲电影一二三区| 国产伦精品一区二区三区四区| 一区二区三区国产精华| 日韩av在线导航| 一道本视频在线观看| 性欧美ⅴideo另类hd| eeuss国产一区二区三区| 国产91色在线免费| 久久久久亚洲AV成人| 天堂俺去俺来也www久久婷婷| 精品1区2区3区| 99久久久精品视频| 草碰在线视频| 福利电影一区二区三区| 国产精品成人av在线| 欧美交换国产一区内射| jlzzjlzz亚洲女人| 精品成人一区二区三区四区| 亚洲第一中文av| 97蜜桃久久| 亚洲欧洲国产专区| 美女精品国产| 亚洲精品综合久久| 蜜桃一区二区三区在线观看| 91精品成人久久| 日韩高清dvd碟片| 婷婷成人影院| 亚洲国产成人一区| 欧美激情第一区| 台湾佬成人网| 欧美日韩激情美女| 精品久久久无码人妻字幂| 午夜视频在线| 国产三级精品三级在线专区| 精品国产综合久久| 亚洲av无码国产精品久久不卡| 免费看精品久久片| 国产成人精品一区二区三区| 日韩欧美中文字幕一区二区| 欧美极品一区二区三区| xvideos亚洲人网站| 亚洲一区二区三区日韩| 亚洲专区视频| 精品视频在线播放免| 亚洲天堂2024| 国内精品偷拍| 亚洲国产天堂久久综合| 蜜臀aⅴ国产精品久久久国产老师| 日本亚洲欧洲无免费码在线| 欧美午夜不卡在线观看免费| 黄色片在线免费| 免费观看成人性生生活片| 色欧美片视频在线观看| 丰满少妇被猛烈进入高清播放| 丁香影院在线| 亚洲高清三级视频| 东北少妇不带套对白| caoporn-草棚在线视频最| 亚洲综合色婷婷| 国产91在线亚洲| av资源一区| 亚洲成人精品在线观看| 男人日女人逼逼| 中国色在线日|韩| 色网综合在线观看| 国产福利影院在线观看| 青青青国产精品| 91精品国产综合久久福利 | 中文字幕第九页| 99re6热只有精品免费观看| 91精品国产综合久久香蕉的特点| 欧美成人乱码一二三四区免费| 欧美国产视频| 制服丝袜中文字幕一区| 深夜视频在线观看| 老汉色老汉首页av亚洲| 精品偷拍一区二区三区在线看| 久久久久久亚洲中文字幕无码| 国产精品一在线观看| 中文字幕日韩在线播放| 午夜国产小视频| 欧美激情日韩| 欧美尤物巨大精品爽| 黄色一区二区视频| 国内精品自线一区二区三区视频| 91久久极品少妇xxxxⅹ软件| 欧美一级做性受免费大片免费| 91麻豆免费在线观看| 日韩欧美精品一区二区三区经典| 亚洲s色大片| 一区二区三区中文在线| 女人天堂av手机在线| 91亚洲视频| 日韩精品一区二区三区中文不卡| 国产白嫩美女无套久久| 日韩午夜电影网| 欧美黑人xxxx| 黄色污污网站在线观看| 九九视频精品免费| 国产一区在线免费| 337p日本欧洲亚洲大胆鲁鲁| 亚洲在线成人精品| 91视频免费版污| 网站一区二区| 伊人青青综合网站| 精品久久免费视频| 免费高清在线视频一区·| 99re资源| 天堂а√在线资源在线| 午夜精品一区二区三区电影天堂| 久久久久国产一区| 久久丝袜视频| 久久亚洲私人国产精品va| 亚洲天堂一区在线观看| 国产精品资源站在线| 欧美日韩精品免费在线观看视频| 97caopor国产在线视频| 日本精品一区二区三区高清 | 欧美日韩dvd| **欧美日韩在线观看| 亚洲成人亚洲激情| 91免费公开视频| 天堂在线亚洲视频| 精品国产一区二区三区麻豆小说 | 欧美一级淫片aaaaaaa视频| 在线免费看av片| 91蝌蚪porny| 国产91沈先生在线播放| 亚洲伦理一区二区| 亚洲小视频在线| 日韩精品在线观看免费| 国产成人免费视频一区| 一区二区三区四区| 欧美成人app| 亚洲欧美日韩精品| 国产精品久久久久久久妇| 大白屁股一区二区视频| 肉大捧一出免费观看网站在线播放| 精品123区| 亚洲欧洲在线播放| 国产做受高潮漫动| 成人国产精品免费观看动漫| 日本一二三区视频在线| 成人黄色理论片| 久久精品国产亚洲| 91丨九色丨蝌蚪丨对白| 国产精品每日更新| 高清一区在线观看| 秋霞欧美视频| 国产精品爽爽爽| 99se视频在线观看| 欧美日韩成人在线一区| 亚洲一二三四五六区| 人人精品人人爱| 日韩精品第一页| 国产精成人品2018| 色999日韩欧美国产| 一级α片免费看刺激高潮视频| 中文字幕第一页久久| 亚洲精品视频导航| 全球成人免费直播| 成人免费福利视频| 婷婷av在线| 亚洲国产免费av| 综合网在线观看| 国产欧美日本一区视频| 亚洲va在线va天堂va偷拍| 亚洲欧美色图| 国产伦精品一区二区三区视频孕妇 | 蜜桃视频无码区在线观看| 亚洲国产精品91| 99久热re在线精品996热视频| 久久香蕉av| 日韩乱码在线视频| 久久久久精彩视频| 亚洲天堂精品在线观看| 亚洲精品乱码久久久久久蜜桃欧美| 亚洲黄色大片| 色噜噜色狠狠狠狠狠综合色一| 男人亚洲天堂| 欧美精品国产精品日韩精品| 色吊丝在线永久观看最新版本| 在线免费观看不卡av| 小向美奈子av| zzijzzij亚洲日本少妇熟睡| 国产第一页视频| 亚洲xxx拳头交| 精品国产91亚洲一区二区三区www| 欧美伦理91| 日韩专区中文字幕| 蜜臀久久99精品久久久| 91国偷自产一区二区开放时间| 蜜桃av.com| 成人av网站在线观看| 三级在线视频观看| 影音先锋亚洲精品| 亚洲欧洲日韩综合二区| www.成人网| 国产精品啪视频| 国内激情视频在线观看| 伊人久久免费视频| 天堂网2014av| 7777精品伊人久久久大香线蕉经典版下载| 国产大片中文字幕| 国产精品久久久久久久久免费相片 | 337p日本欧洲亚洲大胆色噜噜| 免费看污视频的网站| 亚洲综合男人的天堂| 亚洲第一视频区| eeuss鲁片一区二区三区在线观看| 在线观看免费不卡av| 国产精品呻吟| 成人免费网站入口| 婷婷综合社区| 欧美午夜欧美| 欧美1区二区| 96国产粉嫩美女| 91p九色成人| 538国产精品一区二区免费视频| 国产三区视频在线观看| 亚洲天堂一区二区三区| 色呦呦中文字幕| 日韩一区二区精品在线观看| 中文字幕欧美在线观看| 精品久久久久久中文字幕| 欧美成人精品欧美一| 国产精品成人免费精品自在线观看 | 9999在线精品视频| 国产精品久久999| 综合另类专区| 91tv亚洲精品香蕉国产一区7ujn| 伊人春色在线观看| 久久亚洲成人精品| 在线观看免费网站黄| 国产亚洲精品久久久久动| 午夜小视频在线播放| 精品福利一区二区三区免费视频| 国产欧美日韩成人| 在线综合+亚洲+欧美中文字幕| 中文字幕视频一区二区| 欧洲在线/亚洲| 精品一区二三区| 色成人在线视频| 国产午夜麻豆影院在线观看| 色综合欧美在线视频区| av大全在线观看| 婷婷夜色潮精品综合在线| 日韩高清免费av| 午夜精品久久久久久久久 | 一本色道久久综合亚洲aⅴ蜜桃| 日本在线小视频| 精品人伦一区二区三区蜜桃免费| 成人免费区一区二区三区| 欧美日韩综合视频| 无码任你躁久久久久久久| 91国在线观看| 在线观看免费观看在线| 制服丝袜在线91| 国产黄a三级三级看三级| 日韩女优电影在线观看| 亚洲国产成人一区二区| 亚洲国产欧美日韩精品| 免费观看成年在线视频网站| 亚洲偷熟乱区亚洲香蕉av| a天堂中文在线88| 久久精品国产久精国产思思| 性国产高清在线观看| 隔壁老王国产在线精品| 成人免费影院| 91精品综合久久久久久五月天| 日韩精品一区二区三区中文在线 | 精品盗摄女厕tp美女嘘嘘| 午夜欧美一区二区三区免费观看| 欧美国产偷国产精品三区| 免费看污污视频| 最新国产乱人伦偷精品免费网站| 国产日韩一区二区在线| 蜜乳av一区二区| 日本wwwxx| 久久麻豆一区二区| 国内毛片毛片毛片毛片毛片| 一级精品视频在线观看宜春院| 日韩xxx高潮hd| 欧美日韩高清一区二区不卡| 亚洲高清视频网站| 国产亚洲一区精品| 在线三级中文| 国产成人+综合亚洲+天堂| av在线国产精品| 麻豆av一区二区三区| 日韩一区二区在线免费| 日韩人妻无码精品久久久不卡| 久久午夜视频| 免费看三级黄色片| 久久在线免费观看| 日本少妇高清视频| 一本色道亚洲精品aⅴ| 亚洲精品福利网站| 国产一区二区三区毛片| 国内老司机av在线| 国产精品欧美一区二区三区奶水 | 欧美精品一区二区三区视频| 丁香在线视频| 久久人人爽国产| 91视频成人| 视频一区不卡| 一区二区三区福利| 97人人模人人爽人人澡| 国产无人区一区二区三区| 玖玖爱免费视频| 欧美三级三级三级爽爽爽| 少妇人妻偷人精品一区二区| 色爱精品视频一区| 都市激情亚洲综合| 国产精品免费区二区三区观看| 色欧美自拍视频| av网站在线观看不卡| av成人老司机| 久草视频中文在线| 欧美日韩精品三区| 国内三级在线观看| 国产69精品久久久久久| 亚洲欧洲国产精品一区| 中文字幕一区二区三区在线乱码| 久久亚洲二区| 18禁裸乳无遮挡啪啪无码免费| 亚洲综合网站在线观看| 国产aⅴ一区二区三区| 色老头一区二区三区在线观看| 日韩一区二区三区免费| 免费看国产精品一二区视频| 亚洲久久成人| 黄色激情在线观看| 一区二区三区免费| 精品国产av一区二区三区| 久久久精品999| 99国内精品久久久久| 亚洲电影网站| 九九**精品视频免费播放| 三级黄色片在线观看| 欧美在线啊v一区| 最新97超碰在线| 国产欧美日韩精品在线观看| 日韩中文字幕高清在线观看| 久久久久久蜜桃一区二区| 国产精品少妇自拍| 成人免费一区二区三区| 色香阁99久久精品久久久| 欧美日韩伦理一区二区| 曰韩不卡视频| 国产毛片精品一区| 精品无码人妻一区二区三区品| 精品日韩一区二区三区免费视频| 成全电影大全在线观看| 韩国成人一区| 亚洲欧美日韩精品一区二区| 老牛影视av老牛影视av| 在线欧美日韩精品| 在线观看a视频| 亚洲伊人久久大香线蕉av| 欧美日韩视频| 懂色av粉嫩av蜜乳av| 欧美性生交大片免费| а√天堂中文在线资源bt在线| 国产日韩av在线播放| 亚洲电影在线一区二区三区| 久久久久亚洲av无码网站| 亚洲超碰精品一区二区| 美国成人毛片| 成人免费观看a| 最新日韩在线| 自拍偷拍你懂的| 日韩亚洲欧美在线| 九九色在线视频| 欧美精品一区在线发布| 蜜臀91精品一区二区三区| 老妇女50岁三级| 日韩精品极品毛片系列视频| 免费欧美电影| a级片一区二区| 国产亚洲欧美激情| 国产精品一区二区人人爽| 欧美精品videosex牲欧美| 妖精一区二区三区精品视频| 欧美日韩中文不卡| 午夜在线电影亚洲一区| 国产午夜在线视频| 99一区二区| 视频在线在亚洲| 劲爆欧美第一页| 一区二区国产精品视频| 亚洲综合影院| 亚洲一区在线不卡| 天天做天天摸天天爽国产一区|