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

京東到家庫存系統架構設計

開發 開發工具
目前,京東到家庫存系統經歷兩年多的線上考驗與技術迭代,現服務著萬級商家十萬級店鋪的規模,需求的變更與技術演進,我們是如何做到系統的穩定性與高可用呢。

目前,京東到家庫存系統經歷兩年多的線上考驗與技術迭代,現服務著萬級商家十萬級店鋪的規模,需求的變更與技術演進,我們是如何做到系統的穩定性與高可用呢,下圖會給你揭曉答案(通過強大的基礎服務平臺讓應用、JVM、Docker、物理機所有健康指標一目了然,7*24小時智能監控告警讓開發無須一直盯著監控,另外數據與業務相輔相成,用數據驗證業務需求,迭代業務需求,讓業務需求都盡可能的收益***化,庫存系統的開發同學只需要關注業務需求,大版本上線前相應的測試同學會跟進幫你壓測,防止上線后潛在的性能瓶頸)。

庫存系統技術架構圖

附1:庫存系統技術架構圖

庫存系統數據流轉圖

附2:庫存系統數據流轉圖

庫存系統的架構很有意思,從上圖來看功能上其實并不復雜,但是他面臨的技術復雜度卻是相當高的,比如秒殺品在高并發的情況下如何防止超賣,另外庫存系統還不是一個純技術的系統,需要結合用戶的行為特點來考慮,比如下文中提到什么時間進行庫存的扣減最合適,我們先拋出幾個問題和大家一起探討下,如有有妥不處,歡迎大家拍磚。

庫存什么時候進行預占(或者扣減)呢

商家銷售的商品數量是有限的,用戶下單后商品會被扣減,我們可以怎么實現呢?

舉個例子:

一件商品有1000個庫存,現在有1000個用戶,每個用戶計劃同時購買1000個。

  • (實現方案1)如果用戶加入購物車時進行庫存預占,那么將只能有1個用戶將1000個商品加入購物車。
  • (實現方案2)如果用戶提交訂單時進行庫存預占,那么將也只能有1個用戶將1000個商品提單成功,其它的人均提示“庫存不足,提單失敗”。
  • (實現方案3)如果用戶提交訂單&支付成功時進行庫存預占,那么這1000個人都能生成訂單,但是只有1個人可以支付成功,其它的訂單均會被自動取消。

京東到家目前采用的是方案2,理由:

  • 用戶可能只是暫時加入購物車,并不表示用戶最終會提單并支付。
  • 所以在購物車進行庫存校驗并預占,會造成其它真正想買的用戶不能加入購物車的情況,但是之前加車的用戶一直不付款,最終損失的是公司。
  • 方案3會造成生成1000個訂單,無論是在支付前校驗庫存還是在支付成功后再檢驗庫存,都會造成用戶準備好支付條件后卻會出現99.9%的系統取消訂單的概率,也就是說會給99.9%的用戶體驗到不爽的感覺。
  • 數據表明用戶提交訂單不支付的占比是非常小的(相對于加入購物車不購買的行為),目前京東到家給用戶預留的最長支付時間是30分鐘,超過30分鐘訂單自動取消,預占的庫存自動釋放

綜上所述,方案2也可能由于用戶下單預占庫存但最終未支付,造成庫存30分鐘后才能被其它用戶使用的情況,但是相較于方案1,方案3無疑是折中的***方案。

重復提交訂單的問題?

重復提交訂單造成的庫存重復扣減的后果是比較嚴重的。比如商家設置有1000件商品,而實際情況可能賣了900件就提示用戶無貨了,給商家造成無形的損失

可能出現重復提交訂單的情況:

  • 用戶善意行為)app上用戶單擊“提交訂單”按鈕后由于后端接口沒有返回,用戶以為沒有操作成功會再次單擊“提交訂單”按鈕
  • 用戶惡意行為)黑客直接刷提單接口,繞過App端防重提交功能
  • 提單系統重試)比如提單系統為了提高系統的可用性,在***次調用庫存系統扣減接口超時后會重試再次提交扣減請求

