政府發(fā)的市民消費(fèi)券
可能剛開(kāi)始同時(shí)要1-2萬(wàn)人進(jìn)來(lái)?yè)?,不過(guò)就幾分鐘就沒(méi)了。
現(xiàn)在用的yii2,上次cpu被弄到100%了
現(xiàn)在計(jì)劃用我們的webman,之前沒(méi)弄過(guò)常駐內(nèi)存的,不知道適合不適合?
會(huì)不會(huì)出現(xiàn)一些問(wèn)題?
當(dāng)前是想用一個(gè)機(jī)器nginx做反向代理,內(nèi)網(wǎng)兩個(gè)機(jī)器做業(yè)務(wù)處理。
就怕出現(xiàn)問(wèn)題,會(huì)被弄死的。
我覺(jué)得合適,2臺(tái)webman相當(dāng)于10臺(tái)yii的性能,甚至更多。
2萬(wàn)人來(lái)?yè)?,假設(shè)搶1分鐘,每秒支持333個(gè)請(qǐng)求就行。高峰期假設(shè)乘以3,大概每秒能承受1000請(qǐng)求估計(jì)就行。
做完之后用ab壓測(cè)下。
已有項(xiàng)目,并且運(yùn)行沒(méi)問(wèn)題的,建議先考慮優(yōu)化,確定瓶頸在哪里,比如OPCACHE是否開(kāi)啟,DB Server配置是否足夠,DB索引是否合理,FPM根據(jù)內(nèi)存大小預(yù)先開(kāi)啟足量進(jìn)程,還有其他一些業(yè)務(wù)邏輯設(shè)計(jì)等,都做了還是不行再考慮換框架這類操作
不否認(rèn)換了Webman性能會(huì)更好,但是你要權(quán)衡更換成本,比如更換過(guò)程中的遇到的坑你有沒(méi)有辦法填,出了問(wèn)題你能不能擔(dān)得起,畢竟這是市政項(xiàng)目,牽扯的東西很多
另外再多提一嘴,你這個(gè)業(yè)務(wù)算是比較簡(jiǎn)單的秒殺邏輯(至少?gòu)拿枋鲋锌雌饋?lái)比較簡(jiǎn)單),可以考慮在業(yè)務(wù)上做優(yōu)化(如果可以),采用先扣庫(kù)存再進(jìn)行后續(xù)邏輯處理的方式(比如隊(duì)列),比較典型的例子就是常見(jiàn)的"優(yōu)惠券將會(huì)在稍后發(fā)放到您的賬戶中"這種, 前面上個(gè)負(fù)載均衡,平時(shí)就一臺(tái)機(jī)器,發(fā)券前提前多開(kāi)幾臺(tái),結(jié)束后降回一臺(tái)
是的,現(xiàn)在用的就是,除了會(huì)員的生成用mysql有點(diǎn)大,其他都放到了redis里,然后服務(wù)器有個(gè)計(jì)劃任務(wù)負(fù)責(zé)發(fā)券,當(dāng)前自己用到時(shí)沒(méi)啥問(wèn)題。
客戶想包裝成產(chǎn)品,做云端,買個(gè)其他各城市的部門來(lái)發(fā)券,相當(dāng)于重新搞一個(gè)新系統(tǒng)再。
負(fù)載均衡還沒(méi)有上,這幾天正在研究nginx搞這個(gè),現(xiàn)在有3臺(tái)服務(wù)器,打算用最弱的一臺(tái)做分發(fā),其他兩臺(tái)方程序。
@nitron 現(xiàn)在mysql是了一臺(tái)高性能的數(shù)據(jù)庫(kù)服務(wù)器,但是還是感覺(jué)慢,想做主從,不過(guò)之前沒(méi)弄過(guò),還沒(méi)有搭建好。
上次在客戶公眾號(hào)上搞,因?yàn)橐跈?quán),必須跳轉(zhuǎn)一次PHP做會(huì)員初始化,結(jié)果一次來(lái)太多人,當(dāng)時(shí)開(kāi)了1000個(gè)靜態(tài)的fpm進(jìn)程,卡在那里不動(dòng)了。
最后過(guò)了十分鐘還那樣,重啟了phpfpm后好了,我覺(jué)得是cpu(8核)已經(jīng)到頭了沒(méi)能力處理進(jìn)程了。
授權(quán)這個(gè),因?yàn)閺墓娞?hào)獲取用戶信息需要服務(wù)器向微信服務(wù)器發(fā)起一個(gè)Http請(qǐng)求,這個(gè)涉及第三方系統(tǒng),沒(méi)辦法.
注意不要重復(fù)獲取access_token就好
是的,這個(gè)沒(méi)有,access_token都是緩存了的,就是一次太多人訪問(wèn)。。不過(guò)也的確沒(méi)有好的辦法,下次弄負(fù)載均衡估計(jì)就解決了。
大佬發(fā)言給力呀,先優(yōu)化,實(shí)在扛不住了再換webman,也別一下子全搬過(guò)來(lái),高并發(fā)的請(qǐng)求可以用webman處理,多異步,這么高并發(fā)的請(qǐng)求應(yīng)該不會(huì)有新增完數(shù)據(jù)就要看的,mysql的增加刪除和修改全給它異步了,查詢緩存一做基本io上redis扛得住,就問(wèn)題不大
@tanhongbin 【這么高并發(fā)的請(qǐng)求應(yīng)該不會(huì)有新增完數(shù)據(jù)就要看的,mysql的增加刪除和修改全給它異步了】是什么意思哈?求
這種情況用swoole可能會(huì)更好一點(diǎn)。
他本來(lái)就是沒(méi)有常駐內(nèi)存的經(jīng)驗(yàn),直接上swoole玩php協(xié)程非常不推薦,學(xué)習(xí)swoole的難度不亞于學(xué)習(xí)一門新語(yǔ)言例如go。
如果系統(tǒng)瓶頸在數(shù)據(jù)庫(kù),那上啥也沒(méi)用。如果瓶頸在框架性能低下,上webman是很好的選擇,學(xué)習(xí)基本沒(méi)有成本,同樣的代碼寫(xiě)法性能提高數(shù)倍,穩(wěn)定性也好與swoole,并且性能也比swoole高。
如果說(shuō)沒(méi)有扎實(shí)的網(wǎng)絡(luò)與操作系統(tǒng)相關(guān)的基礎(chǔ)或經(jīng)驗(yàn),別說(shuō)用swoole了,就是用了go也難解決性能瓶頸!~
深(身)有體會(huì)!! ^_^
說(shuō)的不錯(cuò),記得我以前剛開(kāi)始工作的時(shí)候,有個(gè)項(xiàng)目每天零點(diǎn)要執(zhí)行任務(wù),當(dāng)時(shí)項(xiàng)目有8,9萬(wàn)個(gè)會(huì)員以后,執(zhí)行任務(wù)需要2,3個(gè)小時(shí)才執(zhí)行完,但是現(xiàn)在如果讓我再執(zhí)行同樣的任務(wù),也就是十幾分鐘的事情.
減少數(shù)據(jù)庫(kù)查詢,批量插入或者更新數(shù)據(jù)庫(kù),這些是從代碼層面去優(yōu)化sql. 一個(gè)接口能少查詢一次sql,那高并發(fā)下一秒就是少上千次查詢.
端午節(jié)上線的項(xiàng)目,項(xiàng)目中使用到數(shù)據(jù)庫(kù)訪問(wèn),單純的增刪改查(有索引),使用docker部署,cpu占用在 10-20% 間,webman的性能讓我著實(shí)震驚。8小時(shí)將近 1200w 的流量穩(wěn)定支撐,并且cpu占用并不高。主要服務(wù)架構(gòu)如下:
順帶一提,該項(xiàng)目也使用了thinkphp開(kāi)發(fā)的一個(gè)服務(wù),簡(jiǎn)單的一個(gè)查詢數(shù)據(jù)庫(kù)(有索引),使用docker部署,cpu占用卻有 300-400%。
當(dāng)然,這只是我這邊的實(shí)際使用場(chǎng)景,僅供參考。你的項(xiàng)目需要具體業(yè)務(wù)具體分析。至于業(yè)務(wù)層涉及到的服務(wù)器調(diào)優(yōu),數(shù)據(jù)庫(kù)優(yōu)化,redis緩存等等,這里就不過(guò)多討論了。
對(duì)于mysql和redis,如果有預(yù)算并且是要短期保證業(yè)務(wù)穩(wěn)定,個(gè)人建議使用云服務(wù)。比如阿里云的云rds或云redis,都有集群版的,比自己部署的要好要穩(wěn)定要便捷。自己部署的話,非專業(yè)運(yùn)維,包括調(diào)優(yōu),監(jiān)控等等都會(huì)比較麻煩,并且單機(jī)部署,流量,性能和IO,都會(huì)有瓶頸。
以下思路,僅供參考:
現(xiàn)在是在一個(gè)內(nèi)存最大的服務(wù)器上安置了redis,所在的云上沒(méi)有云redis,這時(shí)候其他機(jī)器通過(guò)局域網(wǎng)訪問(wèn)這臺(tái)機(jī)器的redis你覺(jué)得會(huì)不會(huì)有問(wèn)題那?
還有問(wèn)個(gè)問(wèn)題哈,常駐內(nèi)存的,如果這個(gè)進(jìn)程比如調(diào)用一些外部api服務(wù),響應(yīng)時(shí)間比較長(zhǎng),豈不是后面的都卡主了。
如果當(dāng)前請(qǐng)求未處理完,其他的請(qǐng)求會(huì)等待。
具體的業(yè)務(wù)場(chǎng)景有不同的處理方案。要在接口中等待外部api請(qǐng)求完成,比如微信授權(quán),則可以把該接口分離成一個(gè)單獨(dú)的服務(wù)來(lái)部署,這樣可避免影響其他業(yè)務(wù) 或 合理設(shè)置超時(shí)時(shí)間;若可異步處理,比如發(fā)券,可使用消息中間件服務(wù)。
我這邊在使用mysql或redis服務(wù)時(shí),結(jié)合使用場(chǎng)景,一般會(huì)從三個(gè)角度去考慮,流量,性能及多機(jī)活備。
通過(guò)內(nèi)網(wǎng)訪問(wèn),流量是沒(méi)問(wèn)題的,至于性能及活備,因?yàn)闊o(wú)法預(yù)知上線后的業(yè)務(wù)情況,所以無(wú)法評(píng)估你當(dāng)前配置的redis服務(wù)有沒(méi)有問(wèn)題。
如果沒(méi)有更好的方案,建議提前開(kāi)發(fā)好業(yè)務(wù)功能,按照當(dāng)前思路部署服務(wù),然后做壓測(cè)來(lái)定位服務(wù)瓶頸。
fpm不是每個(gè)請(qǐng)求開(kāi)一個(gè)進(jìn)程,是的話一秒來(lái)1萬(wàn)個(gè)請(qǐng)求,服務(wù)器內(nèi)存直接爆了。
都是預(yù)先開(kāi)一些進(jìn)程,每個(gè)進(jìn)程排隊(duì)處理消息,包括nginx也是一樣。
發(fā)消息券這種,一種用webman這類常駐內(nèi)存來(lái)做API,另外消費(fèi)券本身,建議先放在REDIS等緩存里邊,不要直接訪問(wèn)數(shù)據(jù)庫(kù),再一個(gè)利用隊(duì)列的方式。這樣你說(shuō)的1到2W人,輕松就能解決了。
給個(gè)建議,可以自己試試內(nèi)網(wǎng)壓測(cè)。
1、消費(fèi)卷數(shù)量存到redis。
2、領(lǐng)取消費(fèi)卷的時(shí)候查redis結(jié)果,有卷領(lǐng)取成功的話通過(guò)隊(duì)列回寫(xiě)mysql結(jié)果?!井惒?、
3、前端搶劵的時(shí)候增加個(gè)setTimeout,隨機(jī)延遲10~1000毫米時(shí)間發(fā)送請(qǐng)求,避免產(chǎn)生毛刺。
其實(shí)避免了mysql的同步操作,剩下的就是帶寬問(wèn)題了,所有接口非必要信息不要返回,減少請(qǐng)求大小,開(kāi)啟gzip就好了。
靜態(tài)資源建議上cdn,針對(duì)請(qǐng)求異常時(shí)前端做好友好提示,類似活動(dòng)異常爆滿,請(qǐng)稍后重試。這樣就算webman倒了也對(duì)客戶影響不大。
當(dāng)前是想用一個(gè)機(jī)器nginx做反向代理,內(nèi)網(wǎng)兩個(gè)機(jī)器做業(yè)務(wù)處理。
更加建議租用云負(fù)載,按量付費(fèi)。
以騰訊云為例:
建議:
clb-〉(CVM 3) -〉云redis -〉 云數(shù)據(jù)庫(kù)
膽大的:
clb->CVM 2 -> CVM(redis單機(jī)) -> 云數(shù)據(jù)庫(kù)
redis單機(jī)一般問(wèn)題也不大的。webman啟動(dòng)的時(shí)候加載帶領(lǐng)取的卷id到redis里,領(lǐng)劵的時(shí)候redis取個(gè)出來(lái),然后丟隊(duì)列,隊(duì)列update 到取mysql那。
我們之前也用過(guò),價(jià)格特別貴,然后window系統(tǒng)還要另外支付授權(quán)費(fèi)用。申請(qǐng)端口和遠(yuǎn)程進(jìn)去要用跳板機(jī)。
@ MarkGo 對(duì)啊對(duì)啊,超級(jí)麻煩,那個(gè)堡壘機(jī)傳文件夾還不智能,上次開(kāi)個(gè)443端口,說(shuō)要和省里申報(bào),最少要一天(非工作日)才能過(guò)。
讓加個(gè)白名單,相當(dāng)不愿意。