數(shù)十年專注企業(yè)數(shù)字化轉(zhuǎn)型、智能化升級(jí)、企業(yè)上云解決方案服務(wù)商
工單提交 實(shí)名認(rèn)證 騰佑科技咨詢熱線咨詢熱線: 400-996-8756
百度云服務(wù)中心騰佑科技公司
云服務(wù)器活動(dòng) 服務(wù)器租用 服務(wù)器托管 機(jī)柜租賃 帶寬租賃
  • 最新資訊
  • 熱門資訊
  • 最熱資訊
智能建站

「開發(fā)」總結(jié)高并發(fā)秒殺系統(tǒng)

發(fā)布時(shí)間:2022-07-18 作者:admin

簡(jiǎn)述:大家也許開發(fā)過(guò)高并發(fā)的系統(tǒng)或者秒殺程序,但肯定都有接觸過(guò),像電商平臺(tái)的秒殺、搶購(gòu)等活動(dòng),還有12306春運(yùn)搶票。特點(diǎn):時(shí)間短流量多,需要注意外掛。所以要單獨(dú)提出秒殺系統(tǒng)。技術(shù)特點(diǎn):瞬時(shí)高并發(fā),多層次分布式處理,人機(jī)交互對(duì)抗一、系統(tǒng)環(huán)境搭建(

大家可能都開發(fā)過(guò)高并發(fā)系統(tǒng)或者秒殺程序,但是肯定都接觸過(guò),比如電商平臺(tái)的秒殺、搶購(gòu)等活動(dòng),以及12306春運(yùn)搶票。

特點(diǎn):時(shí)間短,流量大,需要注意插件。因此,應(yīng)單獨(dú)提出秒殺系統(tǒng)。

技術(shù)特點(diǎn):瞬時(shí)高并發(fā)、多層次分布式處理、人機(jī)交互對(duì)抗

一、系統(tǒng)環(huán)境建設(shè)

(1)技術(shù)選型

linux nginx php mysql redis(開源,免費(fèi))

CDN(分布式緩存),智能DNS(多線接入選擇)

負(fù)載均衡LVS,大型Web集群(分流節(jié)點(diǎn),實(shí)現(xiàn)高效穩(wěn)定)

(2)開發(fā)準(zhǔn)備

工具:Eclipseforphp或phpStorm或Editplus、Sublime

部署環(huán)境:XAMPP/brew/yum

代碼管理:Git/SVN

(3)Mysql封裝

PDO組件,常用的增刪改查

使用開源代碼Db、Crud代碼庫(kù)

(4)Redis封裝

(需要配置器的數(shù)據(jù)緩存)

PHP客戶端:phpredis/Predis

封裝基本的redis連接和命令資源

(5)debug封裝

定制日志和調(diào)試日志。學(xué)會(huì)事半功倍。

二、系統(tǒng)設(shè)計(jì)

(1)基本功能和流程

背景:活動(dòng)管理/商品管理/訂單管理/日志管理

前臺(tái):商品展示/秒殺/購(gòu)物車/我的訂單

安全:驗(yàn)證碼/問(wèn)答

(2)項(xiàng)目流程

秒殺——>問(wèn)答驗(yàn)證——>庫(kù)存驗(yàn)證——>生成訂單——>

(3)數(shù)據(jù)庫(kù)設(shè)計(jì)

活動(dòng)信息表、商品信息表、訂單信息表、問(wèn)答信息表、日志記錄表

(4)交互和頁(yè)面設(shè)計(jì)

背景:基本管理,列表增刪

前臺(tái):商品展示、搶購(gòu)、我的訂單、購(gòu)物車、登錄

安全:防攻擊、防作弊、防機(jī)器人。

三、「開發(fā)」總結(jié)高并發(fā)秒殺系統(tǒng):

活動(dòng)周期短,瞬時(shí)流量大(高并發(fā)),技術(shù)在這種情況下會(huì)發(fā)生和需要做的事情。

一是高并發(fā)

一方面,優(yōu)化程序,使程序性能最好,單次請(qǐng)求時(shí)間可從50點(diǎn)開始ms優(yōu)化到25ms,然后你可以在一秒鐘內(nèi)成功地響應(yīng)翻倍的請(qǐng)求。

另一方面,更重要的是增加服務(wù)器,使用更大的集群來(lái)處理用戶要求,并設(shè)計(jì)一個(gè)可靠和靈活的擴(kuò)展分布式方案。

第二:時(shí)間短

火熱的第二次殺戮活動(dòng)真的會(huì)在一秒鐘內(nèi)買到商品,而大多數(shù)用戶的感覺(jué)是,提交訂單的過(guò)程需要等待幾秒甚至十秒。當(dāng)然,更糟糕的是要求報(bào)錯(cuò)。

當(dāng)然,一個(gè)好的秒殺體驗(yàn)希望盡可能減少用戶的等待時(shí)間,準(zhǔn)確地提醒用戶目前是否有商品庫(kù)存。這些也需要優(yōu)秀的程序設(shè)計(jì)來(lái)保證。

三是系統(tǒng)容量估計(jì)

在設(shè)計(jì)系統(tǒng)時(shí),需要有一個(gè)容量估計(jì),即提前計(jì)算我們?cè)O(shè)計(jì)的系統(tǒng)應(yīng)該承載多少數(shù)量級(jí)。

