互联网高并发架构设计模式
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
前言
隨著互聯(lián)網(wǎng)的快速發(fā)展,很多傳統(tǒng)行業(yè)都開始將原有的產(chǎn)品互聯(lián)網(wǎng)化移動(dòng)化,這其中就涉及到對原有系統(tǒng)的改造,因?yàn)橹按蟛糠謺r(shí)間都是在傳統(tǒng)銀行工作所以對于原先的系統(tǒng)設(shè)計(jì)我們也有一個(gè)套路,類似傳統(tǒng)的SSH、LAMP這種,但是隨著技術(shù)的不斷快速發(fā)展,互聯(lián)網(wǎng)高并發(fā)的架構(gòu)設(shè)計(jì)也有了新的模式,本文就介紹下基本的高并發(fā)設(shè)計(jì)模式。互聯(lián)網(wǎng)大部分系統(tǒng)的設(shè)計(jì)采用本文的設(shè)計(jì)模式都是可以的,但是對于一些超高并發(fā)的特殊場景的系統(tǒng)還是需要根據(jù)具體業(yè)務(wù)場景單獨(dú)去設(shè)計(jì)的,下面我們就對高并發(fā)設(shè)計(jì)模式進(jìn)行講解。
分層
分層設(shè)計(jì)是企業(yè)應(yīng)用系統(tǒng)中常見的設(shè)計(jì)模式,為了保證后續(xù)系統(tǒng)的可拆分和可復(fù)用,一般會(huì)將系統(tǒng)拆分為應(yīng)用層、服務(wù)層、數(shù)據(jù)層,這也是傳統(tǒng)的系統(tǒng)分層拆分模式。通過分層,可以更好的將一個(gè)龐大的軟件系統(tǒng)切分為不同的部分,便于分工合作并行開發(fā)和維護(hù)。每層都是獨(dú)立的,互相通過接口進(jìn)行調(diào)用,各層可以根據(jù)業(yè)務(wù)情況的變化獨(dú)立作出調(diào)整,只需要保證接口一致性即可。
分層比較大的挑戰(zhàn)就是合理規(guī)劃和劃分每一層的邊界和接口,在實(shí)施過程中禁止躍層調(diào)用。對于分層架構(gòu)不是一成不變的,一般來說在實(shí)際過程中,會(huì)根據(jù)具體的情況再細(xì)化分層,應(yīng)用層可以分為視圖層、業(yè)務(wù)邏輯層等,服務(wù)層也可以細(xì)分為數(shù)據(jù)接口適配層、邏輯處理層等。
分層架構(gòu)對網(wǎng)站支持高并發(fā)分布式的發(fā)展方向至關(guān)重要,所以在系統(tǒng)剛開始建的時(shí)候最好就要采取分層架構(gòu),這樣后續(xù)分層會(huì)比較容易。
分割
分層是對系統(tǒng)的橫向的切分,分割則是對系統(tǒng)縱向的切分。系統(tǒng)越大,分割的就會(huì)越細(xì),例如銀行系統(tǒng)我們會(huì)切分為核心系統(tǒng)、賬戶系統(tǒng)、支付系統(tǒng)、現(xiàn)金管理系統(tǒng)、營銷系統(tǒng)等等,基本上你在網(wǎng)銀或者手機(jī)銀行上看到的每個(gè)功能背后基本都是一個(gè)系統(tǒng)去支撐,例如我們常見的手機(jī)銀行里的賬戶交易查詢,就這么一個(gè)簡單的交易查詢功能,對于有一定規(guī)模的銀行來說,都會(huì)單建一個(gè)交易查詢系統(tǒng)提供全渠道的查詢服務(wù)。
按照這樣將功能從業(yè)務(wù)層面分割以后,各個(gè)系統(tǒng)承載的壓力自然也就下降下來,而且擴(kuò)展性也會(huì)比較好。不過功能分割對于大型網(wǎng)站的分割粒度一般會(huì)比較小,對于小規(guī)模的公司來說一般沒必要上來就分割成很多子系統(tǒng),隨著業(yè)務(wù)的發(fā)展再進(jìn)行分割就可以。
分布式
分布式由來已久,分布式意味著可以通過增加機(jī)器完成同樣的功能,機(jī)器越多,cpu資源、內(nèi)存、磁盤都是隨著機(jī)器的增加而線性增加,機(jī)器越多能夠處理的并發(fā)訪問和數(shù)據(jù)量就越大,從而能為更多的用戶提供服務(wù)。
分布式架構(gòu)需要考慮很多問題,并不是簡單的加機(jī)器就可以了。實(shí)施分布式以后需要考慮用戶會(huì)話如何管理,數(shù)據(jù)在分布式環(huán)境中如何保持?jǐn)?shù)據(jù)一致性,分布式事務(wù)如何保證一致性,分布式的日志維護(hù)等都是需要考慮的問題,所以分布式設(shè)計(jì)要根據(jù)具體情況而來,不要為了分布式而分布式。
分布式方案有以下幾種:
1)分布式應(yīng)用和服務(wù):將分層和分割后的應(yīng)用分布式部署,這樣可以提高網(wǎng)站性能和并發(fā),加快開發(fā)和發(fā)布速度,還可以讓不同應(yīng)用交叉復(fù)用共同的應(yīng)用,便于功能擴(kuò)展。
2)分布式靜態(tài)資源:網(wǎng)站的靜態(tài)資源獨(dú)立分布式部署,并采用獨(dú)立的域名,這就是動(dòng)靜分離。靜態(tài)資源的分布式部署可以減少應(yīng)用服務(wù)器的壓力,使用獨(dú)立域名可以加快加載速度,也可以降低靜態(tài)資源服務(wù)器的壓力。
3)分布式數(shù)據(jù)和存儲(chǔ):大型網(wǎng)站處理的數(shù)據(jù)都是P級(jí)的,單臺(tái)服務(wù)器無法提供這么大的存儲(chǔ)空間,這么大的數(shù)據(jù)需要分布式存儲(chǔ)。除了分布式文件存儲(chǔ),還有關(guān)系型數(shù)據(jù)庫和Nosql都有分布式的部署方案。通過分布式能夠提供海量的數(shù)據(jù)存儲(chǔ)空間。
4)分布式計(jì)算:對于很多后臺(tái)批量處理的任務(wù)都是采用分布式計(jì)算方案,常用的有Hadoop和MapReduce分布式計(jì)算框架。分布式計(jì)算框架內(nèi)容比較多。
集群
分布式部署的應(yīng)用和服務(wù)部署了很多機(jī)器后還需要將其集群化才能對外提供服務(wù),多臺(tái)服務(wù)器部署相同應(yīng)用構(gòu)成一個(gè)集群,通過負(fù)載均衡設(shè)備共同對外提供服務(wù)。
當(dāng)業(yè)務(wù)量不斷增大以后,可以在集群中不斷增加服務(wù)器就可以滿足業(yè)務(wù)增長了,當(dāng)一臺(tái)服務(wù)器壞了也不會(huì)影響對外的服務(wù)提供,只是性能有所下降。
緩存
緩存是高并發(fā)系統(tǒng)的殺手锏,在真正有高并發(fā)需求的系統(tǒng)一般會(huì)設(shè)計(jì)多級(jí)緩存來減少真正的服務(wù)計(jì)算,而是直接通過緩存提供服務(wù)。像微博、朋友圈這些高QPS的系統(tǒng)都是采用了多級(jí)緩存的架構(gòu)方案。
1)CDN:CDN供應(yīng)商一般都部署在距離用戶最近的網(wǎng)絡(luò)服務(wù)商,用戶的請求總是先到網(wǎng)絡(luò)服務(wù)商,在這里緩存網(wǎng)站的靜態(tài)資源,可以就近將靜態(tài)數(shù)據(jù)返回給用戶。一般來說對于電商、社交應(yīng)用、新聞門戶或者視頻網(wǎng)站這些高QPS網(wǎng)站,都建議使用CDN來環(huán)節(jié)源系統(tǒng)的壓力。
2)反向代理:反向代理屬于網(wǎng)站前端架構(gòu)的一部分,部署在網(wǎng)站的前端,當(dāng)用戶請求到達(dá)網(wǎng)站的數(shù)據(jù)中心時(shí),最先訪問到的就是反向代理服務(wù)器,這里將網(wǎng)站的靜態(tài)資源緩存起來,這樣不需要繼續(xù)轉(zhuǎn)發(fā)應(yīng)用服務(wù)器,直接從反向代理緩存中返回就可以了。
3)本地緩存:對于應(yīng)用服務(wù)器被訪問的高熱點(diǎn)數(shù)據(jù),應(yīng)用程序可以在服務(wù)器內(nèi)存中緩存這些熱點(diǎn)數(shù)據(jù),這樣就不需要訪問服務(wù)器磁盤或者數(shù)據(jù)庫了,能夠?qū)?nèi)存中的熱點(diǎn)數(shù)據(jù)直接返回。
4)分布式緩存:很多系統(tǒng)數(shù)據(jù)量非常大,光靠本地緩存可能內(nèi)存空間不夠,這時(shí)候就可以考慮使用分布式緩存了,常用的分布式緩存有redis、memcache這些key-value分布式緩存,這些分布式緩存一般也都提供了集群版本,能夠做到很好的高可用和高性能。
異步
異步也是處理高并發(fā)的一把利器,也是處理解耦的手段之一,業(yè)務(wù)系統(tǒng)之間的消息傳遞不是同步調(diào)用,而是將一個(gè)業(yè)務(wù)操作分為多個(gè)階段,每個(gè)階段之間通過共享數(shù)據(jù)的方式異步執(zhí)行。
在單一服務(wù)器內(nèi)部可通過多線程共享隊(duì)列的方式實(shí)現(xiàn)異步,處在業(yè)務(wù)操作前面的線程將輸出的內(nèi)容寫入隊(duì)列,后面的處理線程從隊(duì)列中取出數(shù)據(jù)進(jìn)行處理;在分布式系統(tǒng)中,多個(gè)服務(wù)器集群通過分布式消息隊(duì)列實(shí)現(xiàn)異步。
對于簡單的異步實(shí)現(xiàn)可以通過內(nèi)存隊(duì)列來實(shí)現(xiàn),對于需要高可用和高并發(fā)的系統(tǒng)一般來說都依靠商用的消息隊(duì)列中間件產(chǎn)品,Websphere MQ、Rabbit MQ、Rocket MQ等都是比較好的消息中間件產(chǎn)品。
冗余
為了保證系統(tǒng)的高可用,我們一般會(huì)對服務(wù)器和數(shù)據(jù)都進(jìn)行冗余備份,這樣可以保證在服務(wù)器宕機(jī)的情況下系統(tǒng)依然可以保證提供服務(wù)。
訪問和負(fù)載很小的應(yīng)用服務(wù)也必須部署至少兩臺(tái)服務(wù)器組成一個(gè)集群,就是為了通過冗余來實(shí)現(xiàn)高可用。數(shù)據(jù)庫要定期進(jìn)行全量備份,每天還要進(jìn)行增量備份,防止數(shù)據(jù)庫服務(wù)器出現(xiàn)異常導(dǎo)致數(shù)據(jù)丟失,對于實(shí)時(shí)的數(shù)據(jù)備份可以通過數(shù)據(jù)庫自帶的日志來進(jìn)行恢復(fù)。
總結(jié)
上面介紹的這些就是常用的一些高并發(fā)的設(shè)計(jì)模式,其中每一條都值得深入的研究,本文只是介紹了高并發(fā)設(shè)計(jì)時(shí)需要考慮的設(shè)計(jì)方案簡介,可以通過這些方案緩解壓力提高并發(fā)性能和高可用。、
感興趣可以加Java架構(gòu)師群獲取Java工程化、高性能及分布式、高性能、深入淺出。高架構(gòu)。性能調(diào)優(yōu)、Spring,MyBatis,Netty源碼分析和大數(shù)據(jù)等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨的直播免費(fèi)學(xué)習(xí)權(quán)限 都是大牛帶飛 讓你少走很多的彎路的 群..號(hào)是:855801563 對了 小白勿進(jìn) 最好是有開發(fā)經(jīng)驗(yàn)
注:加群要求
1、具有工作經(jīng)驗(yàn)的,面對目前流行的技術(shù)不知從何下手,需要突破技術(shù)瓶頸的可以加。
2、在公司待久了,過得很安逸,但跳槽時(shí)面試碰壁。需要在短時(shí)間內(nèi)進(jìn)修、跳槽拿高薪的可以加。
3、如果沒有工作經(jīng)驗(yàn),但基礎(chǔ)非常扎實(shí),對java工作機(jī)制,常用設(shè)計(jì)思想,常用java開發(fā)框架掌握熟練的,可以加。
4、覺得自己很牛B,一般需求都能搞定。但是所學(xué)的知識(shí)點(diǎn)沒有系統(tǒng)化,很難在技術(shù)領(lǐng)域繼續(xù)突破的可以加。
5.阿里Java高級(jí)大牛直播講解知識(shí)點(diǎn),分享知識(shí),多年工作經(jīng)驗(yàn)的梳理和總結(jié),帶著大家全面、科學(xué)地建立自己的技術(shù)體系和技術(shù)認(rèn)知!
轉(zhuǎn)載于:https://my.oschina.net/u/3959491/blog/2961433
總結(jié)
以上是生活随笔為你收集整理的互联网高并发架构设计模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTTPS协议入门
- 下一篇: springcloud(四):熔断器Hy