www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]來自:冰河技術(shù)? ? ?? 前言 很多小伙伴反饋說,高并發(fā)專題學(xué)了那么久,但是,在真正做項(xiàng)目時(shí),仍然不知道如何下手處理高并發(fā)業(yè)務(wù)場景!甚至很多小伙伴仍然停留在只是簡單的提供接口(CRUD)階段,不知道學(xué)習(xí)的并發(fā)知識(shí)如何運(yùn)用到實(shí)際項(xiàng)目中,就更別提如何構(gòu)建

【高并發(fā)】高并發(fā)秒殺系統(tǒng)架構(gòu)解密,不是所有的秒殺都是秒殺!

來自:冰河技術(shù)      

前言

很多小伙伴反饋說,高并發(fā)專題學(xué)了那么久,但是,在真正做項(xiàng)目時(shí),仍然不知道如何下手處理高并發(fā)業(yè)務(wù)場景!甚至很多小伙伴仍然停留在只是簡單的提供接口(CRUD)階段,不知道學(xué)習(xí)的并發(fā)知識(shí)如何運(yùn)用到實(shí)際項(xiàng)目中,就更別提如何構(gòu)建高并發(fā)系統(tǒng)了!

究竟什么樣的系統(tǒng)算是高并發(fā)系統(tǒng)?今天,我們就一起解密高并發(fā)業(yè)務(wù)場景下典型的秒殺系統(tǒng)的架構(gòu),結(jié)合高并發(fā)專題下的其他文章,學(xué)以致用。

電商系統(tǒng)架構(gòu)

在電商領(lǐng)域,存在著典型的秒殺業(yè)務(wù)場景,那何謂秒殺場景呢。簡單的來說就是一件商品的購買人數(shù)遠(yuǎn)遠(yuǎn)大于這件商品的庫存,而且這件商品在很短的時(shí)間內(nèi)就會(huì)被搶購一空。比如每年的618、雙11大促,小米新品促銷等業(yè)務(wù)場景,就是典型的秒殺業(yè)務(wù)場景。

我們可以將電商系統(tǒng)的架構(gòu)簡化成下圖所示。

【高并發(fā)】高并發(fā)秒殺系統(tǒng)架構(gòu)解密,不是所有的秒殺都是秒殺!

由圖所示,我們可以簡單的將電商系統(tǒng)的核心層分為:負(fù)載均衡層、應(yīng)用層和持久層。接下來,我們就預(yù)估下每一層的并發(fā)量。

  • 假如負(fù)載均衡層使用的是高性能的Nginx,則我們可以預(yù)估Nginx最大的并發(fā)度為:10W+,這里是以萬為單位。

  • 假設(shè)應(yīng)用層我們使用的是Tomcat,而Tomcat的最大并發(fā)度可以預(yù)估為800左右,這里是以百為單位。

  • 假設(shè)持久層的緩存使用的是Redis,數(shù)據(jù)庫使用的是MySQL,MySQL的最大并發(fā)度可以預(yù)估為1000左右,以千為單位。Redis的最大并發(fā)度可以預(yù)估為5W左右,以萬為單位。

所以,負(fù)載均衡層、應(yīng)用層和持久層各自的并發(fā)度是不同的,那么,為了提升系統(tǒng)的總體并發(fā)度和緩存,我們通??梢圆扇∧男┓桨改兀?/p>

(1)系統(tǒng)擴(kuò)容

系統(tǒng)擴(kuò)容包括垂直擴(kuò)容和水平擴(kuò)容,增加設(shè)備和機(jī)器配置,絕大多數(shù)的場景有效。

(2)緩存

本地緩存或者集中式緩存,減少網(wǎng)絡(luò)IO,基于內(nèi)存讀取數(shù)據(jù)。大部分場景有效。

(3)讀寫分離

采用讀寫分離,分而治之,增加機(jī)器的并行處理能力。

秒殺系統(tǒng)的特點(diǎn)

對于秒殺系統(tǒng)來說,我們可以從業(yè)務(wù)和技術(shù)兩個(gè)角度來闡述其自身存在的一些特點(diǎn)。

秒殺系統(tǒng)的業(yè)務(wù)特點(diǎn)