如果在線前端服務(wù)器規(guī)格為8核16G提交訂單的內(nèi)存服務(wù)器需要100個(gè)處理程序ms,然后可以簡(jiǎn)單計(jì)算一下:

每秒可以處理的訂單請(qǐng)求數(shù)=1000ms/100ms*8=80qps

對(duì)于秒殺系統(tǒng)來(lái)說(shuō),上述結(jié)果肯定是非常不理想的。

如果能優(yōu)化處理程序,可以減少到10ms,然后就可以達(dá)到8000qps。

如果我們可以把程序繼續(xù)優(yōu)化,能快速區(qū)分開有庫(kù)存和無(wú)庫(kù)存處理,那么無(wú)庫(kù)存時(shí)處理就有可能做到1ms甚至更低的時(shí)間消耗。這樣,在沒(méi)有庫(kù)存的情況下,會(huì)更好,成千上萬(wàn)qps也可以實(shí)現(xiàn)。

以上估計(jì)都是針對(duì)單機(jī)的,那么簡(jiǎn)單的增加前端服務(wù)器就能有更好的并發(fā)處理量嗎?

因?yàn)閿?shù)據(jù)庫(kù)、緩存系統(tǒng)甚至機(jī)房網(wǎng)絡(luò)帶寬都不會(huì)那么簡(jiǎn)單。

于是就要有一個(gè)更好的分布式方案。

第四:好的分布式方案

一個(gè)好的分布式解決方案,當(dāng)然是穩(wěn)定可靠的,不要混亂,然后方便擴(kuò)展,當(dāng)然,最好的效果是增加服務(wù)器,并發(fā)處理量可以線性增長(zhǎng)1:1。

比如:?jiǎn)螜C(jī)qps是1k,10臺(tái)服務(wù)器可以做到10臺(tái)服務(wù)器w,100臺(tái)可以做到10w每秒。

要達(dá)到這樣的線性增長(zhǎng)效果,就要杜絕瓶頸,否則還是會(huì)太貴。

拒絕假分布式尤為重要。例如,前端服務(wù)器可以獨(dú)立存在,但它們都依賴于集中的數(shù)據(jù)庫(kù)或緩存系統(tǒng)。最后,集中的數(shù)據(jù)庫(kù)或緩存系統(tǒng)無(wú)法忍受,也無(wú)法實(shí)現(xiàn)良好的分布式。

第五:注意系統(tǒng)的瓶頸

先有幾個(gè)基本共識(shí),系統(tǒng)的處理速度

