高并發(fā)秒殺系統(tǒng):開發(fā)高并發(fā)秒殺系統(tǒng)總結(jié)
【溫馨提醒】文章內(nèi)容僅供參考,海外服務(wù)器租用\托管方案,請咨詢YINGSOO客服,24小時免費電話400-630-3752
【熱門主機】韓國物理服務(wù)器丨vps韓國多ip服務(wù)器
【熱搜問題】韓國云主機推薦嗎
大家也許開發(fā)過高并發(fā)的系統(tǒng)或者秒殺程序,但肯定都有接觸過,像電商平臺的秒殺、搶購等活動,還有12306春運搶票。
特點:時間短流量多,需要注意外掛。所以要單獨提出秒殺系統(tǒng)。
技術(shù)特點:瞬時高并發(fā),多層次分布式處理,人機交互對抗
一、系統(tǒng)環(huán)境搭建
?。?)技術(shù)選型
linux+nginx+php+mysql+redis (開源、免費)
cdn(分布式緩存),智能dns(多線路接入選擇)
負載均衡LVs,大型web集群(分流節(jié)點,達到高效穩(wěn)定)
?。?)開發(fā)準備
工具:eclipse for php 或 phpstorm 或 editplus、sublime
部署環(huán)境:XAmpp / brew / yum
代碼管理:git /sVn
?。?)mysql封裝
pdo組件、常用增刪改查
利用開源代碼 db、crud代碼庫
(4)Redis封裝
?。〝?shù)據(jù)緩存,需要配置器)
pHp客戶端: phpredis /predis
封裝基本的redis資源連接和命令
?。?)debug封裝
定制日志和調(diào)試日志。學(xué)會調(diào)試事半功倍。
二、系統(tǒng)設(shè)計
?。?)基本功能和流程
后臺:活動管理/商品管理/訂單管理/日志管理
前臺:商品展示/秒殺/購物車/我的訂單
安全:驗證碼/問答
?。?)項目流程
秒殺——>問答驗證——>庫存驗證——>生成訂單——>
?。?)數(shù)據(jù)庫設(shè)計
活動信息表,商品信息表,訂單信息表,問答信息表,日志記錄表
?。?)交互和頁面設(shè)計
后臺:基本管理,列表增刪改
前臺:商品展示,搶購,我的訂單,購物車,登陸
安全:防攻擊,防作弊,防機器人。
三、「開發(fā)」高并發(fā)秒殺系統(tǒng)總結(jié):
活動周期短,瞬間流量大(高并發(fā)),技術(shù)在這種情況下,會發(fā)生和要做的事。
第一:高并發(fā)
技術(shù)要做的事,一方面優(yōu)化程序,讓程序性能最優(yōu),單次請求時間能從50ms優(yōu)化到25ms,那就可以在一秒鐘內(nèi)成功響應(yīng)翻倍的請求了。
另一方面就是增加服務(wù)器,用更大的集群來處理用戶請求,設(shè)計好一個可靠且靈活擴充的分布式方案就更加重要了。
第二:時間短
火熱的秒殺活動,真的是一秒鐘以內(nèi)就會把商品搶購一空,而大部分用戶的感受是,提交訂單的過程卻要等待好幾秒、甚至十幾秒,更糟糕的當然是請求報錯。
那么一個好的秒殺體驗,當然希望盡可能減少用戶等待時間,準確的提示用戶當前是否還有商品庫存。而這些,也是需要有優(yōu)秀的程序設(shè)計來保證的。
第三:系統(tǒng)容量預(yù)估
系統(tǒng)設(shè)計的時候,都需要有一個容量預(yù)估,那就是要提前計算好,我們設(shè)計的系統(tǒng),要承載多大的數(shù)量級。
假如線上前端服務(wù)器規(guī)格是8核16g內(nèi)存的服務(wù)器,而提交訂單的處理程序耗時100ms,那么可以簡單計算一下:
每秒可以處理的訂單請求數(shù)=1000ms/100ms*8=80qps上面這個結(jié)果,對于秒殺系統(tǒng)來說,肯定是非常不理想的。
如果能[荷蘭服務(wù)器]將處理程序耗時優(yōu)化后,降低到10ms,那么就可以達到800qps。
如果我們可以把程序繼續(xù)優(yōu)化,能快速區(qū)分開有庫存和無庫存處理,那么無庫存時處理就有可能做到1ms甚至更低的耗時。這樣無庫存時就能有更好的性能,上萬的qps也是可以達到的。
上面的預(yù)估,都是針對單機,那么簡單的增加前端服務(wù)器,是不是就能有更好的并發(fā)處理量呢?
肯定沒這么簡單,因為數(shù)據(jù)庫、緩存系統(tǒng)甚至機房網(wǎng)絡(luò)帶寬都會成為瓶頸。
于是就要有一個更好的分布式方案。
第四:好的分布式方案
一個好的分布式方案,首先當然是穩(wěn)定可靠,不要出亂子,然后就是方便擴充,最好的效果當然是增加一臺服務(wù)器,并發(fā)處理量可以1:1線性增長。
比如:單機qps是1k,那么10臺服務(wù)器可以做到1w,100臺可以做到10w每秒。
要做到這樣的線性增長效果,就要杜絕出現(xiàn)瓶頸,否則還是會代價太大。
拒絕假的分布式尤其重要,比如:前端服務(wù)器是可以獨立存在的,但是都依賴集中的一個數(shù)據(jù)庫或者緩存系統(tǒng),那最后,一定是集中的那個數(shù)據(jù)庫或者緩存系統(tǒng)受不了,同樣無法做到一個好的分布式。
第五:關(guān)注系統(tǒng)的瓶頸
大家先有幾個基本的共識,系統(tǒng)的處理速度
程序內(nèi)數(shù)據(jù)讀寫 > redis > mysql > 磁盤 單機網(wǎng)絡(luò)請求 > 局域網(wǎng)內(nèi)請求 > 跨機房請求我們優(yōu)化程序的時候,盡量用最快的方式,盡量用最簡短的邏輯。
用redis替代mysql來保存訂單處理中依賴的數(shù)據(jù),用程序中的提交的數(shù)據(jù)代替從redis中二次獲取數(shù)據(jù),比如:商品庫存信息,用戶訂單信息。
邏輯處理中,把速度快且提前中斷的邏輯放在最前面,比如:驗證登錄,驗證問答。
我們做分布式方案的時候,盡量把資源調(diào)用放在最近的地方。
前端服務(wù)器依賴的數(shù)據(jù)盡量就在局域網(wǎng)內(nèi),如果能在單機都有讀的redis服務(wù)當然[ddos防御方案]更好,程序維護數(shù)據(jù)響應(yīng)會復(fù)雜些。
不要出現(xiàn)跨機房網(wǎng)絡(luò)請求,不要出現(xiàn)跨機房網(wǎng)絡(luò)請求,不要出現(xiàn)跨機房網(wǎng)絡(luò)請求,重要的事情說三遍。
第六:什么語言更適合這類系統(tǒng)
課程中用的是pHp語言,開發(fā)這類系統(tǒng)也是沒問題的。
當然,像是用golang, ngx_lua可能在高并發(fā)和性能方面會更有優(yōu)勢。
如果使用java、.net當然也是可以的,作為一個系統(tǒng),語言只是工具,更好的設(shè)計和優(yōu)化,才能達到最終想要的效果。
有了上面的基本概念,我們接下來再來看看,具體運行時,會出現(xiàn)什么狀況。
四、下面是一些具體的問題:
問題1:庫存超賣
只有10個庫存,但是一秒鐘有1k個訂單,怎么能不超賣呢?
核心思想就是保證庫存遞減是原子性操作,10--返回9,9--返回8,8--返回7。
而不能是讀取出來庫存10,10-1=9再更新回去。因為這個讀取和更新是并發(fā)執(zhí)行的,很可能就會有1k個訂單都成功了,而庫存實際只有10。
那么,怎么保證原子性操作呢?
1. 數(shù)據(jù)庫:
- updateproductsetleft_numleft_num=left_num-1whereleft_num>0;
這里用到的是left_num=left_num-1,如果left_num>0才能執(zhí)行成功,數(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的性能可以達到每秒幾萬次響應(yīng),所以一個集群的規(guī)模,也就是redis服務(wù)可以承載的數(shù)量。
比如:一臺前端服務(wù)器是1~2k的qps(有庫存時),那么10臺+1臺redis就可以是一個獨立的集群,可以支撐1~2w每秒訂單量。
10個上述的集群就可以做到一秒鐘處理10w~20w的有效訂單。
如果秒殺活動的庫存量在1w以內(nèi),預(yù)計參與的人數(shù)在百萬左右,那么有一個集群也就可以搞定。
如果秒殺參與的人數(shù)超過千萬,那么就要用到不止一個集群了。
問題3:多個集群的數(shù)據(jù)怎么保持一致性
不要做多集群的數(shù)據(jù)同步,而是用散列,每個集群的數(shù)據(jù)是獨立存在的。
假設(shè),有10個商品,每個商品有1w庫存,規(guī)劃用10個集群,那么每個集群有10個商品,每個商品是1k庫存。
每個集群只需要負責把自己的庫存賣掉即可,至于說,會不會有用戶知道有10個集群,然后每個集群都去搶。
這種情況就不要用程序來處理了,利用運營規(guī)則,活動結(jié)束后匯總訂單的時候再去處理就好了。
如果擔心散列的不合理,比如:某個集群用戶訪問量特別少,那么可以引入一個中控服務(wù),來監(jiān)控各個集群的庫存,然后再做平衡。
問題4:機器人搶購怎么辦:
沒什么太好的辦法,類似ddos攻擊,只能是讓自身更強大才是王道。
運營策略上,可以嚴格控制用戶注冊,必須登錄,提交訂單的時候引入圖像驗證碼,問答,交互式驗證等。
本公司在全球超過120個國家部署數(shù)據(jù)中心,提供海外全球多個國家服務(wù)器租用,所有服務(wù)器均可根據(jù)需求配置大帶寬大流量,美國g口獨享大帶寬服務(wù)器,從此告別網(wǎng)絡(luò)擁堵;
私服行業(yè)如何選到適合的香港服務(wù)器
香港服務(wù)器可以選擇國際線路、國際帶寬。在訪問速度上快速,延遲低,穩(wěn)定性好,性價比也比較高。這也是為什么更多的私服站長選用香港服務(wù)器的原因,新建站的私服游戲站長在選用香港服[香港抗鏈接攻擊服務(wù)器詳細租用流程]務(wù)器時應(yīng)該怎么選擇呢?
1、選擇合適的硬件配置。香港服務(wù)器大多都是物理服務(wù)器,相當于云主機來說,物理主機的CPU雙核性能是超過虛擬機的雙核。剛建站游戲用戶沒有多少的小私服,不低于雙核I3、4G的配置是可以的;如果游戲后續(xù)在運行中玩家用戶數(shù)量增加的話,也可以根據(jù)玩家數(shù)量的多少,以及游戲界面后續(xù)升級的狀況重新選擇CPU性能以及帶寬更大的服務(wù)器。
2、正規(guī)機房。與大陸機房一致,香港地區(qū)的機房也是有好壞之分的,在選擇時應(yīng)盡量選擇正規(guī)的機房,這樣無論是在服務(wù)器的質(zhì)量上還是使用的穩(wěn)定性上都是有保障的。
3、售后保障。在租用服務(wù)器時,應(yīng)盡量選擇正規(guī)的IDC運營商,這樣在后續(xù)的售后保障和服務(wù)跟進上也會更好一些。一般情況下,找正規(guī)的服務(wù)商租用時,都是可以包技術(shù)售后的。但是目前也仍然有站長因為找非正規(guī)的服務(wù)商租用服務(wù)器,別人收[傳奇打金服務(wù)器]錢后不管售后問題的。所以在售后服務(wù)保障上的問題大家要多注意一些。
以上就是關(guān)于如何挑選香港服務(wù)器的注意事項了,如果大家對于私服服務(wù)器的配置上有疑惑,歡迎聯(lián)系本公司售前客服咨詢,客服會根據(jù)您的私服游戲情況為您推薦適合的服務(wù)器配置哦。
YINGSOO官網(wǎng):http://www.sddonglingsh.com
熱門文章:【中秋活動】【電信APP服務(wù)器】【服務(wù)器海外】【境外服務(wù)器租用】【香港百兆服務(wù)器托管】【對比臺灣VPS】【虛擬主機可以干什么】【辦公軟件服務(wù)器】【新加坡云服務(wù)器可以上油管嗎】【視頻流服務(wù)器并發(fā)】【oa系統(tǒng)服務(wù)器】【香港空間套餐】【高防集群服務(wù)器優(yōu)勢是什么】【服務(wù)器租用價格一些常見的問題】【海外vps租用】【服務(wù)器國外租用】【阿里云騰訊云】【服務(wù)器托管有什么優(yōu)勢】【免費vps使用】【美國網(wǎng)站空間】【韓國服務(wù)器推薦】【內(nèi)存服務(wù)器租用】【香港云服務(wù)器1韓國主機】【電商直播系統(tǒng)】【免備案云】【集群磁盤故障】【香港主機網(wǎng)站制作】【高配大帶寬服務(wù)器有什么好處】
臺灣主機購買,Hinet機房合作,五星貼心服務(wù),免備案高品質(zhì)臺灣主機購買,延遲低至40ms.YINGSOO新版云控制臺上線,臺灣主機購買鉅惠來襲,注冊送優(yōu)惠碼,年付8.3折!
http://www.sddonglingsh.com/products/cloud-tw.html
9年香港主機哪里好業(yè)務(wù)運營經(jīng)驗,連續(xù)3年香港主機哪里好業(yè)務(wù)名列前茅.香港寬頻,HKT機房核心合作伙伴,1200家企業(yè)客戶共同選擇,24小時在線服務(wù)
http://www.sddonglingsh.com/products/cloud-hk.html
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。