簡述:大家也許開發(fā)過高并發(fā)的系統(tǒng)或者秒殺程序,但肯定都有接觸過,像電商平臺的秒殺、搶購等活動,還有12306春運搶票。特點:時間短流量多,需要注意外掛。所以要單獨提出秒殺系統(tǒng)。技術(shù)特點:瞬時高并發(fā),多層次分布式處理,人機交互對抗一、系統(tǒng)環(huán)境搭建(
大家可能都開發(fā)過高并發(fā)系統(tǒng)或者秒殺程序,但是肯定都接觸過,比如電商平臺的秒殺、搶購等活動,以及12306春運搶票。
特點:時間短,流量大,需要注意插件。因此,應(yīng)單獨提出秒殺系統(tǒng)。
技術(shù)特點:瞬時高并發(fā)、多層次分布式處理、人機交互對抗
一、系統(tǒng)環(huán)境建設(shè)
(1)技術(shù)選型
linux nginx php mysql redis(開源,免費)
CDN(分布式緩存),智能DNS(多線接入選擇)
負載均衡LVS,大型Web集群(分流節(jié)點,實現(xiàn)高效穩(wěn)定)
(2)開發(fā)準備
工具:Eclipseforphp或phpStorm或Editplus、Sublime
部署環(huán)境:XAMPP/brew/yum
代碼管理:Git/SVN
(3)Mysql封裝
PDO組件,常用的增刪改查
使用開源代碼Db、Crud代碼庫
(4)Redis封裝
(需要配置器的數(shù)據(jù)緩存)
PHP客戶端:phpredis/Predis
封裝基本的redis連接和命令資源
(5)debug封裝
定制日志和調(diào)試日志。學會事半功倍。
二、系統(tǒng)設(shè)計
(1)基本功能和流程
背景:活動管理/商品管理/訂單管理/日志管理
前臺:商品展示/秒殺/購物車/我的訂單
安全:驗證碼/問答
(2)項目流程
秒殺——>問答驗證——>庫存驗證——>生成訂單——>
(3)數(shù)據(jù)庫設(shè)計
活動信息表、商品信息表、訂單信息表、問答信息表、日志記錄表
(4)交互和頁面設(shè)計
背景:基本管理,列表增刪
前臺:商品展示、搶購、我的訂單、購物車、登錄
安全:防攻擊、防作弊、防機器人。
三、「開發(fā)」總結(jié)高并發(fā)秒殺系統(tǒng):
活動周期短,瞬時流量大(高并發(fā)),技術(shù)在這種情況下會發(fā)生和需要做的事情。
一是高并發(fā)
一方面,優(yōu)化程序,使程序性能最好,單次請求時間可從50點開始ms優(yōu)化到25ms,然后你可以在一秒鐘內(nèi)成功地響應(yīng)翻倍的請求。
另一方面,更重要的是增加服務(wù)器,使用更大的集群來處理用戶要求,并設(shè)計一個可靠和靈活的擴展分布式方案。
第二:時間短
火熱的第二次殺戮活動真的會在一秒鐘內(nèi)買到商品,而大多數(shù)用戶的感覺是,提交訂單的過程需要等待幾秒甚至十秒。當然,更糟糕的是要求報錯。
當然,一個好的秒殺體驗希望盡可能減少用戶的等待時間,準確地提醒用戶目前是否有商品庫存。這些也需要優(yōu)秀的程序設(shè)計來保證。
三是系統(tǒng)容量估計
在設(shè)計系統(tǒng)時,需要有一個容量估計,即提前計算我們設(shè)計的系統(tǒng)應(yīng)該承載多少數(shù)量級。
如果在線前端服務(wù)器規(guī)格為8核16G提交訂單的內(nèi)存服務(wù)器需要100個處理程序ms,然后可以簡單計算一下:
對于秒殺系統(tǒng)來說,上述結(jié)果肯定是非常不理想的。
如果能優(yōu)化處理程序,可以減少到10ms,然后就可以達到8000qps。
如果我們可以把程序繼續(xù)優(yōu)化,能快速區(qū)分開有庫存和無庫存處理,那么無庫存時處理就有可能做到1ms甚至更低的時間消耗。這樣,在沒有庫存的情況下,會更好,成千上萬qps也可以實現(xiàn)。
以上估計都是針對單機的,那么簡單的增加前端服務(wù)器就能有更好的并發(fā)處理量嗎?
因為數(shù)據(jù)庫、緩存系統(tǒng)甚至機房網(wǎng)絡(luò)帶寬都不會那么簡單。
于是就要有一個更好的分布式方案。
第四:好的分布式方案
一個好的分布式解決方案,當然是穩(wěn)定可靠的,不要混亂,然后方便擴展,當然,最好的效果是增加服務(wù)器,并發(fā)處理量可以線性增長1:1。
比如:單機qps是1k,10臺服務(wù)器可以做到10臺服務(wù)器w,100臺可以做到10w每秒。
要達到這樣的線性增長效果,就要杜絕瓶頸,否則還是會太貴。
拒絕假分布式尤為重要。例如,前端服務(wù)器可以獨立存在,但它們都依賴于集中的數(shù)據(jù)庫或緩存系統(tǒng)。最后,集中的數(shù)據(jù)庫或緩存系統(tǒng)無法忍受,也無法實現(xiàn)良好的分布式。
第五:注意系統(tǒng)的瓶頸
先有幾個基本共識,系統(tǒng)的處理速度
讀寫程序中的數(shù)據(jù)>redis>mysql>磁盤單機網(wǎng)絡(luò)請求>局域網(wǎng)請求>跨機房請求當我們優(yōu)化程序時,使用最快的方法和最短的邏輯。
用redis替代mysql用程序中提交的數(shù)據(jù)代替訂單處理中依賴的數(shù)據(jù)redis商品庫存信息、用戶訂單信息等二次數(shù)據(jù)獲取。
在邏輯處理中,將快速、提前中斷的邏輯放在首位,如驗證登錄、驗證問答等。
我們做分布式方案的時候,盡量把資源調(diào)用放在最近的地方。
前端服務(wù)器所依賴的數(shù)據(jù)應(yīng)盡可能在局域網(wǎng)中,如果可以在單機上閱讀redis當然,服務(wù)更好,程序維護數(shù)據(jù)響應(yīng)會更復(fù)雜。
不要有跨機房網(wǎng)絡(luò)請求,不要有跨機房網(wǎng)絡(luò)請求,不要有跨機房網(wǎng)絡(luò)請求,重要的事情說三遍。
第六:什么語言更適合這種系統(tǒng)?
在課程中使用PHP語言,開發(fā)這樣的系統(tǒng)也沒問題。
當然,就像使用一樣golang,ngx_lua它可能在高并發(fā)性和性能方面有更多的優(yōu)勢。
如果使用java、.net當然,作為一個系統(tǒng),語言只是一過更好的設(shè)計和優(yōu)化,語言才能達到預(yù)期的效果。
有了以上基本概念,我們來看看具體操作會發(fā)生什么。
以下是一些具體問題:
問題1:庫存超賣
只有10個庫存,但每秒1k一個訂單,怎么能不超賣呢?
核心思想是保證庫存遞減是原子操作,10-9,9-8-7。
而不是讀取庫存10,10-10=9再次更新。因為這個讀取和更新是并發(fā)執(zhí)行的,很可能會有1k所有訂單都成功了,實際庫存只有10。
那么,如何保證原子性操作呢?
1.數(shù)據(jù)庫:
updateproductsetleft_numleft_num=left_num-1whereleft_num>0;
這里用到的是left_num=left_num-1,如果left_num>0能成功實施,數(shù)據(jù)庫查詢、更新時有用到鎖,能保證更新操作的原子性。
不建議使用數(shù)據(jù)庫性能差。
2.分布式鎖
用redis做一個分布式鎖,reids->setnx(lock,1)設(shè)置鎖,程序執(zhí)行完成后del這個鎖。
鎖定過程不利于并發(fā)執(zhí)行,大家都在等鎖解開,不建議使用。
3.消息隊列
將所有訂單請求放入消息隊列,然后在另一個后臺程序中逐一處理訂單請求。
并發(fā)不受影響,但用戶等待時間長,會有很多訂單進入隊列,體驗不好,不建議使用。
4.redis遞減
通過redis->incrby(product,-1)遞減后的庫存數(shù)。
性能好,體驗好。PHP在秒殺課程中,優(yōu)化后使用這種方法,而不使用上述其他方法,我們也應(yīng)該能夠比較和理解。
問題2:如何規(guī)劃集群?
前端服務(wù)器因為沒有相互間關(guān)聯(lián),集群的數(shù)量不受影響。
redis性能每秒可以達到數(shù)萬次響應(yīng),因此集群的規(guī)模,即redis可承載的服務(wù)數(shù)量。
例如,前端服務(wù)器是1~2k的qps(有庫存的時候) 1臺redis它可以是一個獨立的集群,可以支持1~2w每秒訂單量。
以上10個集群一秒鐘就能處理10個w~20w有效訂單。
如果秒殺活動的庫存在1w在此期間,預(yù)計參與人數(shù)約為100萬,因此有一個集群可以完成。
如果參與秒殺的人數(shù)超過1000萬,則需要使用不止一個集群。
問題3:如何保持多個集群數(shù)據(jù)的一致性?
不要同步多集群的數(shù)據(jù),而是使用散列,每個集群的數(shù)據(jù)是獨立存在的。
假設(shè)每種商品有10種商品w庫存,規(guī)劃10個集群,每個集群有10種商品,每種商品有10種k庫存。
每個集群只需要負責出售自己的庫存。至于是否會有用戶知道有10個集群,然后每個集群都會被搶。
不要用程序來處理這種情況。使用操作規(guī)則,在活動結(jié)束后匯總訂單時處理。
如果擔心散列不合理,比如某個集群用戶訪問量特別少,可以引入中央控制服務(wù)監(jiān)控各個集群的庫存,然后平衡。
問題4:機器人搶購怎么辦:
沒有什么好辦法,類似DDOS攻擊只能讓自己更強大。
在操作策略上,用戶注冊可以嚴格控制,必須登錄,提交訂單時引入圖像驗證碼、問答、交互式驗證等。
騰友科技在世界120多個國家部署數(shù)據(jù)中心,為世界各地的許多國家提供服務(wù)器租賃。所有服務(wù)器都可以根據(jù)需要配置大帶寬和大流量。美國G口獨家享受大帶寬服務(wù)器,告別網(wǎng)絡(luò)擁堵;
騰佑科技(www.158100.cn)成立于2009年,總部位于河南鄭州,是一家集互聯(lián)網(wǎng)基礎(chǔ)設(shè)施及軟硬件于一體化的高新技術(shù)企業(yè),具有IDC/ISP/ICP/云牌照、雙軟等資質(zhì),并擁有多個國家版權(quán)局認證。公司自成立以來,一直致力于發(fā)展互聯(lián)網(wǎng)IDC數(shù)據(jù)中心DataCenter、云計算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
搜索詞
熱門產(chǎn)品推薦