網(wǎng)站雪崩根本原因
在大型互聯(lián)網(wǎng)站建設(shè)過程中,網(wǎng)站的性能都是受服務(wù)器主機(jī)性能約束的昭娩,比如CPU、GPU黍匾、RAM等硬件設(shè)備栏渺。由于當(dāng)前計算機(jī)硬件技術(shù)的支持有限,高性能服務(wù)器的成本巨大锐涯,我們在網(wǎng)站搭建過程中磕诊,需要通過軟件手段來控制網(wǎng)站雪崩效應(yīng),Hystrix可以幫我們保護(hù)服務(wù)纹腌,實(shí)現(xiàn)網(wǎng)站的高可用性霎终。
高并發(fā)場景示例
比如同時有10000個用戶提交訂單,由訂單服務(wù)order的submitOrder()去處理升薯,訂單服務(wù)order所在的服務(wù)器主機(jī)配置很低莱褒,tomcat線程池最大數(shù)設(shè)置為20。每個請求占用一個線程涎劈,使用完畢后才會釋放广凸,那么線程池的線程會被全部占用,剩下的請求進(jìn)入緩存隊列蛛枚,排隊等待線程分配谅海。如果這種等待時間過長,會產(chǎn)生如下可能問題:
- 訂單服務(wù)order的submitOrder()如果調(diào)用了其他服務(wù)會員服務(wù)蹦浦、商品服務(wù)等扭吁,也可能會導(dǎo)致其他服務(wù)的線程池用盡,導(dǎo)致整個相關(guān)聯(lián)的服務(wù)都不可使用
-
服務(wù)器主機(jī)的CPU會長時間的高負(fù)載運(yùn)行盲镶,產(chǎn)生物理發(fā)熱侥袜,最后操作系統(tǒng)可能會為了保護(hù)主機(jī)硬件,殺掉服務(wù)進(jìn)程或者操作系統(tǒng)自身運(yùn)行也會處于等待過程而發(fā)生卡死現(xiàn)象徒河,導(dǎo)致訂單服務(wù)order無法運(yùn)行系馆,從而發(fā)生服務(wù)宕機(jī)
高并發(fā)場景示例圖.png
高并發(fā)雪崩效應(yīng)解決方案
我們一定要明白,服務(wù)性能的瓶頸在于硬件設(shè)備顽照,所有軟件手段基显,只能幫助我們盡可能的高效的使用服務(wù)器主機(jī)資源偎血,比如提升CPU使用率等电谣。
我們知道能量守恒定律,軟件手段不可能完美的解決高并發(fā)問題爷狈,肯定伴隨了一些其他的犧牲。比如下面的解決方案裳擎,總會伴隨著一些其他的犧牲涎永,以少換多,以少換穩(wěn)鹿响,符合道德標(biāo)準(zhǔn)羡微,是人們可以接受的方案。
- 服務(wù)隔離
現(xiàn)在我們了解了服務(wù)等待的直接原因是因?yàn)橐粋€tomcat線程被占用完后惶我,其他請求需要進(jìn)入隊列排隊等候妈倔。在不考慮服務(wù)器主機(jī)性能瓶頸的情況下,我們可以給訂單服務(wù)order的submitOrder服務(wù)和otherServer單獨(dú)創(chuàng)建線程池绸贡,當(dāng)submitOrder出現(xiàn)高并發(fā)時盯蝴,otherServer擁有自己對立的線程池,不受submitOrder線程用盡的影響听怕。
方式:創(chuàng)建獨(dú)立線程池是最常用的服務(wù)隔離技術(shù)捧挺,另一種信號量的方式用的較少
注意:創(chuàng)建獨(dú)立線程池,必須在部署服務(wù)啟動時創(chuàng)建出來 - 服務(wù)熔斷
當(dāng)服務(wù)出現(xiàn)高并發(fā)時尿瞭,為了保護(hù)服務(wù)闽烙,避免雪崩,服務(wù)會拒絕請求訪問 - 服務(wù)降級
當(dāng)服務(wù)熔斷后声搁,為了提升用戶體驗(yàn)鸣峭,走降級fallback方法,給用戶一個友好提示酥艳,如:xx走神了摊溶,請稍后再試 - 服務(wù)限流
大量請求同時請求一個服務(wù)時,需要做服務(wù)限流充石,滿足規(guī)則的允許訪問莫换,否則走服務(wù)熔斷降級。使用場景比如秒殺系統(tǒng)(系統(tǒng)主動提供的高并發(fā)訪問服務(wù))骤铃,網(wǎng)站攻擊(被動接收大量請求)拉岁。
常用的限流解決方案有兩種:
1 代碼層面:算法有計數(shù)器、令牌桶惰爬、漏桶
2 應(yīng)用層nginx解決限流