日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

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

來源: 責(zé)編: 時間:2024-01-16 17:34:10 331觀看
導(dǎo)讀故事又是一個風(fēng)和日麗美好的一天,小貓戴著耳機,安逸地聽著音樂,擼著代碼,這種沒有會議的日子真的是巴適得板。不料禍從天降,組長火急火燎地跑過來找到了小貓。“快排查一下,目前有A公司用戶反饋積分被多扣了”。小貓回憶了

故事

又是一個風(fēng)和日麗美好的一天,小貓戴著耳機,安逸地聽著音樂,擼著代碼,這種沒有會議的日子真的是巴適得板。VXA28資訊網(wǎng)——每日最新資訊28at.com

不料禍從天降,組長火急火燎地跑過來找到了小貓。“快排查一下,目前有A公司用戶反饋積分被多扣了”。VXA28資訊網(wǎng)——每日最新資訊28at.com

小貓回憶了一下“不對啊,這接口我也沒動過啊,前幾天對外平臺的老六直接找我要個支付接口,我就給他了的,以前的代碼,我都沒有動過的......”。VXA28資訊網(wǎng)——每日最新資訊28at.com

于是小貓一邊疑惑一邊翻看著以前的代碼,越看臉色越差......VXA28資訊網(wǎng)——每日最新資訊28at.com

VXA28資訊網(wǎng)——每日最新資訊28at.com

小貓做的是一個標準的積分兌換商城,以前和客戶合作的時候,客戶直接用的是小貓單位自己定制的h5頁面。這次合作了一家公司有點特殊,由于公司想要定制化自己個性化的H5,加上本身A公司自己有開發(fā)能力,所以經(jīng)過討論就以接口的方式直接將相關(guān)接口給出去,A客戶H5開發(fā)完成之后自己來對接。VXA28資訊網(wǎng)——每日最新資訊28at.com

慢慢地,原因也水落石出,之前好好的業(yè)務(wù)一直沒有問題是因為商城的本身H5頁面做了防重復(fù)提交,由于量小,并且一般對接方式用的都是純H5,所以都沒有什么問題,然后這次是直接將接口給出去了,完了接口居然沒有加冪等......VXA28資訊網(wǎng)——每日最新資訊28at.com

小貓?zhí)蓸專瑪?shù)據(jù)訂正當(dāng)然是少不了了,事故報告當(dāng)然也少不了了。VXA28資訊網(wǎng)——每日最新資訊28at.com

正所謂前人挖坑,后人遭殃,前人鍋后人背。VXA28資訊網(wǎng)——每日最新資訊28at.com

聊聊冪等

1.接口冪等梗概

這個案例其實就是一個典型的接口冪等案例。那么老貓就和大家從以下幾個方面好好剖析一下接口冪等吧。VXA28資訊網(wǎng)——每日最新資訊28at.com

VXA28資訊網(wǎng)——每日最新資訊28at.com

2.什么是接口冪等

比較專業(yè)的術(shù)語:其任意多次執(zhí)行所產(chǎn)生的影響均與第一次執(zhí)行的影響相同。大白話:多次調(diào)用的情況下,接口最終得到的結(jié)果是一致的。VXA28資訊網(wǎng)——每日最新資訊28at.com

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

  • 用戶進行提交動作的時候,由于網(wǎng)絡(luò)波動等原因?qū)е潞蠖送巾憫?yīng)不及時,這樣用戶就會一直點點點,這樣機會發(fā)生重復(fù)提交的情況。
  • 分布式系統(tǒng)之間調(diào)用的情況下,例如RPC調(diào)用,為了防止網(wǎng)絡(luò)波動超時等造成的請求失敗,都會添加重試機制,導(dǎo)致一個請求提交多次。
  • 分布式系統(tǒng)經(jīng)常會用到消息中間件,當(dāng)由于網(wǎng)絡(luò)原因,mq沒有收到ack的情況下,就會導(dǎo)致消息的重復(fù)投遞,從而就會導(dǎo)致重復(fù)提交行為。

還有就是惡意攻擊了,有些業(yè)務(wù)接口做的比較粗糙,黑客找到漏洞之后會發(fā)起重復(fù)提交,這樣就會導(dǎo)致業(yè)務(wù)出現(xiàn)問題。打個比方,老貓曾經(jīng)干過,鄰居小孩報名了一個畫畫比賽,估計是機構(gòu)培訓(xùn)發(fā)起的,功能做的也差,需要靠投票贏得某些禮品,然后老貓抓到接口信息之后就模擬投票進行重復(fù)刷了投票。VXA28資訊網(wǎng)——每日最新資訊28at.com

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