讀寫程序中的數(shù)據(jù)>redis>mysql>磁盤單機(jī)網(wǎng)絡(luò)請(qǐng)求>局域網(wǎng)請(qǐng)求>跨機(jī)房請(qǐng)求

當(dāng)我們優(yōu)化程序時(shí),使用最快的方法和最短的邏輯。

用redis替代mysql用程序中提交的數(shù)據(jù)代替訂單處理中依賴的數(shù)據(jù)redis商品庫(kù)存信息、用戶訂單信息等二次數(shù)據(jù)獲取。

在邏輯處理中,將快速、提前中斷的邏輯放在首位,如驗(yàn)證登錄、驗(yàn)證問(wèn)答等。

我們做分布式方案的時(shí)候,盡量把資源調(diào)用放在最近的地方。

前端服務(wù)器所依賴的數(shù)據(jù)應(yīng)盡可能在局域網(wǎng)中,如果可以在單機(jī)上閱讀redis當(dāng)然,服務(wù)更好,程序維護(hù)數(shù)據(jù)響應(yīng)會(huì)更復(fù)雜。

不要有跨機(jī)房網(wǎng)絡(luò)請(qǐng)求,不要有跨機(jī)房網(wǎng)絡(luò)請(qǐng)求,不要有跨機(jī)房網(wǎng)絡(luò)請(qǐng)求,重要的事情說(shuō)三遍。

第六:什么語(yǔ)言更適合這種系統(tǒng)?

在課程中使用PHP語(yǔ)言,開發(fā)這樣的系統(tǒng)也沒(méi)問(wèn)題。

當(dāng)然,就像使用一樣golang,ngx_lua它可能在高并發(fā)性和性能方面有更多的優(yōu)勢(shì)。

如果使用java、.net當(dāng)然,作為一個(gè)系統(tǒng),語(yǔ)言只是一過(guò)更好的設(shè)計(jì)和優(yōu)化,語(yǔ)言才能達(dá)到預(yù)期的效果。

有了以上基本概念,我們來(lái)看看具體操作會(huì)發(fā)生什么。

以下是一些具體問(wèn)題:

問(wèn)題1:庫(kù)存超賣

只有10個(gè)庫(kù)存,但每秒1k一個(gè)訂單,怎么能不超賣呢?

核心思想是保證庫(kù)存遞減是原子操作,10-9,9-8-7。

而不是讀取庫(kù)存10,10-10=9再次更新。因?yàn)檫@個(gè)讀取和更新是并發(fā)執(zhí)行的,很可能會(huì)有1k所有訂單都成功了,實(shí)際庫(kù)存只有10。

那么,如何保證原子性操作呢?

1.數(shù)據(jù)庫(kù):

updateproductsetleft_numleft_num=left_num-1whereleft_num>0;

這里用到的是left_num=left_num-1,如果left_num>0能成功實(shí)施,數(shù)據(jù)庫(kù)查詢、更新時(shí)有用到鎖,能保證更新操作的原子性。

不建議使用數(shù)據(jù)庫(kù)性能差。

2.分布式鎖

用redis做一個(gè)分布式鎖,reids->setnx(lock,1)設(shè)置鎖,程序執(zhí)行完成后del這個(gè)鎖。

鎖定過(guò)程不利于并發(fā)執(zhí)行,大家都在等鎖解開,不建議使用。

3.消息隊(duì)列

將所有訂單請(qǐng)求放入消息隊(duì)列,然后在另一個(gè)后臺(tái)程序中逐一處理訂單請(qǐng)求。

并發(fā)不受影響,但用戶等待時(shí)間長(zhǎng),會(huì)有很多訂單進(jìn)入隊(duì)列,體驗(yàn)不好,不建議使用。

4.redis遞減

通過(guò)redis->incrby(product,-1)遞減后的庫(kù)存數(shù)。

性能好,體驗(yàn)好。PHP在秒殺課程中,優(yōu)化后使用這種方法,而不使用上述其他方法,我們也應(yīng)該能夠比較和理解。