這里,我們可以使用12306網(wǎng)站來舉例,每年春運(yùn)時(shí),12306網(wǎng)站的訪問量是非常大的,但是網(wǎng)站平時(shí)的訪問量卻是比較平緩的,也就是說,每年春運(yùn)時(shí)節(jié),12306網(wǎng)站的訪問量會(huì)出現(xiàn)瞬時(shí)突增的現(xiàn)象。

再比如,小米秒殺系統(tǒng),在上午10點(diǎn)開售商品,10點(diǎn)前的訪問量比較平緩,10點(diǎn)時(shí)同樣會(huì)出現(xiàn)并發(fā)量瞬時(shí)突增的現(xiàn)象。

所以,秒殺系統(tǒng)的流量和并發(fā)量我們可以使用下圖來表示。

【高并發(fā)】高并發(fā)秒殺系統(tǒng)架構(gòu)解密,不是所有的秒殺都是秒殺!

由圖可以看出,秒殺系統(tǒng)的并發(fā)量存在瞬時(shí)凸峰的特點(diǎn),也叫做流量突刺現(xiàn)象。

我們可以將秒殺系統(tǒng)的特點(diǎn)總結(jié)如下。

【高并發(fā)】高并發(fā)秒殺系統(tǒng)架構(gòu)解密,不是所有的秒殺都是秒殺!

(1)限時(shí)、限量、限價(jià)

在規(guī)定的時(shí)間內(nèi)進(jìn)行;秒殺活動(dòng)中商品的數(shù)量有限;商品的價(jià)格會(huì)遠(yuǎn)遠(yuǎn)低于原來的價(jià)格,也就是說,在秒殺活動(dòng)中,商品會(huì)以遠(yuǎn)遠(yuǎn)低于原來的價(jià)格出售。

例如,秒殺活動(dòng)的時(shí)間僅限于某天上午10點(diǎn)到10點(diǎn)半,商品數(shù)量只有10萬件,售完為止,而且商品的價(jià)格非常低,例如:1元購等業(yè)務(wù)場景。

限時(shí)、限量和限價(jià)可以單獨(dú)存在,也可以組合存在。

(2)活動(dòng)預(yù)熱

需要提前配置活動(dòng);活動(dòng)還未開始時(shí),用戶可以查看活動(dòng)的相關(guān)信息;秒殺活動(dòng)開始前,對活動(dòng)進(jìn)行大力宣傳。

(3)持續(xù)時(shí)間短

購買的人數(shù)數(shù)量龐大;商品會(huì)迅速售完。

在系統(tǒng)流量呈現(xiàn)上,就會(huì)出現(xiàn)一個(gè)突刺現(xiàn)象,此時(shí)的并發(fā)訪問量是非常高的,大部分秒殺場景下,商品會(huì)在極短的時(shí)間內(nèi)售完。

秒殺系統(tǒng)的技術(shù)特點(diǎn)

我們可以將秒殺系統(tǒng)的技術(shù)特點(diǎn)總結(jié)如下。

【高并發(fā)】高并發(fā)秒殺系統(tǒng)架構(gòu)解密,不是所有的秒殺都是秒殺!

(1)瞬時(shí)并發(fā)量非常高

大量用戶會(huì)在同一時(shí)間搶購商品;瞬間并發(fā)峰值非常高。

(2)讀多寫少

系統(tǒng)中商品頁的訪問量巨大;商品的可購買數(shù)量非常少;庫存的查詢訪問數(shù)量遠(yuǎn)遠(yuǎn)大于商品的購買數(shù)量。

在商品頁中往往會(huì)加入一些限流措施,例如早期的秒殺系統(tǒng)商品頁會(huì)加入驗(yàn)證碼來平滑前端對系統(tǒng)的訪問流量,近期的秒殺系統(tǒng)商品詳情頁會(huì)在用戶打開頁面時(shí),提示用戶登錄系統(tǒng)。這都是對系統(tǒng)的訪問進(jìn)行限流的一些措施。

(3)流程簡單

秒殺系統(tǒng)的業(yè)務(wù)流程一般比較簡單;總體上來說,秒殺系統(tǒng)的業(yè)務(wù)流程可以概括為:下單減庫存。

針對這種短時(shí)間內(nèi)大流量的系統(tǒng)來說,就不太適合使用系統(tǒng)擴(kuò)容了,因?yàn)榧词瓜到y(tǒng)擴(kuò)容了,也就是在很短的時(shí)間內(nèi)會(huì)使用到擴(kuò)容后的系統(tǒng),大部分時(shí)間內(nèi),系統(tǒng)無需擴(kuò)容即可正常訪問。那么,我們可以采取哪些方案來提升系統(tǒng)的秒殺性能呢?