首先我們說是不是所有的接口都需要冪等?是不是加了冪等就好呢?顯然不是。因為接口冪等的實現(xiàn)某種意義上是要消耗系統(tǒng)性能的,我們沒有必要針對所有業(yè)務(wù)接口都加上冪等。VXA28資訊網(wǎng)——每日最新資訊28at.com

這個其實并不能做一個完全的定義說哪個就不用冪等,因為很多時候其實還是得結(jié)合業(yè)務(wù)邏輯一起看。但是其中也是有規(guī)律可循的。VXA28資訊網(wǎng)——每日最新資訊28at.com

既然我們說冪等就是多次調(diào)用,接口最終得到結(jié)果一致,那么很顯然,查詢接口肯定是不要加冪等的,另外一些簡單刪除數(shù)據(jù)的接口,無論是邏輯刪除還是物理刪除,看場景的情況下其實也不用加冪等。VXA28資訊網(wǎng)——每日最新資訊28at.com

但是大部分涉及到多表更新行為的接口,咱們最好還是得加上冪等。VXA28資訊網(wǎng)——每日最新資訊28at.com

接口冪等實戰(zhàn)方案

1.前端防抖處理

前端防抖主要可以有兩種方案,一種是技術(shù)層面的,一種是產(chǎn)品層面的:VXA28資訊網(wǎng)——每日最新資訊28at.com

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

2.基于數(shù)據(jù)庫唯一索引

利用數(shù)據(jù)庫唯一索引。我們具體來看一下流程,咱們就用小貓遇到的例子。如下:VXA28資訊網(wǎng)——每日最新資訊28at.com

VXA28資訊網(wǎng)——每日最新資訊28at.com

過程描述:VXA28資訊網(wǎng)——每日最新資訊28at.com

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

3.數(shù)據(jù)庫樂觀鎖實現(xiàn)

什么是樂觀鎖,它假設(shè)多用戶并發(fā)的事務(wù)在處理時不會彼此互相影響,各事務(wù)能夠在不產(chǎn)生鎖的情況下處理各自影響的那部分數(shù)據(jù)。說得直白一點樂觀鎖就是一個馬大哈。總是假設(shè)最好的情況,每次去拿數(shù)據(jù)的時候都認為別人不會修改,所以不會上鎖,只在更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù)。VXA28資訊網(wǎng)——每日最新資訊28at.com

例如提交訂單的進行支付扣款的時候,本來可能更新賬戶金額扣款的動作是這樣的:VXA28資訊網(wǎng)——每日最新資訊28at.com

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

加上版本號之后,咱們的代碼就是這樣的:VXA28資訊網(wǎng)——每日最新資訊28at.com

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

這種情況下其實就要求客戶端每次在請求支付下單的時候都需要上層客戶端指定好當(dāng)前的版本信息。不過這種冪等的處理方式,老貓用的比較少。VXA28資訊網(wǎng)——每日最新資訊28at.com

4.數(shù)據(jù)庫悲觀鎖實現(xiàn)

悲觀鎖的話具有強烈的獨占和排他特性。大白話誰都不信的主。所以我們就用select ... for update這樣的語法進行行鎖,當(dāng)然老貓覺得單純的select ... for update只能解決同一時刻大并發(fā)的冪等,所以要保證單號重試這樣非并發(fā)的冪等請求還是得去校驗當(dāng)前數(shù)據(jù)的狀態(tài)才行。就拿當(dāng)前的小貓遇到的場景來說,流程如下:VXA28資訊網(wǎng)——每日最新資訊28at.com

VXA28資訊網(wǎng)——每日最新資訊28at.com

悲觀鎖VXA28資訊網(wǎng)——每日最新資訊28at.com

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

這里老貓一再想要強調(diào)的是在校驗的時候還是得帶上本身的業(yè)務(wù)狀態(tài)去做校驗,select ... for update并非萬能冪等。VXA28資訊網(wǎng)——每日最新資訊28at.com

5.后端生成token

這個方案的本質(zhì)其實是引入了令牌桶的機制,當(dāng)提交訂單的時候,前端優(yōu)先會調(diào)用后端接口獲取一個token,token是由后端發(fā)放的。當(dāng)然token的生成方式有很多種,例如定時刷新令牌桶,或者定時生成令牌并放到令牌池中,當(dāng)然目的只有一個就是保住token的唯一性即可。VXA28資訊網(wǎng)——每日最新資訊28at.com

生成token之后將token放到redis中,當(dāng)然需要給token設(shè)置一個失效時間,超時的token也會被刪除。VXA28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)后端接收到訂單提交的請求的時候,會先判斷token在緩存中是否存在,第一次請求的時候,token一定存在,也會正常返回結(jié)果,但是第二次攜帶同一個token的時候被拒絕了。VXA28資訊網(wǎng)——每日最新資訊28at.com