問(wèn)題2:如何規(guī)劃集群?

前端服務(wù)器因?yàn)闆](méi)有相互間關(guān)聯(lián),集群的數(shù)量不受影響。

redis性能每秒可以達(dá)到數(shù)萬(wàn)次響應(yīng),因此集群的規(guī)模,即redis可承載的服務(wù)數(shù)量。

例如,前端服務(wù)器是1~2k的qps(有庫(kù)存的時(shí)候) 1臺(tái)redis它可以是一個(gè)獨(dú)立的集群,可以支持1~2w每秒訂單量。

以上10個(gè)集群一秒鐘就能處理10個(gè)w~20w有效訂單。

如果秒殺活動(dòng)的庫(kù)存在1w在此期間,預(yù)計(jì)參與人數(shù)約為100萬(wàn),因此有一個(gè)集群可以完成。

如果參與秒殺的人數(shù)超過(guò)1000萬(wàn),則需要使用不止一個(gè)集群。

問(wèn)題3:如何保持多個(gè)集群數(shù)據(jù)的一致性?

不要同步多集群的數(shù)據(jù),而是使用散列,每個(gè)集群的數(shù)據(jù)是獨(dú)立存在的。

假設(shè)每種商品有10種商品w庫(kù)存,規(guī)劃10個(gè)集群,每個(gè)集群有10種商品,每種商品有10種k庫(kù)存。

每個(gè)集群只需要負(fù)責(zé)出售自己的庫(kù)存。至于是否會(huì)有用戶知道有10個(gè)集群,然后每個(gè)集群都會(huì)被搶。

不要用程序來(lái)處理這種情況。使用操作規(guī)則,在活動(dòng)結(jié)束后匯總訂單時(shí)處理。

如果擔(dān)心散列不合理,比如某個(gè)集群用戶訪問(wèn)量特別少,可以引入中央控制服務(wù)監(jiān)控各個(gè)集群的庫(kù)存,然后平衡。

問(wèn)題4:機(jī)器人搶購(gòu)怎么辦:

沒(méi)有什么好辦法,類似DDOS攻擊只能讓自己更強(qiáng)大。

在操作策略上,用戶注冊(cè)可以嚴(yán)格控制,必須登錄,提交訂單時(shí)引入圖像驗(yàn)證碼、問(wèn)答、交互式驗(yàn)證等。

騰友科技在世界120多個(gè)國(guó)家部署數(shù)據(jù)中心,為世界各地的許多國(guó)家提供服務(wù)器租賃。所有服務(wù)器都可以根據(jù)需要配置大帶寬和大流量。美國(guó)G口獨(dú)家享受大帶寬服務(wù)器,告別網(wǎng)絡(luò)擁堵;

點(diǎn)擊展開全文

騰佑科技(www.mubashirfilms.com)成立于2009年,總部位于河南鄭州,是一家集互聯(lián)網(wǎng)基礎(chǔ)設(shè)施及軟硬件于一體化的高新技術(shù)企業(yè),具有IDC/ISP/ICP/云牌照、雙軟等資質(zhì),并擁有多個(gè)國(guó)家版權(quán)局認(rèn)證。公司自成立以來(lái),一直致力于發(fā)展互聯(lián)網(wǎng)IDC數(shù)據(jù)中心DataCenter、云計(jì)算Cloud、大數(shù)據(jù)BigDate、人工智能AI、內(nèi)容加速CDN、互聯(lián)網(wǎng)安全、軟件定制開發(fā)等產(chǎn)品服務(wù)及行業(yè)客戶技術(shù)一體化智能解決方案;2018年成為百度智能云AI河南服務(wù)中心。

售前咨詢熱線:400-996-8756

備案提交:0371-89913068

售后客服:0371-89913000

熱門活動(dòng)

百度云服務(wù)中心
  • 熱門資訊
  • 隨便看看