好了,既然問題根源捋清楚了,我們一一對癥下藥

  • 用戶善意行為)app側在用戶***次單擊“提交訂單”按鈕后對按鈕進行置灰,禁止再次提交訂單
  • 用戶惡意行為)采用令牌機制,用戶每次進入結算頁,提單系統會頒發一個令牌ID(全局唯一),當用戶點擊“提交訂單”按鈕時發起的網絡請求中會帶上這個令牌ID,這個時候提單系統會優先進行令牌ID驗證,令牌ID存在&令牌ID訪問次數=1的話才會放行處理后續邏輯,否則直接返回
  • 提單系統重試)這種情況則需要后端系統(比如庫存系統)來保證接口的冪等性,每次調用庫存系統時均帶上訂單號,庫存系統會基于訂單號增加一個分布式事務鎖,偽代碼如下:
    1. int ret=redis.incr(orderId); 
    2. redis.expire(orderId,5,TimeUnit.MINUTES); 
    3. if(ret==1){ 
    4.     //添加成功,說明之前沒有處理過這個訂單號或者5分鐘之前處理過了 
    5.     boolean alreadySuccess=alreadySuccessDoOrder(orderProductRequest); 
    6.     if(!alreadySuccess){ 
    7.         doOrder(orderProductRequest); 
    8.     }else{ 
    9.         return "操作失敗,原因:重復提交"; 
    10.     } 
    11. }else{ 
    12.     return "操作失敗,原因:重復提交"; 

庫存數據的回滾機制如何做

需要庫存回滾的場景也是比較多的,比如:

  • 用戶未支付)用戶下單后后悔了
  • 用戶支付后取消)用戶下單&支付后后悔了
  • 風控取消)風控識別到異常行為,強制取消訂單
  • (耦合系統故障)比如提交訂單時提單系統T1同時會調用積分扣減系統X1、庫存扣減系統X2、優惠券系統X3,假如X1,X2成功后,調用X3失敗,需要回滾用戶積分與商家庫存。

其中場景1,2,3比較類似,都會造成訂單取消,訂單中心取消后會發送mq出來,各個系統保證自己能夠正確消費訂單取消MQ即可。而場景4訂單其實尚未生成,相對來說要復雜些,如上面提到的,提單系統T1需要主動發起庫存系統X2、優惠券系統X3的回滾請求(入參必須帶上訂單號),X2、X3回滾接口需要支持冪等性。

其實針對場景4,還存在一種極端情況,如果提單系統T1準備回滾時自身也宕機了,那么庫存系統X2、優惠券系統X3就必須依靠自己為完成回滾操作了,也就是說具備自我數據健康檢查的能力,具體來說怎么實現呢?

可以利用當前訂單號所屬的訂單尚未生成的特點,可以通過worker機制,每次撈取40分鐘(這里的40一定要大于容忍用戶的支付時間)前的訂單,調用訂單中心查詢訂單的狀態,確保不是已取消的,否則進行自我數據的回滾。

多人同時購買1件商品,如何安全地庫存扣減

現實中同一件商品可能會出現多人同時購買的情況,我們可以如何做到并發安全呢?

偽代碼片段1:

  1. synchronized(this){ 
  2.     long stockNum = getProductStockNum(productId); 
  3.     if(stockNum>requestBuyNum)  { 
  4.       String sql=" update stock_main "
  5.                  " set stockNumstockNum=stockNum-"+requestBuyNum + 
  6.                  " where productId="+productId; 
  7.       int ret=updateSQL(sql); 
  8.         if(ret==1){ 
  9.             return "扣減成功"; 
  10.         }else { 
  11.             return "扣減失敗"; 
  12.         } 
  13.     } 
  14. }    

偽代碼片段1的設計思想是所有的請求過來之后首先加鎖,強制其串行化處理,可見其效率一定不高,

