Java架構(gòu)高并發(fā)的解決方案是什么,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
在淥口等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,網(wǎng)絡(luò)營(yíng)銷推廣,外貿(mào)網(wǎng)站制作,淥口網(wǎng)站建設(shè)費(fèi)用合理。
1.應(yīng)用和靜態(tài)資源分離
剛開始的時(shí)候應(yīng)用和靜態(tài)資源是保存在一起的,當(dāng)并發(fā)量達(dá)到一定程度的時(shí)候就需要將靜態(tài)資源保存到專門的服務(wù)器中,靜態(tài)資源主要包括圖片、視頻、js、css和一些資源文件等,這些文件因?yàn)闆]有狀態(tài)所以分離比較簡(jiǎn)單,直接存放到響應(yīng)的服務(wù)器就可以了,一般會(huì)使用專門的域名去訪問。
通過不同的域名可以讓瀏覽器直接訪問資源服務(wù)器而不需要再訪問應(yīng)用服務(wù)器了。架構(gòu)圖如下:
2.頁面緩存
頁面緩存是將應(yīng)用生成的頁面緩存起來,這樣就不需要每次都生成頁面了,從而可以節(jié)省大量的CPU資源,如果將緩存的頁面放到內(nèi)存中速度就更快了。如果使用Nginx服務(wù)器就可以使用它自帶的緩存功能,當(dāng)然也可以使用專門的Squid 服務(wù)器。頁面緩存的默認(rèn)失效機(jī)制一班都是按緩存時(shí)間處理的,當(dāng)然也可以在修改數(shù)據(jù)之后手動(dòng)讓相應(yīng)的緩存失效。
頁面緩存主要是使用在數(shù)據(jù)很少發(fā)生變化的頁面,但是很多頁面是大部分?jǐn)?shù)據(jù)都很少發(fā)生變化,而其中很少一部分?jǐn)?shù)據(jù)變化頻率卻非常高,比如說一個(gè)顯示文章的頁面,正常來說完全可以靜態(tài)化,但是如果文章后面有“頂”和“踩”的功能而且顯示的有響應(yīng)的數(shù)量,這個(gè)數(shù)據(jù)的變化頻率就比較高了,這就會(huì)影響靜態(tài)化。這個(gè)問題可以用先生成靜態(tài)頁面然后使用Ajax來讀取并修改響應(yīng)的數(shù)據(jù),這樣就可以一舉兩得來,既可以使用頁面緩存也可以實(shí)時(shí)顯示一些變化頻率高的數(shù)據(jù)來。
其實(shí)大家都知道,效率最快、消耗最小的就是純靜態(tài)化的html頁面,所以我們盡可能使我們的網(wǎng)站上的頁面采用靜態(tài)頁面來實(shí)現(xiàn),這個(gè)最簡(jiǎn)單的方法其實(shí)也是最有效的方法。但是對(duì)于大量?jī)?nèi)容并且頻繁更新的網(wǎng)站,我們無法全部手動(dòng)去挨個(gè)實(shí)現(xiàn),于是出現(xiàn)了我們常見的信息發(fā)布系統(tǒng)CMS,像我們常訪問的各個(gè)門戶站點(diǎn)的新聞?lì)l道,甚至他們的其他頻道,都是通過信息發(fā)布系統(tǒng)來管理和實(shí)現(xiàn)的,信息發(fā)布系統(tǒng)可以實(shí)現(xiàn)最簡(jiǎn)單的信息錄入自動(dòng)生成靜態(tài)頁面,還能具備頻道管理、權(quán)限管理、自動(dòng)抓取等功能,對(duì)于一個(gè)大型網(wǎng)站來說,擁有一套高效、可管理的CMS是必不可少的。
除了門戶和信息發(fā)布類型的網(wǎng)站,對(duì)于交互性要求很高的社區(qū)類型網(wǎng)站來說,盡可能的靜態(tài)化也是提高性能的必要手段,將社區(qū)內(nèi)的帖子、文章進(jìn)行實(shí)時(shí)的靜態(tài)化,有更新的時(shí)候再重新靜態(tài)化也是大量使用的策略,像Mop的大雜燴就是使用了這樣的策略,網(wǎng)易社區(qū)等也是如此。
同時(shí),html靜態(tài)化也是某些緩存策略使用的手段,對(duì)于系統(tǒng)中頻繁使用數(shù)據(jù)庫(kù)查詢但是內(nèi)容更新很小的應(yīng)用,可以考慮使用html靜態(tài)化來實(shí)現(xiàn),比如論壇中論壇的公用設(shè)置信息,這些信息目前的主流論壇都可以進(jìn)行后臺(tái)管理并且存儲(chǔ)再數(shù)據(jù)庫(kù)中,這些信息其實(shí)大量被前臺(tái)程序調(diào)用,但是更新頻率很小,可以考慮將這部分內(nèi)容進(jìn)行后臺(tái)更新的時(shí)候進(jìn)行靜態(tài)化,這樣避免了大量的數(shù)據(jù)庫(kù)訪問請(qǐng)求。
3.集群與分布式
集群是每臺(tái)服務(wù)器都具有相同的功能,處理請(qǐng)求時(shí)調(diào)用那臺(tái)服務(wù)器都可以,主要起分流作用。
分布式是將不同的業(yè)務(wù)放到不同的服務(wù)器中,處理一個(gè)請(qǐng)求可能需要用到多臺(tái)服務(wù)器,這樣就可以提高一個(gè)請(qǐng)求的處理速度,而且集群和分布式也可以同時(shí)使用。
集群有兩個(gè)方式:一種是在靜態(tài)資源集群。另一種是應(yīng)用程序集群。靜態(tài)資源集群比較簡(jiǎn)單。應(yīng)用程序集群在處理過程中最核心的問題就是Session 同步問題。
Session 同步有兩種處理方式:一種是在Session 發(fā)生變化后自動(dòng)同步到其他服務(wù)器,另一種就是用個(gè)程序統(tǒng)一管理Session。所有集群的服務(wù)器都使用同一個(gè)Session,Tomcat 默認(rèn)使用就是***種方式,通過簡(jiǎn)單的配置就可以實(shí)現(xiàn),第二種方式可以使用專門的服務(wù)器安裝Mencached等高效的緩存程序統(tǒng)一來管理session,然后再應(yīng)用程序中通過重寫Request并覆蓋getSession 方法來獲取制定服務(wù)器中的Session。
對(duì)于集群來說還有一個(gè)核心的問題就是負(fù)載均衡,也就是接收到一個(gè)請(qǐng)求后具體分配到那個(gè)服務(wù)器去處理的問題,這個(gè)問題可以通過軟件處理也可以使用專門的硬件(如:F5)解決。
4. 反向代理
反向代理指的是客戶端直接訪問的服務(wù)器并不真正提供服務(wù),它從別的服務(wù)器獲取資源然后將結(jié)果返回給用戶。
圖:
4.1 反向代理服務(wù)器和代理服務(wù)器的區(qū)別
代理服務(wù)器的作用是代我門獲取想要的資源然后將結(jié)果返回給我們,所要獲取的資源是我門主動(dòng)告訴代理服務(wù)器的,比如,我門想訪問Facebook,但是直接訪問不了,這時(shí)就可以讓代理服務(wù)器訪問,然后將結(jié)果返回給我們。
反向代理服務(wù)器是我門正常訪問一臺(tái)服務(wù)器的時(shí)候,服務(wù)器自己去調(diào)用了別的服務(wù)器資源并將結(jié)果返回給我們,我門自己并不知道。
代理服務(wù)器是我們主動(dòng)使用的,是為我們服務(wù)的,他不需要有自己的域名;反向代理服務(wù)器是服務(wù)器自己試用的,我門并不知道,它有自己的域名,我門訪問它和訪問正常的網(wǎng)址沒有任何區(qū)別。
反向代理服務(wù)器主要有三個(gè)作用:
1. 可以作為前端服務(wù)器跟實(shí)際處理請(qǐng)求的服務(wù)器集成;
2. 可以做負(fù)載均衡
3. 轉(zhuǎn)發(fā)請(qǐng)求,比如說可以將不同類型的資源請(qǐng)求轉(zhuǎn)發(fā)到不同的服務(wù)器去處理。
5. cdn
cdn其實(shí)是一種特殊的集群頁面緩存服務(wù)器,他和普通集群的多臺(tái)頁面緩存服務(wù)器相比,主要是它存放的位置和分配請(qǐng)求的方式有點(diǎn)特殊。CDN 服務(wù)器是分布在全國(guó)各地的,當(dāng)接收到用戶請(qǐng)求后會(huì)將請(qǐng)求分配到最合適的CDN服務(wù)器節(jié)點(diǎn)獲取數(shù)據(jù)。比如聯(lián)通的用戶分配到聯(lián)通的節(jié)點(diǎn),上海的用戶分配到上海的節(jié)點(diǎn)。
CDN的每個(gè)節(jié)點(diǎn)其實(shí)就是一個(gè)頁面緩存服務(wù)器,如果沒有請(qǐng)求資源的緩存就會(huì)從主服務(wù)器獲取,否則直接返回緩存的頁面。
CDN分配請(qǐng)求(負(fù)載均衡)的方式是用專門的CDN域名解析服務(wù)器在解析域名的時(shí)候就分配好的。一般的做法是在ISP哪里試用CNAME將域名解析到一個(gè)特定的域名,然后再將解析到的那個(gè)域名用專門的CDN服務(wù)器解析道相應(yīng)的CDN節(jié)點(diǎn)。如圖。
第二步訪問CDN的DNS服務(wù)器是應(yīng)為CNAME記錄的目標(biāo)域名使用NS記錄指向了CDN的DNS服務(wù)器。CDN的每個(gè)節(jié)點(diǎn)可能也是集群了多臺(tái)服務(wù)器。
6. 底層的優(yōu)化
前面說的所有都是架構(gòu)都是建立在最前面介紹的基礎(chǔ)結(jié)構(gòu)之上的。很多地方都需要通過網(wǎng)絡(luò)傳輸數(shù)據(jù),如果可以加快網(wǎng)絡(luò)傳輸?shù)乃俣龋菍?huì)讓整個(gè)系統(tǒng)得到改善。
7.數(shù)據(jù)庫(kù)集群和庫(kù)表散列
大型網(wǎng)站都有復(fù)雜的應(yīng)用,這些應(yīng)用必須使用數(shù)據(jù)庫(kù),那么在面對(duì)大量訪問的時(shí)候,數(shù)據(jù)庫(kù)的瓶頸很快就能顯現(xiàn)出來,這時(shí)一臺(tái)數(shù)據(jù)庫(kù)將很快無法滿足應(yīng)用,于是我們需要使用數(shù)據(jù)庫(kù)集群或者庫(kù)表散列。
在數(shù)據(jù)庫(kù)集群方面,很多數(shù)據(jù)庫(kù)都有自己的解決方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是類似的方案,您使用了什么樣的DB,就參考相應(yīng)的解決方案來實(shí)施即可。
上面提到的數(shù)據(jù)庫(kù)集群由于在架構(gòu)、成本、擴(kuò)張性方面都會(huì)受到所采用DB類型的限制,于是我們需要從應(yīng)用程序的角度來考慮改善系統(tǒng)架構(gòu),庫(kù)表散列是常用并且最有效的解決方案。我們?cè)趹?yīng)用程序中安裝業(yè)務(wù)和應(yīng)用或者功能模塊將數(shù)據(jù)庫(kù)進(jìn)行分離,不同的模塊對(duì)應(yīng)不同的數(shù)據(jù)庫(kù)或者表,再按照一定的策略對(duì)某個(gè)頁面或者功能進(jìn)行更小的數(shù)據(jù)庫(kù)散列,比如用戶表,按照用戶ID進(jìn)行表散列,這樣就能夠低成本的提升系統(tǒng)的性能并且有很好的擴(kuò)展性。sohu的論壇就是采用了這樣的架構(gòu),將論壇的用戶、設(shè)置、帖子等信息進(jìn)行數(shù)據(jù)庫(kù)分離,然后對(duì)帖子、用戶按照板塊和ID進(jìn)行散列數(shù)據(jù)庫(kù)和表,最終可以在配置文件中進(jìn)行簡(jiǎn)單的配置便能讓系統(tǒng)隨時(shí)增加一臺(tái)低成本的數(shù)據(jù)庫(kù)進(jìn)來補(bǔ)充系統(tǒng)性能。
8. 小結(jié)
網(wǎng)站架構(gòu)的整個(gè)演變過程主要是圍繞大數(shù)據(jù)和高并發(fā)這兩個(gè)問題展開的,解決方案主要分為使用緩存和多資源兩種類型。多資源主要指多存儲(chǔ)(包括多內(nèi)存)、多CPU和多網(wǎng)絡(luò),對(duì)于多資源來說又可以分為單個(gè)資源處理一個(gè)完整的請(qǐng)求和多個(gè)資源合作處理一個(gè)請(qǐng)求兩種類型,如多存儲(chǔ)和多CPU中的集群和分布式,多網(wǎng)絡(luò)中的CDN和靜態(tài)資源分離。理解了整個(gè)思路之后就抓住了架構(gòu)演變的本質(zhì),而且自己可能還可以設(shè)計(jì)出更好的架構(gòu)。
其它簡(jiǎn)單總結(jié):
首先,我認(rèn)為解決問題之前首先要有清晰的思路,如果只是用來別人的解決方案那也只能是拿來主義,沒有真正理解,沒有做到舉一反三。
海量數(shù)據(jù)和高并發(fā)經(jīng)常被連在一塊說事兒,雖然他們完全是兩回事兒。海量數(shù)據(jù)純指的是數(shù)據(jù)庫(kù)的海量數(shù)據(jù),而并發(fā)指的卻包括數(shù)據(jù)庫(kù)和服務(wù)器的高訪問量。
那么問題來了,既然是數(shù)據(jù)庫(kù)的數(shù)據(jù)量大,那怎么辦呢?要想解決問題,首先要知道問題是什么!!!那么海量數(shù)據(jù)會(huì)給我?guī)硎裁礃拥膯栴}呢?
海量數(shù)據(jù)帶來的問題無非就是增刪改查的問題,除了之外還能有啥問題呢?總不能是帶來安全問題吧(打臉一,還真有可能是安全問題)
1 數(shù)據(jù)庫(kù)訪問緩慢
2 插入更新緩慢,這個(gè)問題只能通過分庫(kù)分表解決
要解決數(shù)據(jù)庫(kù)訪問緩慢的問題還有幾種方法,既然訪問數(shù)據(jù)庫(kù)慢的話,在邏輯允許的情況下可以不訪問數(shù)據(jù)庫(kù)呢?
1 使用緩存
2 使用頁面靜態(tài)化
既然不訪問數(shù)據(jù)庫(kù)逃不過去了,那我們就對(duì)數(shù)據(jù)庫(kù)進(jìn)行優(yōu)化
3 優(yōu)化數(shù)據(jù)庫(kù)(包含的內(nèi)容非常多,比如參數(shù)配置,索引優(yōu)化,sql優(yōu)化等等)
4 分離數(shù)據(jù)庫(kù)中活躍的數(shù)據(jù)
5 讀寫分離
6 批量讀取和延遲修改;
7 使用搜索引擎搜索數(shù)據(jù)庫(kù)中的數(shù)據(jù);
8 使用NOSQL和Hadoop等技術(shù);
9 進(jìn)行業(yè)務(wù)的拆分;
高并發(fā)的解決方案
其實(shí)這個(gè)問題必須結(jié)合上面的海量數(shù)據(jù)來討論,什么情況下會(huì)出現(xiàn)高并發(fā)呢?一定是平時(shí)訪問量就比較大的情況,那么平時(shí)訪問量比較大相應(yīng)的數(shù)據(jù)存儲(chǔ)也就越來越多,這都是相輔相成的,當(dāng)然也有個(gè)例,比如剛需,比如12306,這里的高并發(fā)相比于它的數(shù)據(jù)來說已經(jīng)不算海量了。那么平時(shí)訪問量大如何解決呢?因?yàn)檫@里牽扯到服務(wù)器和數(shù)據(jù)庫(kù)的問題,所以要從這兩方面來進(jìn)行優(yōu)化
1 增加web服務(wù)器數(shù)量,也就是做集群,做負(fù)載均衡。既然一臺(tái)服務(wù)器無法完成任務(wù),那就多用幾臺(tái),幾臺(tái)不夠用機(jī)房
在通向第二種解決方法之前,還有沒有除了數(shù)據(jù)庫(kù)服務(wù)器之外能做的一些優(yōu)化手段呢?當(dāng)然有
1.1 頁面緩存
1.2 cdn
1.3 反向代理
1.4 應(yīng)用程序和靜態(tài)資源分離(比如***下載的資源單獨(dú)放在一起,給這臺(tái)服務(wù)器提供很高的帶寬資源)
2 增加數(shù)據(jù)庫(kù)服務(wù)器數(shù)量,同樣做集群,做負(fù)載均衡。
海量數(shù)據(jù)的解決方案
1 使用緩存
好多事情都是相輔相成的,相比來說使用緩存更多是用來解決高并發(fā)問題的,因?yàn)楹A繑?shù)據(jù)導(dǎo)致了訪問的緩慢,容易造成高并發(fā)問題的嚴(yán)重性,又因?yàn)閿?shù)據(jù)庫(kù)一般是web訪問的瓶頸,所以我們?cè)跇I(yè)務(wù)邏輯允許的情況下盡量先避免操作數(shù)據(jù)庫(kù),于是,就有了緩存。將必要的數(shù)據(jù)存放在內(nèi)存中,而不必每次都去數(shù)據(jù)庫(kù)中讀取造成不必要的性能浪費(fèi)和加快訪問速度---這就是緩存帶來的好處。那使用緩存以及選用管理緩存軟件時(shí)應(yīng)該注意些什么東西呢?
2 分離數(shù)據(jù)庫(kù)中的活躍數(shù)據(jù)
為什么要分離呢?說一個(gè)我實(shí)際環(huán)境中遇到的問題吧!有一個(gè)表只有10幾個(gè)字段,表有130萬條數(shù)據(jù),但大小已經(jīng)到了5G的數(shù)據(jù),這本身是不太合理的,這么少的數(shù)據(jù)占用了太多的數(shù)據(jù),說明其中有些字段存儲(chǔ)了大量的字符串(比如說文章內(nèi)容等),每次檢索這個(gè)表時(shí)大部分是用不到這些大字段內(nèi)容的,但卻需要耗時(shí)比較長(zhǎng),產(chǎn)生很多的慢日志。這時(shí)我們可以考慮將表進(jìn)行垂直切分,將活躍數(shù)據(jù)分離開來,這樣能大大加快訪問速度。
看完上述內(nèi)容,你們掌握J(rèn)ava架構(gòu)高并發(fā)的解決方案是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)頁題目:Java架構(gòu)高并發(fā)的解決方案是什么
網(wǎng)站URL:http://www.chinadenli.net/article18/peicgp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、商城網(wǎng)站、做網(wǎng)站、網(wǎng)站排名、網(wǎng)站營(yíng)銷、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)