秒殺系統(tǒng)方案

針對秒殺系統(tǒng)的特點(diǎn),我們可以采取如下的措施來提升系統(tǒng)的性能。

【高并發(fā)】高并發(fā)秒殺系統(tǒng)架構(gòu)解密,不是所有的秒殺都是秒殺!

(1)異步解耦

將整體流程進(jìn)行拆解,核心流程通過隊(duì)列方式進(jìn)行控制。

(2)限流防刷

控制網(wǎng)站整體流量,提高請求的門檻,避免系統(tǒng)資源耗盡。

(3)資源控制

將整體流程中的資源調(diào)度進(jìn)行控制,揚(yáng)長避短。

由于應(yīng)用層能夠承載的并發(fā)量比緩存的并發(fā)量少很多。所以,在高并發(fā)系統(tǒng)中,我們可以直接使用OpenResty由負(fù)載均衡層訪問緩存,避免了調(diào)用應(yīng)用層的性能損耗。大家可以到https://openresty.org/cn/來了解有關(guān)OpenResty更多的知識(shí)。同時(shí),由于秒殺系統(tǒng)中,商品數(shù)量比較少,我們也可以使用動(dòng)態(tài)渲染技術(shù),CDN技術(shù)來加速網(wǎng)站的訪問性能。

如果在秒殺活動(dòng)開始時(shí),并發(fā)量太高時(shí),我們可以將用戶的請求放入隊(duì)列中進(jìn)行處理,并為用戶彈出排隊(duì)頁面。

【高并發(fā)】高并發(fā)秒殺系統(tǒng)架構(gòu)解密,不是所有的秒殺都是秒殺!

秒殺系統(tǒng)時(shí)序圖

網(wǎng)上很多的秒殺系統(tǒng)和對秒殺系統(tǒng)的解決方案,并不是真正的秒殺系統(tǒng),他們采用的只是同步處理請求的方案,一旦并發(fā)量真的上來了,他們所謂的秒殺系統(tǒng)的性能會(huì)急劇下降。我們先來看一下秒殺系統(tǒng)在同步下單時(shí)的時(shí)序圖。

同步下單流程

【高并發(fā)】高并發(fā)秒殺系統(tǒng)架構(gòu)解密,不是所有的秒殺都是秒殺!

1.用戶發(fā)起秒殺請求

在同步下單流程中,首先,用戶發(fā)起秒殺請求。商城服務(wù)需要依次執(zhí)行如下流程來處理秒殺請求的業(yè)務(wù)。

(1)識(shí)別驗(yàn)證碼是否正確

商城服務(wù)判斷用戶發(fā)起秒殺請求時(shí)提交的驗(yàn)證碼是否正確。

(2)判斷活動(dòng)是否已經(jīng)結(jié)束

驗(yàn)證當(dāng)前秒殺活動(dòng)是否已經(jīng)結(jié)束。

(3)驗(yàn)證訪問請求是否處于黑名單

在電商領(lǐng)域中,存在著很多的惡意競爭,也就是說,其他商家可能會(huì)通過不正當(dāng)手段來惡意請求秒殺系統(tǒng),占用系統(tǒng)大量的帶寬和其他系統(tǒng)資源。此時(shí),就需要使用風(fēng)控系統(tǒng)等實(shí)現(xiàn)黑名單機(jī)制。為了簡單,也可以使用攔截器統(tǒng)計(jì)訪問頻次實(shí)現(xiàn)黑名單機(jī)制。

(4)驗(yàn)證真實(shí)庫存是否足夠

系統(tǒng)需要驗(yàn)證商品的真實(shí)庫存是否足夠,是否能夠支持本次秒殺活動(dòng)的商品庫存量。

(5)扣減緩存中的庫存

在秒殺業(yè)務(wù)中,往往會(huì)將商品庫存等信息存放在緩存中,此時(shí),還需要驗(yàn)證秒殺活動(dòng)使用的商品庫存是否足夠,并且需要扣減秒殺活動(dòng)的商品庫存數(shù)量。

(6)計(jì)算秒殺的價(jià)格

