在什么業(yè)務(wù)場(chǎng)景下用高并發(fā)呢?
1。應(yīng)用場(chǎng)景
春運(yùn)火車(chē)票,微信紅包,電商的秒殺,搶購(gòu)。
2。互聯(lián)網(wǎng)系統(tǒng)的應(yīng)用架構(gòu)基礎(chǔ)分析
防火墻:防止網(wǎng)絡(luò)上的病毒攻擊和其他攻擊。
負(fù)載均衡器:
具體作用a:對(duì)業(yè)務(wù)需求做初步分析,決定是否分發(fā)到web服務(wù)器。(常見(jiàn)的分發(fā)軟件有Nginx和 Apache等反向代理服務(wù)器)。他可以通過(guò)配置禁止一些無(wú)效請(qǐng)求,比如封殺作弊的IP地址。
b.提供路由算法, 可以提供實(shí)現(xiàn)負(fù)載均衡的算法,根據(jù)各個(gè)服務(wù)器的負(fù)載能力進(jìn)行合理分發(fā)。降低單個(gè)服務(wù)器的負(fù)載
c.限流,如果請(qǐng)求超過(guò)所有服務(wù)器的最大承載能力,就要限流,否則可能引起宕機(jī)的連鎖反應(yīng)。可以提示用戶(hù)繁忙,稍后再試,保證系統(tǒng)可用。
高并發(fā)系統(tǒng)的設(shè)計(jì)
真正的系統(tǒng)是為了實(shí)現(xiàn)業(yè)務(wù)而開(kāi)發(fā)的,所以設(shè)計(jì)時(shí)必須先分析實(shí)際需求和場(chǎng)景
第一步:區(qū)分有效請(qǐng)求和無(wú)效請(qǐng)求
有效請(qǐng)求指真實(shí)的需求,無(wú)效請(qǐng)求是虛假的搶購(gòu)請(qǐng)求。
無(wú)效請(qǐng)求舉例: 通過(guò)腳本連續(xù)刷新網(wǎng)站頁(yè)面,使用刷票軟件連續(xù)請(qǐng)求。
無(wú)效請(qǐng)求的應(yīng)對(duì)方法: 1。加入驗(yàn)證碼。一般首次無(wú)驗(yàn)證碼,后續(xù)的第二/N次加入驗(yàn)證碼,驗(yàn)證碼種類(lèi)有圖片,文字,等式計(jì)算等。圖片也可以用傾斜的
2,讓用戶(hù)手動(dòng)調(diào)整圖片的位置或者角度和標(biāo)準(zhǔn)進(jìn)行比對(duì)。
3。使用短信服務(wù),把驗(yàn)證碼發(fā)送到短信平臺(tái),然后讓用戶(hù)再輸入。
注意,這個(gè)應(yīng)該放在負(fù)載均衡器上完成,而不是放在web服務(wù)器上完成。這樣可以攔截大量的無(wú)效請(qǐng)求。
4,通過(guò)具體的業(yè)務(wù)邏輯來(lái)限制,比如限制用戶(hù)在單位時(shí)間內(nèi)的購(gòu)買(mǎi)量
5,針對(duì)一人多賬戶(hù)的情況,提高賬戶(hù)等級(jí),通過(guò)銀行卡驗(yàn)證,實(shí)名制獲取證件號(hào)碼,同一證件號(hào)碼的認(rèn)定為一個(gè)用戶(hù)。
6,封IP地址,封MAC地址,主要是用來(lái)反爬蟲(chóng),有可能誤傷有效請(qǐng)求。
高并發(fā)系統(tǒng)的設(shè)計(jì)的第二步:系統(tǒng)設(shè)計(jì)
1。水平分法:按照功能模塊進(jìn)行區(qū)分,使得他們相互分離,以降低系統(tǒng)的復(fù)雜性。
2。垂直分法:不按照模塊劃分,每個(gè)子系統(tǒng)的功能相同,只是通過(guò)算法把大量請(qǐng)求合理分配。
3。大型網(wǎng)站還可以按照水平和垂直結(jié)合的方法。首先將業(yè)務(wù)區(qū)分為多個(gè)子系統(tǒng),在每一個(gè)子系統(tǒng)下面再分多個(gè)服務(wù)器,通過(guò)子系統(tǒng)的路由器找到對(duì)應(yīng)的子系統(tǒng)服務(wù)器提供服務(wù)。
秉持的原則:服務(wù)器的負(fù)載均衡,提高服務(wù)器的吞吐能力和性能;業(yè)務(wù)簡(jiǎn)化,便于開(kāi)發(fā)。
水平分法的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):一個(gè)服務(wù)管理一個(gè)業(yè)務(wù),提高開(kāi)發(fā)效率。
缺點(diǎn):因?yàn)楦鱾€(gè)系統(tǒng)業(yè)務(wù)之間存在關(guān)聯(lián),需要通過(guò)RPC(遠(yuǎn)程過(guò)程調(diào)用協(xié)議)來(lái)處理關(guān)聯(lián)信息。比較流行的RPC框架有Dubbo,Thrift和Hessian。
RPC框架的理念:每一個(gè)服務(wù)都會(huì)暴露一些公共接口給RPC服務(wù),這樣任何一個(gè)服務(wù)器都能夠通過(guò)RPC服務(wù)獲取其他服務(wù)器對(duì)應(yīng)的接口去調(diào)用各個(gè)服務(wù)器的邏輯來(lái)完成功能。接口的相互調(diào)用會(huì)造成一定程度的緩慢。
垂直分法的缺點(diǎn):因?yàn)槊總€(gè)服務(wù)器都包含所有的業(yè)務(wù)邏輯功能,會(huì)造成開(kāi)發(fā)上的業(yè)務(wù)困難,對(duì)DB設(shè)計(jì)也困難。
高并發(fā)系統(tǒng)的設(shè)計(jì)的第三步:DB設(shè)計(jì)
1。使用分表或者分庫(kù)技術(shù)
分表:本來(lái)一張表可以保存的數(shù)據(jù)設(shè)計(jì)成多張表去保存,比如交易表,訂單表,數(shù)據(jù)過(guò)多會(huì)造成查詢(xún)和統(tǒng)計(jì)的緩慢,可以按照年份來(lái)分為多個(gè)表保存,開(kāi)發(fā)者根據(jù)查詢(xún)的年份確定去查詢(xún)哪個(gè)表。
分庫(kù):把表數(shù)據(jù)分配在不同的DB中。首先需要一個(gè)路由算法確定數(shù)據(jù)保存在哪一個(gè)DB中,比如可以把用戶(hù)和對(duì)應(yīng)業(yè)務(wù)的DB緩存到redis中。這樣路由算法可以通過(guò)redis讀取的數(shù)據(jù)來(lái)確定使用哪個(gè)DB進(jìn)行查詢(xún)。
2。優(yōu)化SQL,建立索引
SQL優(yōu)化的主要原則就是應(yīng)盡量避免全表掃描,應(yīng)該考慮在where及order by 涉及的列上建立索引。索引對(duì)查詢(xún)有利,對(duì)修改不利。(增加維護(hù)索引的開(kāi)銷(xiāo))
技巧1.風(fēng)格統(tǒng)一。
大小寫(xiě)不同,查詢(xún)分析器就認(rèn)為是兩句不同的SQL語(yǔ)句,必須進(jìn)行兩次解析。生成2個(gè)執(zhí)行計(jì)劃。
技巧2:在更新or復(fù)雜查詢(xún)語(yǔ)句要時(shí)刻記住是表鎖定還是行鎖定
,優(yōu)先選用主鍵更新,原因是在musql的運(yùn)行時(shí),非主鍵更新會(huì)鎖表,即不僅鎖定更新的數(shù)據(jù),而且鎖定表的其他數(shù)據(jù),從而影響并發(fā),使用主鍵更新是行鎖定
技巧3:使用連接查詢(xún)來(lái)代替子查詢(xún)(比如用left join 代替 not in)
技巧4,考慮使用“臨時(shí)表”暫存中間結(jié)果,可以避免程序中多次掃描主表
3。讀寫(xiě)分離技術(shù)
部分主機(jī)負(fù)責(zé)寫(xiě)業(yè)務(wù),部分主機(jī)負(fù)責(zé)讀業(yè)務(wù)。
對(duì)于分布式DB來(lái)說(shuō),還有一個(gè)很復(fù)雜,事務(wù)的一致性,目前流行的有2段提交協(xié)議,即XA協(xié)議,Paxos協(xié)議,這個(gè)需要專(zhuān)門(mén)學(xué)習(xí)。。。
動(dòng)靜分離技術(shù)
背景:因?yàn)榛ヂ?lián)網(wǎng)大部分?jǐn)?shù)據(jù)都是靜態(tài)數(shù)據(jù),只有少數(shù)是動(dòng)態(tài)數(shù)據(jù)
靜態(tài)數(shù)據(jù):圖片,css樣式,js腳本,視頻等,尤其是圖片和視頻流量很大。如果都從動(dòng)態(tài)服務(wù)器(如tomcat,weblogic)服務(wù)器的網(wǎng)絡(luò)壓力很大。這個(gè)時(shí)候可以用動(dòng)靜分離技術(shù)。
※ 靜態(tài)數(shù)據(jù)的加速技術(shù):CDN,Nginx
※ 動(dòng)態(tài)數(shù)據(jù)的加速技術(shù):分層架構(gòu),服務(wù)器架構(gòu),DB/緩存架構(gòu)
CDN(即content delivery network,內(nèi)容分發(fā)網(wǎng)絡(luò))。
CDN允許企業(yè)將靜態(tài)數(shù)據(jù)緩存到網(wǎng)絡(luò)CDN的節(jié)點(diǎn)中,在用戶(hù)訪(fǎng)問(wèn)網(wǎng)站時(shí),利用全局負(fù)載技術(shù)將用戶(hù)的訪(fǎng)問(wèn)指向距離最近的工作正常的緩存服務(wù)器上,由緩存服務(wù)器直接響應(yīng)用戶(hù)請(qǐng)求。
※ CDN是構(gòu)建在網(wǎng)絡(luò)之上的內(nèi)容分發(fā)網(wǎng)絡(luò),依靠部署在各地的邊緣服務(wù)器,通過(guò)中心平臺(tái)的負(fù)載均衡、內(nèi)容分發(fā)、調(diào)度等功能模塊,使用戶(hù)就近獲取所需內(nèi)容,降低網(wǎng)絡(luò)擁塞,提高用戶(hù)訪(fǎng)問(wèn)響應(yīng)速度和命中率。CDN的關(guān)鍵技術(shù)主要有內(nèi)容存儲(chǔ)和分發(fā)技術(shù)。
CDN的基本原理是廣泛采用各種緩存服務(wù)器,將這些緩存服務(wù)器分布到用戶(hù)訪(fǎng)問(wèn)相對(duì)集中的地區(qū)或網(wǎng)絡(luò)中,在用戶(hù)訪(fǎng)問(wèn)網(wǎng)站時(shí),利用全局負(fù)載技術(shù)將用戶(hù)的訪(fǎng)問(wèn)指向距離最近的工作正常的緩存服務(wù)器上,由緩存服務(wù)器直接響應(yīng)用戶(hù)請(qǐng)求。