流程如下:VXA28資訊網(wǎng)——每日最新資訊28at.com

VXA28資訊網(wǎng)——每日最新資訊28at.com

token機制VXA28資訊網(wǎng)——每日最新資訊28at.com

有個注意點大家可以思考一下:如果用戶用程序惡意刷單,同一個token發(fā)起了多次請求怎么辦?想要實現(xiàn)這個功能,就需要借助分布式鎖以及Lua腳本了,分布式鎖可以保證同一個token不能有多個請求同時過來訪問,lua腳本保證從redis中獲取令牌->比對令牌->生成單號->刪除令牌這一系列行為的原子性。VXA28資訊網(wǎng)——每日最新資訊28at.com

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

現(xiàn)在很多的業(yè)務(wù)服務(wù)都是分布式系統(tǒng),所以就拿分布式鎖來說,關(guān)于分布式鎖,老貓在此不做贅述,之前老貓寫過redis的分布式鎖和實現(xiàn),還有zk鎖和實現(xiàn),具體可見鏈接:VXA28資訊網(wǎng)——每日最新資訊28at.com

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

當(dāng)然和上述的數(shù)據(jù)庫悲觀鎖類似,咱們的分布式鎖也只能保證同一個訂單在同一時間的處理。其次也是要去校訂單的狀態(tài),防止其重復(fù)支付的,也就是說,只要支付的訂單進入后端,都要將原先的訂單修改為支付中,防止后續(xù)支付中斷之后的重復(fù)支付。VXA28資訊網(wǎng)——每日最新資訊28at.com

在上述小貓的流程中還沒有涉及到現(xiàn)金補充,如果涉及到現(xiàn)金補充的話,例如對接了微信或者支付寶的情況,還需要根據(jù)最終的支付回調(diào)結(jié)果來最終將訂單狀態(tài)進行流轉(zhuǎn)成支付完成或者是支付失敗。VXA28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

在我們?nèi)粘5拈_發(fā)中,一些重要的接口還是需要大家謹慎對待,即使是前任開發(fā)留下的接口,沒有任何改動,當(dāng)有人咨詢的時候,其實就要好好去了解一下里面的實現(xiàn),看看方案有沒有問題,看看技術(shù)實現(xiàn)有沒有問題,這應(yīng)該也是每一個程序員的基本素養(yǎng)。VXA28資訊網(wǎng)——每日最新資訊28at.com

另外的,在一些重要的接口上,尤其是資金相關(guān)的接口上,冪等真的是相當(dāng)?shù)闹匾P』锇閭儯銈冇X得呢?VXA28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-62793-0.html前任開發(fā)在代碼里下毒,支付下單居然沒加冪等

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: C++方差的運算:方差求解以及方差的增量計算