由于在秒殺活動(dòng)中,商品的秒殺價(jià)格和商品的真實(shí)價(jià)格存在差異,所以,需要計(jì)算商品的秒殺價(jià)格。

注意:如果在秒殺場景中,系統(tǒng)涉及的業(yè)務(wù)更加復(fù)雜的話,會(huì)涉及更多的業(yè)務(wù)操作,這里,我只是列舉出一些常見的業(yè)務(wù)操作。

2.提交訂單

(1)訂單入口

將用戶提交的訂單信息保存到數(shù)據(jù)庫中。

(2)扣減真實(shí)庫存

訂單入庫后,需要在商品的真實(shí)庫存中將本次成功下單的商品數(shù)量扣除。

如果我們使用上述流程開發(fā)了一個(gè)秒殺系統(tǒng),當(dāng)用戶發(fā)起秒殺請求時(shí),由于系統(tǒng)每個(gè)業(yè)務(wù)流程都是串行執(zhí)行的,整體上系統(tǒng)的性能不會(huì)太高,當(dāng)并發(fā)量太高時(shí),我們會(huì)為用戶彈出下面的排隊(duì)頁面,來提示用戶進(jìn)行等待。

【高并發(fā)】高并發(fā)秒殺系統(tǒng)架構(gòu)解密,不是所有的秒殺都是秒殺!

此時(shí)的排隊(duì)時(shí)間可能是15秒,也可能是30秒,甚至是更長時(shí)間。這就存在一個(gè)問題:在用戶發(fā)起秒殺請求到服務(wù)器返回結(jié)果的這段時(shí)間內(nèi),客戶端和服務(wù)器之間的連接不會(huì)被釋放,這就會(huì)占大量占用服務(wù)器的資源。

網(wǎng)上很多介紹如何實(shí)現(xiàn)秒殺系統(tǒng)的文章都是采用的這種方式,那么,這種方式能做秒殺系統(tǒng)嗎?答案是可以做,但是這種方式支撐的并發(fā)量并不是太高。此時(shí),有些網(wǎng)友可能會(huì)問:我們公司就是這樣做的秒殺系統(tǒng)??!上線后一直在用,沒啥問題??!我想說的是:使用同步下單方式確實(shí)可以做秒殺系統(tǒng),但是同步下單的性能不會(huì)太高。之所以你們公司采用同步下單的方式做秒殺系統(tǒng)沒出現(xiàn)大的問題,那是因?yàn)槟銈兊拿霘⑾到y(tǒng)的并發(fā)量沒達(dá)到一定的量級,也就是說,你們的秒殺系統(tǒng)的并發(fā)量其實(shí)并不高。

所以,很多所謂的秒殺系統(tǒng),存在著秒殺的業(yè)務(wù),但是稱不上真正的秒殺系統(tǒng),原因就在于他們使用的是同步的下單流程,限制了系統(tǒng)的并發(fā)流量。之所以上線后沒出現(xiàn)太大的問題,是因?yàn)橄到y(tǒng)的并發(fā)量不高,不足以壓死整個(gè)系統(tǒng)。

如果12306、淘寶、天貓、京東、小米等大型商城的秒殺系統(tǒng)是這么玩的話,那么,他們的系統(tǒng)遲早會(huì)被玩死,他們的系統(tǒng)工程師不被開除才怪!所以,在秒殺系統(tǒng)中,這種同步處理下單的業(yè)務(wù)流程的方案是不可取的。

以上就是同步下單的整個(gè)流程操作,如果下單流程更加復(fù)雜的話,就會(huì)涉及到更多的業(yè)務(wù)操作。

異步下單流程

既然同步下單流程的秒殺系統(tǒng)稱不上真正的秒殺系統(tǒng),那我們就需要采用異步的下單流程了。異步的下單流程不會(huì)限制系統(tǒng)的高并發(fā)流量。

【高并發(fā)】高并發(fā)秒殺系統(tǒng)架構(gòu)解密,不是所有的秒殺都是秒殺!

1.用戶發(fā)起秒殺請求

用戶發(fā)起秒殺請求后,商城服務(wù)會(huì)經(jīng)過如下業(yè)務(wù)流程。

(1)檢測驗(yàn)證碼是否正確

