精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

致1999电视剧免费观看策驰影院| 欧美高清在线视频观看不卡| 日本日本19xxxⅹhd乱影响| 日本黄色三级视频| 日韩制服丝袜先锋影音| 中文字幕av一区二区| 黄色片免费网址| 欧产日产国产精品视频| 中文久久乱码一区二区| 亚洲在线观看视频网站| 国产精品人人人人| 999国产精品视频| 精品国产伦一区二区三区观看方式 | 天堂v在线视频| 日本国产在线观看| 久久精品国产在热久久| 欧美精品精品精品精品免费| 69xxx免费| 加勒比色综合久久久久久久久 | 精品视频一区二区在线| 国产视频中文字幕在线观看| 成人小视频在线| 国产在线久久久| 国产无套丰满白嫩对白| 欧美国产激情| 日韩精品在线观看视频| 999热精品视频| 美女写真久久影院| 精品国产鲁一鲁一区二区张丽 | 噜噜噜在线视频| 曰本一区二区| 一本大道综合伊人精品热热| 97碰在线视频| av网站在线看| 综合网在线视频| 日韩精品久久一区| 香蕉av在线播放| 国产成人午夜99999| 国产欧亚日韩视频| 看黄色一级大片| 亚洲欧美日韩精品一区二区| 久久全国免费视频| 久久久久无码精品国产| 正在播放日韩欧美一页| 日韩中文字幕免费视频| 精品日韩在线视频| 成久久久网站| 中文在线不卡视频| 成人在线观看免费高清| 黑人操亚洲人| 国产一区二区伦理| 国产精品99久久99久久久二8| 亚洲精品国产精品乱码| 亚洲精华国产欧美| 国内成人精品一区| 亚洲精品在线观看av| 牛牛国产精品| 欧美福利视频在线| 久久婷婷国产麻豆91| 国产综合激情| 午夜精品一区二区三区在线 | 亚洲精品a级片| 久久亚洲一区二区三区四区五区高| 五月婷婷婷婷婷| 91日韩欧美| 欧美成人午夜影院| 麻豆亚洲av熟女国产一区二 | 国产精品久久影院| 成年人黄色在线观看| 超碰最新在线| 亚洲va天堂va国产va久| 欧美精品自拍视频| 午夜欧美巨大性欧美巨大| 在线观看免费视频综合| 91 在线视频观看| 视频一区在线| 亚洲国产精品va在看黑人| 91精品小视频| 国产一区二区观看| xxx一区二区| 久久亚洲AV无码| 先锋影音国产一区| 国产视频观看一区| 内射无码专区久久亚洲| 久久久精品免费免费| 中文有码久久| 91福利在线免费| 在线一区二区三区四区五区| 国产高清999| 欧美天堂社区| 日韩一级黄色av| 99r国产精品视频| 中文字幕亚洲影院| 成人激情自拍| 伊人久久综合97精品| 免费在线观看黄色小视频| 亚洲特色特黄| 国产精品一区二区三区毛片淫片| 99国产精品久久久久99打野战| 成人午夜视频网站| 亚洲国产精品123| 波多野结依一区| 欧美天堂亚洲电影院在线播放| 日本在线视频播放| 精品国产一区二区三区四区| 欧美精品激情在线观看| 中文字幕+乱码+中文| 丁香一区二区三区| 亚洲精品在线视频观看| 999av小视频在线| 欧美日韩精品三区| 亚洲欧美在线不卡| 永久亚洲成a人片777777| 青青在线视频一区二区三区| 国产偷人妻精品一区二区在线| 久久久青草青青国产亚洲免观| 成年人三级视频| 日本欧美一区| 亚洲黄页视频免费观看| 永久久久久久久| 日韩国产欧美在线播放| 亚洲另类在线一区| 一区二区冒白浆视频| 国产自产自拍视频在线观看| 884aa四虎影成人精品一区| 国产手机在线观看| 日韩天堂av| 99精品国产高清在线观看| 亚洲麻豆精品| 欧美亚洲综合网| 成年人网站免费看| 国产精品videosex极品| 成人免费在线网址| av大片在线看| 91久久国产综合久久| www.男人天堂| 在线观看一区| 97碰碰视频| 天堂va在线| 欧美久久久影院| 精品日韩在线视频| 天堂av在线一区| 91亚洲精品在线| 在线视频91p| 在线观看日韩国产| 中文天堂资源在线| 日韩精品三区四区| 日本一区二区不卡高清更新| 日本蜜桃在线观看视频| 国产视频久久久久久久| 日韩精品1区2区| 91麻豆免费看| 国产一区二区视频免费在线观看 | 国产一区二区不卡视频| 欧美男男video| 欧美不卡一区二区| 国产亚洲精品久久久久久打不开| 粉嫩欧美一区二区三区高清影视| 97超碰在线视| 国产精品99久久免费观看| 久久免费高清视频| 天天躁日日躁狠狠躁喷水| 午夜精品久久久久久| av网站免费在线播放| 久久精品导航| 亚洲草草视频| 国产激情综合| 国内偷自视频区视频综合| 亚洲av成人无码久久精品老人| 精品久久久视频| 在线免费观看视频| 激情深爱一区二区| 无码日本精品xxxxxxxxx| 国产伦理久久久久久妇女 | 成人黄色综合网站| 国模吧无码一区二区三区| 国产一区二区三区探花| 国产日产欧美a一级在线| 26uuu亚洲电影在线观看| 精品国产乱码久久久久久牛牛| 国产精品suv一区二区| 91视频精品在这里| 午夜免费福利视频在线观看| 女同性一区二区三区人了人一| 国产精品一区二区三区四区五区| 最新欧美色图| 精品久久久999| 欧美熟妇另类久久久久久不卡| 狠狠躁18三区二区一区| 一级二级黄色片| 粉嫩av一区二区三区粉嫩| 欧美 日韩精品| 欧美.日韩.国产.一区.二区| 精品福利影视| www.久久久.com| 欧美亚洲国产成人精品| 麻豆系列在线观看| 精品视频在线观看日韩| 国产女无套免费视频| 婷婷综合五月天| 国产极品视频在线观看| 成人久久视频在线观看| 一区二区三区免费播放| 亚洲无线视频| 欧美专区一二三| 亚洲一区二区三区免费| 国产九九精品视频| 成人福利影视| 日韩在线观看免费高清完整版| 日韩一区免费视频| 在线电影国产精品| 亚洲欧美另类在线视频| 亚洲影视在线播放| 开心激情五月网| 国产午夜久久久久| 久久午夜夜伦鲁鲁片| 国产精品自产自拍| 亚洲成人天堂网| 玖玖国产精品视频| 国产精品专区在线| 欧美激情日韩| 在线播放豆国产99亚洲| 久草成人在线| 激情小说综合网| 伊人久久影院| 亚洲自拍av在线| 国产极品一区| 国产精品成人国产乱一区| 免费h在线看| 韩国日本不卡在线| 黄色羞羞视频在线观看| 久久久999精品视频| av男人的天堂在线| 在线中文字幕日韩| 国产高清一区在线观看| 亚洲男人天堂视频| 头脑特工队2免费完整版在线观看| 欧美一区2区视频在线观看| 在线观看免费高清视频| 在线观看精品一区| 日韩熟女一区二区| 一本一道综合狠狠老| 男人日女人网站| 婷婷中文字幕一区三区| 国产成人自拍视频在线| 五月婷婷久久丁香| 国产精品500部| 欧美日韩国产专区| 日韩久久中文字幕| 色哟哟一区二区| 夜夜爽妓女8888视频免费观看| 色婷婷一区二区三区四区| 黄色一级视频免费看| 91成人网在线| 亚洲图片在线视频| 欧美在线综合视频| 一级黄色大毛片| 555www色欧美视频| 国内精品久久久久久久久久久 | 999久久久精品视频| 经典一区二区三区| 女人扒开双腿让男人捅| 成人精品一区二区三区中文字幕| 亚洲熟女一区二区| 国产午夜精品理论片a级大结局| 丁香激情五月少妇| 一区在线观看视频| 日韩视频中文字幕在线观看| 亚洲国产精品久久人人爱| 91av在线免费视频| 在线观看日韩电影| 999免费视频| 亚洲精品电影网站| www 日韩| 欧美精品少妇videofree| 国产高潮在线| 国产精品露脸av在线| 99久久久国产| 国产一区二区三区奇米久涩| 国产精品一区二区av日韩在线| 亚洲图片都市激情| 欧美午夜在线视频| 成人黄色片视频| 精品一区二区三区免费视频| 少妇熟女视频一区二区三区| 久久久久久久网| 国产传媒免费在线观看| 香港成人在线视频| 欧美成人一区二区视频| 日韩欧美在线影院| 久久精品蜜桃| 欧美激情一级二级| 51一区二区三区| 国产aⅴ精品一区二区三区黄| 亚洲综合图色| 97在线免费视频观看| 久久看片网站| 深夜视频在线观看| 国产偷v国产偷v亚洲高清 | 色欲综合视频天天天| 国产乱码精品一区二三区蜜臂| 日韩av一区二区在线| 黄网站免费在线观看| 日本精品性网站在线观看| 日韩精品一区二区三区中文| 日韩和欧美的一区二区| 亚洲大胆av| 亚洲三级在线观看视频| 久久久精品一品道一区| 久久国产精品波多野结衣av| 精品视频1区2区| 色猫av在线| 欧美寡妇偷汉性猛交| 欧美极品在线| 日本一区二区三区精品视频| 伊人成人在线视频| 91香蕉国产线在线观看| 日本一区二区三级电影在线观看| 国产在线视频在线观看| 在线电影欧美成精品| 春暖花开成人亚洲区| 欧美与黑人午夜性猛交久久久| 日韩欧美久久| 一级一片免费播放| 青娱乐精品在线视频| 天天躁日日躁aaaxxⅹ | cao在线观看| 国产一区在线观看视频| 呻吟揉丰满对白91乃国产区| 色吊一区二区三区| 五月婷中文字幕| 久久免费视频网站| 日韩视频1区| 日韩不卡一二区| 精久久久久久久久久久| 成人黄色短视频| 欧美日韩国产美女| 不卡在线视频| 国产精品91免费在线| 在线视频亚洲专区| 欧美女人性生活视频| 99久久er热在这里只有精品66| 久久综合成人网| 精品国产伦一区二区三区免费| 在线看福利影| av观看久久| 激情六月综合| 熟妇高潮一区二区| 午夜精品免费在线| 手机在线不卡av| 2019中文字幕在线免费观看| 天美av一区二区三区久久| 日本在线xxx| 99精品视频在线观看免费| 亚洲免费在线观看av| 亚洲欧美一区二区三区四区| 欧洲av不卡| 亚洲国产精品久久久久久女王| 秋霞午夜av一区二区三区 | 亚洲一区二区3| 国产成人手机在线| 97在线免费观看| 国产成人高清| 在线观看免费视频高清游戏推荐| 中文字幕亚洲区| 国产男女裸体做爰爽爽| 欧美黑人xxxⅹ高潮交| 高清一区二区三区| 国产熟女高潮视频| 国产精品二区一区二区aⅴ污介绍| ,亚洲人成毛片在线播放| 欧美床上激情在线观看| 国产精品丝袜在线播放| 国产精品宾馆在线精品酒店| 久久久99久久| 国产精品人人爽| 欧美激情综合色| 亚洲黄页在线观看| 另类小说色综合| 一区二区三区影院| 日韩欧美在线番号| 国产日本欧美视频| 在线视频观看日韩| 51妺嘿嘿午夜福利| 日韩一级精品视频在线观看| 韩日毛片在线观看| 亚洲人体一区| 成人高清视频在线观看| 欧美brazzers| 欧美另类第一页| 亚洲精品合集| 国产91在线免费观看| 岛国av在线不卡| 麻豆视频在线免费观看| 精品国产综合久久| 精品午夜久久福利影院| 中文字幕激情小说| 欧美大片免费观看| 欧美色图激情小说| 日本一级大毛片a一|