下一篇: 目前為止,這些項目已經(jīng)被 Rust 重寫了

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲中无吗在线| 亚洲乱码日产精品bd| 国产精品一区一区三区| 国产欧美一区二区精品忘忧草| 一区福利视频| 日韩视频在线观看一区二区| 亚洲欧美成人在线| 另类av导航| 国产精品爱久久久久久久| 国内精品久久久久影院薰衣草| 最新国产成人在线观看| 亚洲永久免费精品| 另类亚洲自拍| 国产精品国产三级国产| 韩日精品中文字幕| 一区二区三区高清在线 | 久久激情网站| 欧美激情亚洲激情| 国产欧美日韩不卡| 亚洲三级免费电影| 欧美与欧洲交xxxx免费观看 | 国产一区二区在线观看免费| 精品999在线播放| 一区二区三区不卡视频在线观看 | 亚洲午夜精品久久| 蜜桃久久av一区| 国产九九精品| 日韩亚洲精品视频| 久久久久久久激情视频| 国产精品va在线播放| 亚洲国产精品福利| 欧美在线观看一二区| 欧美日韩亚洲一区在线观看| 依依成人综合视频| 性18欧美另类| 欧美网站在线| 亚洲精品九九| 裸体素人女欧美日韩| 国产农村妇女精品一二区| 99精品国产99久久久久久福利| 久久青青草综合| 国产日本亚洲高清| 亚洲一级特黄| 欧美日韩国产高清| 在线国产日韩| 午夜日韩在线观看| 欧美日韩中国免费专区在线看| 亚洲国产美国国产综合一区二区| 欧美永久精品| 国产精品香蕉在线观看| 国产精品99久久久久久久久| 欧美大秀在线观看| 伊人狠狠色丁香综合尤物| 欧美一区二视频| 国产精品一区=区| 亚洲一区二区在线视频| 欧美人成网站| 亚洲另类春色国产| 欧美成人精品不卡视频在线观看| 黄色成人免费观看| 久久精品女人的天堂av| 国产亚洲成av人在线观看导航| 午夜精品久久久| 国产精品亚发布| 亚洲一区区二区| 国产精品久久久999| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美精品一级| 亚洲区第一页| 欧美成人有码| 亚洲欧洲日本在线| 免费一级欧美片在线观看| 在线日韩电影| 欧美va天堂在线| 亚洲国产精品一区二区www| 噜噜噜在线观看免费视频日韩| 黄色成人精品网站| 老鸭窝亚洲一区二区三区| 亚洲高清久久| 欧美福利专区| 日韩视频一区二区在线观看 | 国产日韩欧美中文| 欧美有码在线观看视频| 国产欧美日韩在线播放| 欧美一区二区成人6969| 国产美女精品视频| 欧美在线观看www| 精品成人在线视频| 农村妇女精品| 99re8这里有精品热视频免费| 欧美日韩一区二区三区在线观看免| 99精品99| 国产精品一二一区| 欧美自拍偷拍| 亚洲高清在线观看一区| 欧美激情麻豆| 亚洲午夜精品久久久久久app| 国产精品久久久久久亚洲调教| 亚洲在线一区二区| 国产亚洲毛片| 免费一级欧美片在线观看| 亚洲精品国偷自产在线99热| 欧美屁股在线| 亚洲欧美日韩直播| 国产一区清纯| 欧美高清在线一区| 亚洲午夜精品一区二区| 国产视频观看一区| 老司机午夜免费精品视频| 亚洲精品老司机| 国产精品成人v| 久久精品二区| 亚洲国产视频直播| 欧美性感一类影片在线播放 | 久久久久一区二区| 亚洲人精品午夜| 国产精品欧美一区喷水| 久久久久国产精品人| 亚洲精品国产精品国产自| 国产精品ⅴa在线观看h| 久久国产免费| 亚洲精品在线二区| 国产美女精品免费电影| 欧美a级一区二区| 亚洲自拍偷拍色片视频| 精品动漫3d一区二区三区免费版| 欧美久久99| 欧美在线观看视频一区二区| 亚洲日本免费电影| 国产日本精品| 欧美精品一区二区三区一线天视频 | 欧美日在线观看| 久久久久久亚洲精品中文字幕 | 久久五月激情| 亚洲天堂男人| 激情久久影院| 国产精品观看| 免费在线观看成人av| 亚洲自拍电影| 亚洲三级电影全部在线观看高清| 国产伦精品一区二区三区视频黑人| 蜜桃av久久久亚洲精品| 亚洲一区免费视频| 亚洲国产裸拍裸体视频在线观看乱了| 国产精品久久久久久久午夜 | 国产综合自拍| 国产精品a级| 欧美国产精品va在线观看| 欧美一区影院| 中文精品99久久国产香蕉| 在线免费观看日韩欧美| 国产精品一区二区三区四区五区| 欧美激情第二页| 久久精品成人一区二区三区蜜臀| 99天天综合性| 在线日本成人| 国产一区二区黄色| 欧美性做爰猛烈叫床潮| 免费观看成人www动漫视频| 欧美一区二区在线| 亚洲综合精品| 一区二区激情小说| 最新国产の精品合集bt伙计| 国产一区二区精品久久91| 国产精品久久久久久久app| 欧美看片网站| 欧美fxxxxxx另类| 久久女同精品一区二区| 欧美在线免费观看亚洲| 亚洲一区二区欧美| 亚洲最新色图| 亚洲免费观看在线视频| 亚洲国产岛国毛片在线| 狠狠色综合播放一区二区| 国产欧美视频一区二区三区| 国产精品福利片| 欧美日韩一本到| 欧美精品偷拍| 欧美黄色一区| 欧美大片va欧美在线播放| 久久中文字幕一区| 久久久久久久一区| 久久成人精品| 欧美一级大片在线观看| 亚洲欧美日韩成人| 亚洲欧美日韩精品| 亚洲一区二区视频在线| 一区二区三区成人| 国产精品99久久久久久久久| 99re6这里只有精品视频在线观看| 亚洲国产日韩欧美综合久久| 在线观看中文字幕不卡| 精品动漫一区| 狠狠色丁香久久婷婷综合_中| 国产一区欧美日韩| 韩国一区电影| 激情综合亚洲| 在线观看欧美成人| 亚洲第一在线| 亚洲黄色毛片| 亚洲精品乱码视频| 99精品国产在热久久婷婷| 一本色道久久88综合日韩精品| 99精品久久|