用戶發(fā)起秒殺請求時(shí),會(huì)將驗(yàn)證碼一同發(fā)送過來,系統(tǒng)會(huì)檢驗(yàn)驗(yàn)證碼是否有效,并且是否正確。

(2)是否限流

系統(tǒng)會(huì)對用戶的請求進(jìn)行是否限流的判斷,這里,我們可以通過判斷消息隊(duì)列的長度來進(jìn)行判斷。因?yàn)槲覀儗⒂脩舻恼埱蠓旁诹讼㈥?duì)列中,消息隊(duì)列中堆積的是用戶的請求,我們可以根據(jù)當(dāng)前消息隊(duì)列中存在的待處理的請求數(shù)量來判斷是否需要對用戶的請求進(jìn)行限流處理。

例如,在秒殺活動(dòng)中,我們出售1000件商品,此時(shí)在消息隊(duì)列中存在1000個(gè)請求,如果后續(xù)仍然有用戶發(fā)起秒殺請求,則后續(xù)的請求我們可以不再處理,直接向用戶返回商品已售完的提示。

【高并發(fā)】高并發(fā)秒殺系統(tǒng)架構(gòu)解密,不是所有的秒殺都是秒殺!

所以,使用限流后,我們可以更快的處理用戶的請求和釋放連接的資源。

(3)發(fā)送MQ

用戶的秒殺請求通過前面的驗(yàn)證后,我們就可以將用戶的請求參數(shù)等信息發(fā)送到MQ中進(jìn)行異步處理,同時(shí),向用戶響應(yīng)結(jié)果信息。在商城服務(wù)中,會(huì)有專門的異步任務(wù)處理模塊來消費(fèi)消息隊(duì)列中的請求,并處理后續(xù)的異步流程。

在用戶發(fā)起秒殺請求時(shí),異步下單流程比同步下單流程處理的業(yè)務(wù)操作更少,它將后續(xù)的操作通過MQ發(fā)送給異步處理模塊進(jìn)行處理,并迅速向用戶返回響應(yīng)結(jié)果,釋放請求連接。

2.異步處理

我們可以將下單流程的如下操作進(jìn)行異步處理。

(1)判斷活動(dòng)是否已經(jīng)結(jié)束

(2)判斷本次請求是否處于系統(tǒng)黑名單,為了防止電商領(lǐng)域同行的惡意競爭可以為系統(tǒng)增加黑名單機(jī)制,將惡意的請求放入系統(tǒng)的黑名單中??梢允褂脭r截器統(tǒng)計(jì)訪問頻次來實(shí)現(xiàn)。

(3)扣減緩存中的秒殺商品的庫存數(shù)量。

(4)生成秒殺Token,這個(gè)Token是綁定當(dāng)前用戶和當(dāng)前秒殺活動(dòng)的,只有生成了秒殺Token的請求才有資格進(jìn)行秒殺活動(dòng)。

這里我們引入了異步處理機(jī)制,在異步處理中,系統(tǒng)使用多少資源,分配多少線程來處理相應(yīng)的任務(wù),是可以進(jìn)行控制的。

3.短輪詢查詢秒殺結(jié)果

這里,可以采取客戶端短輪詢查詢是否獲得秒殺資格的方案。例如,客戶端可以每隔3秒鐘輪詢請求服務(wù)器,查詢是否獲得秒殺資格,這里,我們在服務(wù)器的處理就是判斷當(dāng)前用戶是否存在秒殺Token,如果服務(wù)器為當(dāng)前用戶生成了秒殺Token,則當(dāng)前用戶存在秒殺資格。否則繼續(xù)輪詢查詢,直到超時(shí)或者服務(wù)器返回商品已售完或者無秒殺資格等信息為止。

采用短輪詢查詢秒殺結(jié)果時(shí),在頁面上我們同樣可以提示用戶排隊(duì)處理中,但是此時(shí)客戶端會(huì)每隔幾秒輪詢服務(wù)器查詢秒殺資格的狀態(tài),相比于同步下單流程來說,無需長時(shí)間占用請求連接。

此時(shí),可能會(huì)有網(wǎng)友會(huì)問:采用短輪詢查詢的方式,會(huì)不會(huì)存在直到超時(shí)也查詢不到是否具有秒殺資格的狀態(tài)呢?答案是:有可能! 這里我們試想一下秒殺的真實(shí)場景,商家參加秒殺活動(dòng)本質(zhì)上不是為了賺錢,而是提升商品的銷量和商家的知名度,吸引更多的用戶來買自己的商品。所以,我們不必保證用戶能夠100%的查詢到是否具有秒殺資格的狀態(tài)。