偽代碼片段2:

  1. String sql=" update stock_main "
  2.            " set stockNumstockNum=stockNum-"+requestBuyNum + 
  3.            " where productId="+productId+ 
  4.            " and stockNum>="+requestBuyNum; 
  5. int ret=updateSQL(sql); 
  6. if(ret==1){ 
  7.    return "扣減成功"; 
  8. }else { 
  9.    return "扣減失敗"; 

這段代碼只是在where條件里增加了and stockNum>="+requestBuyNum即可防止超賣的行為,達到了與上述偽代碼1的功能

如果商品是促銷品(比如參與了秒殺的商品)并發扣減的機率會更高,那么數據庫的壓力會更高,這個時候還可以怎么做呢

海量的用戶秒殺請求,本質上是一個排序,先到先得.但是如此之多的請求,注定了有些人是搶不到的,可以在進入上述偽代碼Dao層之前增加一個計數器進行控制,比如有50%的流量將直接告訴其搶購失敗,偽代碼如下:

  1. public class SeckillServiceImpl{ 
  2.     private long count=0
  3.      
  4.     public BuyResult buy(User user,int productId,int productNum){ 
  5.         count++; 
  6.         if(count%2=1){ 
  7.             Thread.sleep(1000); 
  8.             return new BuyResult("搶購失敗"); 
  9.         }else{ 
  10.             return doBuy(user,productId,productNum); 
  11.         } 
  12.     } 

另外同一個用戶,不允許多次搶購同一件商品,我們又該如何做呢

  1. public String doBuy(user,productId,productNum){ 
  2.     //用戶除了***次進入值為1,其它時候均大于1 
  3.     int tmp=redis.incr(user.getUid()+productId);  
  4.     if(tmp==1){ 
  5.         //1小時后key自動銷毀 
  6.         redis.expire(user.getUid()+productId,3600);  
  7.         return doBuy1(user,productId,productNum); 
  8.     }else{ 
  9.         return new BuyResult("搶購失敗"); 
  10.     } 

如果同一個用戶擁有不同的帳號,來搶購同一件商品,上面的策略就失效了。

一些公司在發展早期幾乎是沒有限制的,很容易就可以注冊很多個賬號。也即是網絡所謂的“僵尸賬號”,數量龐大,如果我們使用幾萬個“僵尸號”去混進去搶購,這樣就可以大大提升我們中獎的概率,那我們如何應對呢?

  1. public String doBuy1(user,productId,productNum){ 
  2.     String minuteKey=DateTimeUtil.getDateTimeStr("yyyyMMddHHmm"); 
  3.     String minuteIpCount=redis.incr(minuteKey+user.getClientIp()); 
  4.  
  5.     // threshold為允許每分鐘允許單個ip的***訪問次數 
  6.     if(minuteIpCount>threshold){ 
  7.         //識別到這部分潛在風險用戶時,會讓這部分用戶強制跳轉到驗證碼頁面進行校驗 
  8.         //校驗通過后才能繼續搶購商品 
  9.         return getAndSendVerificationCode(user); 
  10.     }else{ 
  11.         return doBuy2(user,productId,productNum); 
  12.     } 

另外將庫存系統的核心表結構設計提供出來供大家參考

庫存主表,命名規則:stock_center_00~99

庫存主表,命名規則:stock_center_00~99

庫存流水表,命名規則:stock_center_flow_00~99

庫存流水表,命名規則:stock_center_flow_00~99

庫存批量操作日志表,命名規則:batch_upload_log

庫存批量操作日志表,命名規則:batch_upload_log

【本文是51CTO專欄作者張開濤的原創文章,作者微信公眾號:開濤的博客( kaitao-1234567)】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2019-01-14 09:06:40

LBS定位系統架構

2019-08-30 12:30:25

京東到家訂單查詢數據存儲

2018-11-06 14:05:27

京東訂單派發架構

2018-12-20 06:04:02

京東到家訂單中心Elasticsear

2018-04-20 09:36:23

NettyWebSocket京東

2019-01-17 09:50:55

京東ES架構

2022-02-12 20:51:23

京東程序員代碼

2015-11-13 10:25:04

京東商品搜索架構

2023-03-09 09:31:58

架構設計vivo

2017-07-06 00:27:17

虛擬訂單中心京東數據

2019-01-02 14:55:54

MySQLES數據庫

2024-11-27 13:01:22

應用層領域層對接層

2023-07-05 08:00:52

MetrAuto系統架構

2022-02-14 08:13:33

刪庫MySQL備份

2014-05-19 10:08:36

IM系統架構設計

2021-03-18 14:34:34

達達集團京東云電商

2015-10-16 14:35:05

SaaSCRM架構設計

2013-05-27 10:58:28

Tumblr架構設計雅虎收購

2023-08-16 12:34:16

同步備份異步備份

2024-10-17 08:26:53

ELKmongodb方案
點贊
收藏

51CTO技術棧公眾號

久久神马影院| 999av小视频在线| 久久国产免费看| 日韩在线中文字| 91精品国产高清91久久久久久| www久久日com| www国产成人免费观看视频 深夜成人网| 日本高清久久天堂| 天堂网avav| 欧美理论电影在线精品| 欧美日韩国产乱码电影| 无码人妻少妇伦在线电影| 久草在线青青草| 国产精品中文欧美| 国产精品va在线| 男女免费视频网站| 日韩欧美中字| 亚洲欧美激情一区| 4438x全国最大成人| 欧美黑人疯狂性受xxxxx野外| 亚洲人亚洲人成电影网站色| 久草一区二区| www.超碰在线.com| 奇米888四色在线精品| 97精品欧美一区二区三区| 欧美性猛交xxxx乱大交少妇| 日本午夜精品| 欧美va在线播放| 国产三级三级看三级| 国产高潮在线| 一区2区3区在线看| 一区二区三区四区五区精品 | 成人影院免费观看| 菠萝蜜视频在线观看一区| 成人免费激情视频| 成年人视频免费| 国产精品亚洲产品| 久久久久国产一区二区三区| 欧美日韩色视频| 区一区二视频| 亚洲图片欧美日产| 国产三级国产精品| 成人h动漫精品一区二区器材| 欧美日韩的一区二区| 蜜臀视频一区二区三区| 超碰国产一区| 欧美性jizz18性欧美| 99在线免费视频观看| 1769免费视频在线观看| 亚洲婷婷综合色高清在线| 亚洲va久久久噜噜噜久久狠狠 | 福利网在线观看| 午夜在线播放| 中文字幕免费不卡在线| 视频一区三区| 在线视频自拍| 国产精品乱人伦| 一区二区日本伦理| 成人在线免费看片| 自拍偷拍欧美激情| 天天做天天躁天天躁| 亚洲性图自拍| 午夜久久电影网| 久色视频在线播放| 毛片无码国产| 欧洲人成人精品| 亚洲免费999| 国产高清亚洲| 精品国产乱码久久久久久蜜臀| 精品人妻无码中文字幕18禁| а√中文在线天堂精品| 亚洲国产免费av| 朝桐光av一区二区三区| 香蕉视频一区| 在线精品播放av| 欧美老熟妇一区二区三区| 欧美激情1区2区| 97精品国产91久久久久久| 亚洲永久精品在线观看| 日韩黄色小视频| 国产va免费精品高清在线| 在线观看中文字幕码| 狠狠色伊人亚洲综合成人| 91精品综合久久| 深爱激情五月婷婷| 欧美国产1区2区| 国产免费xxx| 美女搞黄视频在线观看| 欧洲精品一区二区| 免费欧美一级片| 青青操综合网| 久久精品99久久香蕉国产色戒| 免费无码毛片一区二区app| 性一交一乱一区二区洋洋av| 国产精品美女无圣光视频| 精品毛片在线观看| 久久亚洲私人国产精品va媚药| 亚洲女人毛片| 国产乱码午夜在线视频| 色狠狠一区二区三区| 国产18无套直看片| 在线观看三级网站| 国产精品在线看| 亚洲精品suv精品一区二区| 成人欧美一区二区三区| 久久99精品久久久久| 色妞ww精品视频7777| 国产又黄又大久久| 久久伦理网站| 麻豆影视国产在线观看| 偷拍一区二区三区| 亚洲怡红院在线| 欧美电影在线观看完整版| 中文字幕成人在线| 日韩精品在线免费视频| 精品一区二区三区在线观看| 欧美大香线蕉线伊人久久| 国产欧美黑人| 在线观看精品一区| 男男做爰猛烈叫床爽爽小说| 中文字幕日韩欧美精品高清在线| 欧洲成人免费aa| a天堂在线视频| 国产精品视频一二三区| 国产精品无码av在线播放| 国产日韩欧美中文在线| 中文字幕在线成人| 草莓视频18免费观看| 成人毛片在线观看| 免费看黄色a级片| 婷婷激情成人| 色一情一乱一区二区| 一级成人黄色片| eeuss影院一区二区三区| 超碰人人爱人人| 国产情侣一区在线| 日韩专区中文字幕| 最近国语视频在线观看免费播放| aa级大片欧美| av女优在线播放| 日韩高清在线观看一区二区| 日韩最新免费不卡| 在线免费观看视频网站| 国产拍揄自揄精品视频麻豆| 国产成人无码av在线播放dvd| 国产精品xxx在线观看| 欧美俄罗斯乱妇| 亚洲精品成人区在线观看| 亚洲黄一区二区三区| 日本高清一区二区视频| 99久久久久| 91精品久久久久久久久| 求av网址在线观看| 欧美三级电影在线看| 欧美激情aaa| 丝袜美腿亚洲综合| 日本欧美色综合网站免费| 新片速递亚洲合集欧美合集| 亚洲视频在线观看| 老熟妇一区二区三区啪啪| 欧美高清在线一区| av亚洲天堂网| 亚洲一区二区日韩| 成人午夜电影免费在线观看| av影视在线看| 亚洲精品视频网上网址在线观看| 欧美 日韩 精品| 久久久综合精品| 九热视频在线观看| 天天做综合网| av观看久久| 漫画在线观看av| 亚洲欧洲视频在线| 亚洲视频一区二区三区四区| 亚洲精品乱码久久久久久| 911亚洲精选| 久久精品天堂| 国产系列第一页| 电影一区二区在线观看| 欧美在线一区二区视频| jizz在线观看中文| 日韩一区二区三免费高清| 国产女同在线观看| 中文一区二区完整视频在线观看| 久久精品视频在线观看免费| 在线播放精品| 日韩片电影在线免费观看| 伊人久久精品| 国外成人免费在线播放| 国产色a在线| 日韩欧美高清一区| 黄色片网站在线免费观看| 一区二区中文字幕在线| 中国极品少妇xxxx| 蜜臀久久99精品久久久久久9| 992tv成人免费观看| 午夜精品福利影院| 91九色国产社区在线观看| 少妇视频一区| 久久久91精品国产一区不卡| 五月婷婷深深爱| 欧美伦理视频网站| 特级做a爱片免费69| 中文字幕综合网| 中文字幕一二三四区| 国产麻豆91精品| 九色porny91| 在线成人亚洲| 在线综合视频网站| 亚洲最好看的视频| 国产91社区| 日本a人精品| 青青久久av北条麻妃海外网| 在线观看wwwxxxx| 伊人激情综合网| 少妇av一区二区| 91麻豆精品国产91久久久久久久久| 亚洲 欧美 日韩 综合| 亚洲欧美电影院| 久久久久久久久福利| 不卡的av电影在线观看| 日韩久久久久久久久久久| 日本视频在线一区| 欧美 日本 亚洲| 精品电影一区| 伊人网在线免费| 久久视频国产| 天堂社区 天堂综合网 天堂资源最新版 | 国产激情一区二区三区四区| 欧美综合在线观看视频| 99热精品在线| 国产精品入口芒果| 欧美网站在线| 午夜久久久久久久久久久| 亚洲xxx拳头交| 一区二区三区电影| 93在线视频精品免费观看| 日本一区二区在线| 亚洲尤物av| 久久伦理网站| 在线一级成人| 欧美一二三四五区| 国产一区二区电影在线观看| 欧美连裤袜在线视频| 清纯唯美亚洲经典中文字幕| 国产一区二区高清视频| 成人涩涩网站| 好吊色欧美一区二区三区四区| 99re8这里有精品热视频免费| 97se亚洲综合在线| 亚洲国产中文在线| 国产福利久久精品| 精品国产一区二区三区不卡蜜臂| 国产视频一区二区不卡| 久久99偷拍| 欧美日韩电影一区二区| 国产成人一区| 一本一道久久久a久久久精品91| 久久免费精品视频在这里| 在线观看成人免费| 欧美黄色精品| 国产精品沙发午睡系列| 母乳一区在线观看| 午夜在线观看av| 精品制服美女丁香| 女同性αv亚洲女同志| 国产91精品欧美| 国产精品无码电影| 国产视频视频一区| 亚洲一级二级片| 一区二区久久久久| 1级黄色大片儿| 欧美系列在线观看| 国产99999| 亚洲白虎美女被爆操| 精品影院一区| www.欧美免费| 国产欧洲在线| 国产精品美女午夜av| 精品久久久久久久久久岛国gif| 国产精品传媒毛片三区| 欧美热在线视频精品999| 亚洲成人av动漫| 欧美视频一区| 久久国产色av免费观看| 国产一区视频在线看| 中文字幕乱码在线| 欧美国产精品久久| 国产一卡二卡在线播放| 日本韩国精品在线| av中文字幕免费在线观看| 日韩av在线看| 岛国成人毛片| 日本免费一区二区三区视频观看| 国产精品蜜月aⅴ在线| 国产精品成人一区二区三区| 精品免费视频| 日韩一区二区高清视频| 丝袜a∨在线一区二区三区不卡| 国产在线视频三区| 久久精品人人做人人爽人人| 欧美三根一起进三p| 欧洲精品在线观看| 色丁香婷婷综合久久| 精品国内自产拍在线观看| 国产传媒在线观看| 91福利视频导航| 国产亚洲精品美女久久久久久久久久| 国产经典久久久| 葵司免费一区二区三区四区五区| 在线观看欧美一区二区| 日本一区二区三区免费乱视频| 国产在线拍揄自揄拍| 欧美日韩国产三级| 欧洲一区av| 欧美精品videofree1080p| 亚洲精品69| 日韩资源av在线| 亚洲高清久久| 精品人妻一区二区三| 国产精品久久久久影院| 自拍偷拍18p| 亚洲精品国产精品国自产观看浪潮| 久操视频在线| 国产精品直播网红| 国产一区二区三区不卡视频网站| 婷婷五月综合缴情在线视频| 国产乱对白刺激视频不卡| 天天操天天摸天天舔| 欧美在线|欧美| 男生女生差差差的视频在线观看| 久久久这里只有精品视频| 日韩欧美久久| 影音先锋男人的网站| 精品在线播放免费| 欧美巨胸大乳hitomi| 在线观看欧美精品| 精品视频三区| 国产精品jizz在线观看麻豆| 天天操综合520| 中文字幕日本最新乱码视频| 91在线你懂得| 国产精品人人人人| 亚洲美女激情视频| 最近在线中文字幕| 欧美激情第六页| 亚洲一区观看| 成年人网站免费看| 色婷婷亚洲综合| 国产精品麻豆一区二区三区| 国产精品国产三级国产aⅴ浪潮 | 在线能看的av网址| 免费电影一区| 久久婷婷影院| 天天舔天天操天天干| 欧美高清hd18日本| 日本中文字幕中出在线| 国产伦精品一区二区三区视频孕妇 | 人与动物性xxxx| 777xxx欧美| 亚洲婷婷噜噜| 精品乱子伦一区二区三区| 午夜影院日韩| 极品尤物一区二区| 91精品国产福利| 久久久123| 久久狠狠久久综合桃花| 日本欧美韩国一区三区| 亚洲区一区二区三| 亚洲白虎美女被爆操| 欧美xxx网站| 亚洲欧洲日韩综合二区| 国产自产2019最新不卡| 亚洲国产综合久久| 亚洲女成人图区| 9999精品视频| 你懂的av在线| 国产精品久久夜| 精品人妻无码一区二区| 欧美一级免费视频| 成人精品影视| 国产成人精品一区二区三区在线观看| 亚洲成人激情综合网| 国产精品四虎| 成人欧美一区二区三区黑人免费| 国产情侣一区| 久久久精品少妇| 日韩精品在线影院| 91精品国产自产观看在线| 国产97在线 | 亚洲| 国产精品视频线看| 狠狠综合久久av一区二区| 国产精国产精品| 国一区二区在线观看| 精品人妻中文无码av在线| 日韩精品一区二| 成人福利片在线| 无码专区aaaaaa免费视频| 国产精品天干天干在线综合| 色噜噜在线播放|