4.秒殺結(jié)算

(1)驗(yàn)證下單Token

客戶端提交秒殺結(jié)算時(shí),會(huì)將秒殺Token一同提交到服務(wù)器,商城服務(wù)會(huì)驗(yàn)證當(dāng)前的秒殺Token是否有效。

(2)加入秒殺購物車

商城服務(wù)在驗(yàn)證秒殺Token合法并有效后,會(huì)將用戶秒殺的商品添加到秒殺購物車。

5.提交訂單

(1)訂單入庫

將用戶提交的訂單信息保存到數(shù)據(jù)庫中。

(2)刪除Token

秒殺商品訂單入庫成功后,刪除秒殺Token。

這里大家可以思考一個(gè)問題:我們?yōu)槭裁粗辉诋惒较聠瘟鞒痰姆凵糠植捎卯惒教幚恚鴽]有在其他部分采取異步削峰和填谷的措施呢?

這是因?yàn)樵诋惒较聠瘟鞒痰脑O(shè)計(jì)中,無論是在產(chǎn)品設(shè)計(jì)上還是在接口設(shè)計(jì)上,我們在用戶發(fā)起秒殺請求階段對用戶的請求進(jìn)行了限流操作,可以說,系統(tǒng)的限流操作是非常前置的。在用戶發(fā)起秒殺請求時(shí)進(jìn)行了限流,系統(tǒng)的高峰流量已經(jīng)被平滑解決了,再往后走,其實(shí)系統(tǒng)的并發(fā)量和系統(tǒng)流量并不是非常高了。

所以,網(wǎng)上很多的文章和帖子中在介紹秒殺系統(tǒng)時(shí),說是在下單時(shí)使用異步削峰來進(jìn)行一些限流操作,那都是在扯淡!因?yàn)橄聠尾僮髟谡麄€(gè)秒殺系統(tǒng)的流程中屬于比較靠后的操作了,限流操作一定要前置處理,在秒殺業(yè)務(wù)后面的流程中做限流操作是沒啥卵用的。

高并發(fā)“黑科技”與致勝奇招

假設(shè),在秒殺系統(tǒng)中我們使用Redis實(shí)現(xiàn)緩存,假設(shè)Redis的讀寫并發(fā)量在5萬左右。我們的商城秒殺業(yè)務(wù)需要支持的并發(fā)量在100萬左右。如果這100萬的并發(fā)全部打入Redis中,Redis很可能就會(huì)掛掉,那么,我們?nèi)绾谓鉀Q這個(gè)問題呢?接下來,我們就一起來探討這個(gè)問題。

在高并發(fā)的秒殺系統(tǒng)中,如果采用Redis緩存數(shù)據(jù),則Redis緩存的并發(fā)處理能力是關(guān)鍵,因?yàn)楹芏嗟那熬Y操作都需要訪問Redis。而異步削峰只是基本的操作,關(guān)鍵還是要保證Redis的并發(fā)處理能力。

解決這個(gè)問題的關(guān)鍵思想就是:分而治之,將商品庫存分開放。

暗度陳倉

我們在Redis中存儲(chǔ)秒殺商品的庫存數(shù)量時(shí),可以將秒殺商品的庫存進(jìn)行“分割”存儲(chǔ)來提升Redis的讀寫并發(fā)量。

例如,原來的秒殺商品的id為10001,庫存為1000件,在Redis中的存儲(chǔ)為(10001, 1000),我們將原有的庫存分割為5份,則每份的庫存為200件,此時(shí),我們在Redia中存儲(chǔ)的信息為(10001_0, 200),(10001_1, 200),(10001_2, 200),(10001_3, 200),(10001_4, 200)。

【高并發(fā)】高并發(fā)秒殺系統(tǒng)架構(gòu)解密,不是所有的秒殺都是秒殺!

此時(shí),我們將庫存進(jìn)行分割后,每個(gè)分割后的庫存使用商品id加上一個(gè)數(shù)字標(biāo)識(shí)來存儲(chǔ),這樣,在對存儲(chǔ)商品庫存的每個(gè)Key進(jìn)行Hash運(yùn)算時(shí),得出的Hash結(jié)果是不同的,這就說明,存儲(chǔ)商品庫存的Key有很大概率不在Redis的同一個(gè)槽位中,這就能夠提升Redis處理請求的性能和并發(fā)量。

分割庫存后,我們還需要在Redis中存儲(chǔ)一份商品id和分割庫存后的Key的映射關(guān)系,此時(shí)映射關(guān)系的Key為商品的id,也就是10001,Value為分割庫存后存儲(chǔ)庫存信息的Key,也就是10001_0,10001_1,10001_2,10001_3,10001_4。在Redis中我們可以使用List來存儲(chǔ)這些值。

在真正處理庫存信息時(shí),我們可以先從Redis中查詢出秒殺商品對應(yīng)的分割庫存后的所有Key,同時(shí)使用AtomicLong來記錄當(dāng)前的請求數(shù)量,使用請求數(shù)量對從Redia中查詢出的秒殺商品對應(yīng)的分割庫存后的所有Key的長度進(jìn)行求模運(yùn)算,得出的結(jié)果為0,1,2,3,4。再在前面拼接上商品id就可以得出真正的庫存緩存的Key。此時(shí),就可以根據(jù)這個(gè)Key直接到Redis中獲取相應(yīng)的庫存信息。

移花接木

在高并發(fā)業(yè)務(wù)場景中,我們可以直接使用Lua腳本庫(OpenResty)從負(fù)載均衡層直接訪問緩存。

這里,我們思考一個(gè)場景:如果在秒殺業(yè)務(wù)場景中,秒殺的商品被瞬間搶購一空。此時(shí),用戶再發(fā)起秒殺請求時(shí),如果系統(tǒng)由負(fù)載均衡層請求應(yīng)用層的各個(gè)服務(wù),再由應(yīng)用層的各個(gè)服務(wù)訪問緩存和數(shù)據(jù)庫,其實(shí),本質(zhì)上已經(jīng)沒有任何意義了,因?yàn)樯唐芬呀?jīng)賣完了,再通過系統(tǒng)的應(yīng)用層進(jìn)行層層校驗(yàn)已經(jīng)沒有太多意義了??!而應(yīng)用層的并發(fā)訪問量是以百為單位的,這又在一定程度上會(huì)降低系統(tǒng)的并發(fā)度。

為了解決這個(gè)問題,此時(shí),我們可以在系統(tǒng)的負(fù)載均衡層取出用戶發(fā)送請求時(shí)攜帶的用戶id,商品id和秒殺活動(dòng)id等信息,直接通過Lua腳本等技術(shù)來訪問緩存中的庫存信息。如果秒殺商品的庫存小于或者等于0,則直接返回用戶商品已售完的提示信息,而不用再經(jīng)過應(yīng)用層的層層校驗(yàn)了。 針對這個(gè)架構(gòu),我們可以參見本文中的電商系統(tǒng)的架構(gòu)圖(正文開始的第一張圖)。

寫在最后

最后,附上并發(fā)編程需要掌握的核心技能知識(shí)圖,祝大家在學(xué)習(xí)并發(fā)編程時(shí),少走彎路。

【高并發(fā)】高并發(fā)秒殺系統(tǒng)架構(gòu)解密,不是所有的秒殺都是秒殺!

后記:

記?。?/span>你比別人強(qiáng)的地方,不是你做過多少年的CRUD工作,而是你比別人掌握了更多深入的技能。不要總停留在CRUD的表面工作,理解并掌握底層原理并熟悉源碼實(shí)現(xiàn),并形成自己的抽象思維能力,做到靈活運(yùn)用,才是你突破瓶頸,脫穎而出的重要方向!

你在刷抖音,玩游戲的時(shí)候,別人都在這里學(xué)習(xí),成長,提升,人與人最大的差距其實(shí)就是思維。你可能不信,優(yōu)秀的人,總是在一起。。

特別推薦一個(gè)分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長按關(guān)注一下:

【高并發(fā)】高并發(fā)秒殺系統(tǒng)架構(gòu)解密,不是所有的秒殺都是秒殺!

長按訂閱更多精彩▼

【高并發(fā)】高并發(fā)秒殺系統(tǒng)架構(gòu)解密,不是所有的秒殺都是秒殺!

如有收獲,點(diǎn)個(gè)在看,誠摯感謝

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