高并發(fā)網站架構解決方案_第1頁
高并發(fā)網站架構解決方案_第2頁
高并發(fā)網站架構解決方案_第3頁
高并發(fā)網站架構解決方案_第4頁
高并發(fā)網站架構解決方案_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、一個小型的網站,比如個人網站,可以使用最簡單的html靜態(tài)頁面就實現(xiàn)了,配合一些圖片達到美化效果,所有的頁面均存放在一個目錄下,這樣的網站對系統(tǒng)架構、性能的要求都很簡單,隨著互聯(lián)網業(yè)務的不斷豐富,網站相關的技術經過這些年的發(fā)展,已經細分到很細的方方面面,尤其對于大型網站來說,所采用的技術更是涉及面非常廣,從硬件到軟件、編程語言、數(shù)據庫、 Webserver、防火墻等各個領域都有了很高的要求,已經不是原來 簡單的html靜態(tài)網站所能 比擬的。大型網站,比如門戶網站。在面對大量用戶訪問、高并發(fā)請求方面,基本的解決方案集 中在這樣幾個環(huán)節(jié):使用高性能的服務器、高性能的數(shù)據庫、高效率的編程語言、還有高

2、性能的Web容器。但是除了這幾個方面,還沒法根本解決大型網站面臨的高負載和高并發(fā)問 題。上面提供的幾個解決思路在一定程度上也意味著更大的投入,并且這樣的解決思路具備瓶頸,沒有很好的擴展性,下面我從低成本、高性能和高擴張性的角度來說說我的一些經驗。1、HTML靜態(tài)化其實大家都知道,效率最高、消耗最小的就是純靜態(tài)化的html頁面,所以我們盡可能使我們的網站上的頁面采用靜態(tài)頁面來實現(xiàn),這個最簡單的方法其實也是最有效的方法。但是對于大量內容并且頻繁更新的網站,我們無法全部手動去挨個實現(xiàn),于是出現(xiàn)了我們常見的信息發(fā)布系統(tǒng) CMS,像我們常訪問的各個門戶站點的新聞頻道,甚至他們的其他頻道,都是通過信息發(fā)布

3、系統(tǒng)來管理和實現(xiàn)的,信息發(fā)布系統(tǒng)可以實現(xiàn)最簡單的信息錄入自動生成靜態(tài)頁面,還能具備頻道管理、權限管理、自動抓取等功能,對于一個大型網站來說,擁有一套高效、可管理的 CMS是必不可少的。除了門戶和信息發(fā)布類型的網站,對于交互性要求很高的社區(qū)類型網站來說,盡可能的靜態(tài)化也是提高性能的必要手段,將社區(qū)內的帖子、文章進行實時的靜態(tài)化,有更新的時候再重新靜態(tài)化也是大量使用的策略,像Mop的大雜繪就是使用了這樣的策略,網易社區(qū)等也是如此。同時,html靜態(tài)化也是某些緩存策略使用的手段,對于系統(tǒng)中頻繁使用數(shù)據庫查詢但是內容更新很小的應用,可以考慮使用html靜態(tài)化來實現(xiàn),比如論壇 中論壇的公用設置信息,這些

4、信息目前的主流論壇都可以進行后臺管理并且存儲再數(shù)據庫中,這些信息其實大量被前臺程序調用,但是更新頻率很小,可以考慮將這部分內容進行后臺更新的時候進行靜態(tài)化,這樣避免了大量的數(shù)據庫訪問請求。一下是一個 SSH下的html靜態(tài)化例子用Article表來演示下頁面靜態(tài)化,在此做記錄,便于今后參考。這里是基于SSH2架構來演示的。1演示工程整體結構概覽;-UHLRawr j teE 月 src-田 tflm, htdt, tEEt7 .U acticmJ.cleAction.-.j dso 曲U Li cl . ava-中 Jiiodel十.krticla jArticle, hbm.ismlE 田

5、servicei -田 impl:+ Jj Arti cliSivi cLfhpl. jiv* + J! ir + i cl eer vi ce . jW .召 Utils+ l7 Crest sStatiHTML. j ivi-呂 eon 5jriiig applicati onCoMext. sialX_ Etruts.Mini4 匡.JRE System Libirary VTASG. 1 Jj-皀張 Java EE 5 Librari es+ 三 ltd=_lib- (Av WebConteni亍 ittml-._S訃X urlrwri te xml 誥 web.article, js

6、pLTtLCl 1. jsp這里我引入了 htdz_lib這么個User Libraliry,包含了 SSH2整合所需的jar以及urlrewrite.jar。同時urlrewrite.xml也已創(chuàng)建于 WEB-INF 下。2. Article表預覽名稱類型可為空默認存儲注釋ARTICLEIDNUMEEF?-rSEQ ARTICLEIDTYPECHARflj分類TITLEVARCHAR2(5D)編題CONTENTVARCHAR2flOOGil,JT17AUTHERNUMBER* p 1作者|CREATETiMEDATE創(chuàng)建時間HADSTATICCHAR * J7是否己靜態(tài)化Q;否*是.STAT

7、USCHAR1)T P |快態(tài)0:有效;1:無妣我們給Article表增加個HadStatic字段,用以標識此文章是否已靜態(tài)化。我們不建議添加一篇文章就直接生成對應的靜態(tài)頁面,如果都沒有用戶來閱讀,服務器就徒增了大量html文件,浪費資源。所以我們一般采用訪問生成策略:用戶訪問某文章,判斷服務器是否存在此文章對應的靜態(tài)頁,存在則直接重定向到此靜態(tài)頁面,不存在則執(zhí)行靜態(tài)化,然后再重定向到生成的靜態(tài)頁。然而每次通過10去查找文件是否存在,耗費性能,所以像Article這類表加個HadStatic 字段,直接判斷字段的值來決定是否靜態(tài)化顯得合理多了。3. 配置 web.xml1. 2. 3. con

8、 textC on figLocati on4. 5. classpath:c on f/spri ng/applicati onCon text.xml6. 7. 8. 9. 10. 11. org.spri ngframework.web.c on text.C on textLoaderListe ner12. 13. 14.14. 15. 16. struts2 18.19.org.apache.struts2.dispatcher.FilterDispatcher3.struts2 24./* 25.REQUEST/dispatcher26.FORWARDdisp

9、atcher27.INCLUDE1.UrlRewriteF.tuckey.web.filters.urlrewrite.UrlRewriteFilter33.34. logLevel 35. WARN/param-value9.UrlRewriteFilter40./* 41.其它你懂的,就是修改了struts2的過濾器的filter-mapping/ ,增加了幾個(dispatcher/, WHY?后面會講到。另外再加了個urlrewrite的過濾器。4. 配置 applicationContext.xml1. 2. 3. 其他d

10、ataSource、sessionFactory、事務等配置,不是本帖的重點,略去了。bea n這里我在beans/中用了 default-autowire=byName 讓spring自動裝配依賴的了。5. 下面貼上各層的代碼以下是 ArticleDao.java1.public class ArticleDaoextends HibernateDaoSupport 2.3.SuppressWarnings (unchecked)4.public List listArticles() 5.return (List)this .getHibernateTemplate().find(from

11、 Article a order by a.articleID);6.7.8.public Article getArticleByID(Lo ng articleID) 9.return (Article)this .getHibernateTemplate().get(Article.class ,articleID);10.11.12.public void staticArticle(Long articleID)13.Article article = getArticleByID(articleID);14.article.setHadStatic(1);15.this .getH

12、ibernateTemplate().update(article);16.17.再是 ArticleService.java 及 ArticleServicelmpl.java1.publicin terfaceArticleService 2.3./*4.*查詢所有文章5.* return Article實例集合6.*/7.public List listArticles();8.9./*10.*獲取某篇文章11.* param articleID12.* return Article實例13.*/14.public Article getArticleByID(Long articleI

13、D);15.16./*17.*靜態(tài)化某篇文章18.* param articleID19.*/20.public void staticArticle(Long articleID);21.22.1.public class ArticleServicelmpIimplements ArticleService 2.3.private ArticleDao articleDao;4.5.public List listArticles() 6.return articleDao.l istArticles();7.8.9.public Article getArticleByID(Long a

14、rticleID) 10.return articleDao.getArticleByID(articleID);11.12.13.public void staticArticle(Long articleID)14.articleDao.staticArticle(articleID);15.16.17.public ArticleDao getArticleDao() 18.retu rnarticleDao;19.20.21.public void setArticleDao(ArticleDao articleDao) 22.this .articleDao = articleDao

15、;23.24.25.然后是 ArticleActio n.java1.public class ArticleActionextends ActionSupport 2.3.privateArticleService articleService;4.privateList articleList;5.privateArticle article;6.privateLong articleID;7.privateStri ng hadStatic;8.privateStri ng htmlName;9.10.publicString listArticles()throws Exception

16、11.articleList = articleService.listArticles();12.return SUCCESS;13.14.15.publicString showArticle()throws Exception16./靜態(tài)化文件名稱,我們以article_作為前綴,后面連接上articleID,讓其獨一無二;17.this .htmlName = article_+articleID;18./如果已經靜態(tài)化,則直接訪問靜態(tài)化頁面這里的hadStatic是作為參數(shù)從request中獲取到的19.if (1 .equals(hadStatic)20.retur n SUCCE

17、SS;21.22./原本此次操作應該訪問的article.jsp頁面23.Stri ng jsp_url =/article.jsp;24./要生成的靜態(tài)化文件路徑(我們統(tǒng)一放在html目錄下)25.Stri ng html_url = getRequest().getSessio n().getServletCo ntext().getRealPath()+/html/+this .htmlName+ .html;26./從數(shù)據庫里讀取Article 數(shù)據27.article = articleService.getArticleByID(articleID);28.getRequest()

18、.setAttribute(article,article);29./關鍵是這步,createHTML4Mapping()方法將原本輸出到JSP的輸出流轉到靜態(tài)頁去了30.CreateStaticHTML.createHTML4Mappi ng(getRequest(),getResp on se(), jsp_url, html_url);31.articleService.staticArticle(articleID);32.return SUCCESS;33.34.35.public HttpServletRequest getRequest()36.returnServletActi

19、o nCon text.getRequest();37.38.39.public HttpServletResp onse getResp on se()40.returnServletActio nCon text.getResp on se();41.42.43.這里省略了 getter、setter方法。CreateStaticHTML.java1. public class CreateStaticHTML 2.2. public static void createHTML4Mapping(HttpServletRequest request,3. HttpServletResp o

20、nse resp on se, Stri ng jsp_url, String html_url) 4. FileOutputStream fos =null ;5. try 6. ServletCo ntext sc = request.getSessio n().getServletC on text();7. RequestDispatcher rd = sc.getRequestDispatcher(jsp_url);8. final ByteArrayOutputStream os =new ByteArrayOutputStream();11.9. final ServletOut

21、putStream stream =new ServletOutputStream() public void write( byte data, int offset, int length) 12.os.wite(data, offset, le ngth);13.14.15.public void write( int b) throws IOException 16.os.write(b);17.18.;19.final Pri ntWriter pw =new Prin tWriter(new OutputStreamWriter(os);20.HttpServletResp ons

22、e rep =new HttpServletResp on seWrapper(resp on se) 21.public ServletOutputStream getOutputStream() 22.return stream;23.24.25.public Pri ntWriter getWriter() 26.return pw;27.28.;29.30.rd.i nclude(request, rep);31.pw.flush();32.fos =new FileOutputStream(html_url);33.os.writeTo(fos);34.35.catch (Servl

23、etException e) 36.e.pri ntStackTrace();37.catch (IOException e) 38.e.pri ntStackTrace();39.fin ally40.try 41.fos.close();42.catch (IOException e) 43.e.pri ntStackTrace();7.48.作為模版來實現(xiàn)靜mappding 方式。這里我們采用了 mapping方式實現(xiàn)靜態(tài)化。另外還有用freemarker態(tài)化的,將在用urlrewrite及mapping方式實現(xiàn)靜態(tài)化內做介紹。建議采用6.struts.xml1.2.

24、3./articleList.jsp.8./html/$htmlName.html9.10.7.頁面 articleList.jsp 及 article.jspF面是 articleList.jsp1.2.3. 文章列表 4.5.6. #v/th7. 類型 8. 標題 9. 內容 10. 作者 11.創(chuàng)建時間12. 狀態(tài) 9. $li.index+120. $article.type21. $article.title22. $fn:substring(article.content,0,20)23. $article.auther24. $

25、article.createTime25. $article.status26.27.a href =article_$article.articleID_$article.hadStatic.html查 看/重點在這里,需要 urlrewrite過濾器過濾到action1.32.33.F面是 article.jsp.分類:5.$article.type6.7.8.標題:9.$article.title10.11.12.內容:13.$article.c onten t14.15.16.作者:17.$article.auther18.19.20.創(chuàng)建時間:21.

26、$article.createTime22.23.24.狀態(tài):25.$article.status26.27.28.這里我們先看下靜態(tài)化的目標,總結如下:1. 直接返回已存在的靜態(tài)頁,減少服務端壓力;2. 隱藏真實訪問地址,增強系統(tǒng)安全性;3. 增加網站被搜索引擎爬蟲捕獲的概率;為了實現(xiàn)2和3的目標,我們還使用了urlrewrite偽靜態(tài)技術,把articleList.jsp的查看”鏈接編寫為查 看。8.在urlrewrite.xml里配置了轉向鏈接1. 2. 3. article_(/d+)_(0-1).html4. showArticle.action? articleID =$1&had

27、Static =$25. 6. 前面我們不是在 web.xml里配置了 urlrewrite過濾器嘛,這里的article_(/d+)_(0-1).html的請求被過濾成showArticle.actio n?articleID=$1 &hadStatic=$2這里的$1指第一個位置正則表達式的值,$2指第二個位置正則表達式的值,所以當我們點擊頁面的鏈接查 看后臺實際去訪問了showArticle.actio n?articleID=$article.articleID&hadStatic=$article.hadStatic。struts2的過濾器只過濾直接來自客戶端.action的requ

28、est請求。當我們訪問*.html時,通過urlrewrite過濾器在服務端用fowward轉成.action請求,struts2是不會處理的。所以我們前面修改了struts2的過濾器,增加了 至此,徹底完成了靜態(tài)化的目標,看下效果。,返回articleList.jsp顯示文章列表,瀏覽器輸入 http:/localhost:8080/listArticles.action鼠標移到第一篇文章的查看”鏈接處,查看狀態(tài)欄顯示地址0 Q lltp. Akcj IIIUSL: 30 Si/LlA5vCUO*收睛t 捷型作奢軟言1 1則三內諺劃試內容:測試向窖/胖囪蓉:i2011 army is.c1査

29、看躺內容劃試內客劃試內容更恫內牢i3Mi-04-fl71宜看J5蒯謚桿ST12&11-OLJ&7 10:27 HO1香巖j4躺內務測試內護測試加唄勰內哥|4i20II-OM7 1D;:7 16.Q1亙看55瀾試襖題匚n容潮試內容測試內容悖內幫20:l-04-ri::2_:1http 歸cah os: M 00/b itide_l_O. htnl說明請求的 articlelD 是 1, hadStatic 是 0, urlrewrite 在服務端將其 forward 成 showArticle.action?articlelD=1 &hadStatic=O生成靜態(tài)頁后重定向到靜態(tài)頁 articl

30、e 1.html:* httprSdECi. /htm/artide_l.htrnljfe坡矗I百度;SKtSVN 啦江戟考 油杭州雨房嚴詢凰(T1B&說聯(lián)*主產庫WM 用訓試鈿毛 4亡誕圉 槪f 甘祥 C$D.用ui+gw戒敘命廬加:了圈為類:18 =內莽:iM曲務1刊試向蓉:SMit肉容1測M蠱轡1削試為容創(chuàng)懐肉暮lifll詛由府liBIbt內蓉贈內蓉1圖慣肉癟iiM 試內容1M試內莓測試狗塔1皿問戌洛1測試內容朗訂內容1怦署:LMf:2011-04-07 io:zr:iao狀;K:1再次刷新 http:/localhost:8080/listArticles.action鼠標移動到第一篇

31、文章的 查看”連接處,看狀態(tài)欄顯示。*RSfF密建時何I1凋試肉客:則試內$ 1贖試肉春1擱試內容112011-(07 l&27:lia)1君”辛:訕魅內客則鍛內容習幗內容次恨內容:12:.-:-: : 丁芒:I苣看:5測試內容潮試山容詢幗內疼妝雌內帝11亙f井測試詢容硒試內年輒試訶容;測試內容-J-20U4H47 1O27;1M1耳5側剤諄劃試內容紉試內容斕誡丙蜜1201J4M-O7 l(U7:15J01 http ;/tocah o5EBO0O/3rticlflI_l J hcrri說明此文章已靜態(tài)化,點擊后將直接訪問html頁面,我們的工程里已經存在這個HTML頁面了- NsbConte

32、ntH* =ai七i. htiftl+MEIA-IBTb Q EE-IITF、亠 lib黑- ILurlr frwr i t a xmlX web. xrnLif article.Jspj- urticleLitt.Jsp2、圖片服務器分離大家知道,對于 Web服務器來說,不管是 Apache IIS還是其他容器,圖片是最消耗 資源的,于是我們有必要將圖片與頁面進行分離,這是基本上大型網站都會采用的策略, 他們都有獨立的圖片服務器,甚至很多臺圖片服務器。這樣的架構可以降低提供頁面訪問 請求的服務器系統(tǒng)壓力,并且可以保證系統(tǒng)不會因為圖片問題而崩潰,在應用服務器和圖片服務器上,可以進行不同的配置優(yōu)

33、化,比如apache在配置ContentType的時候可以盡量少支持,盡可能少的 LoadModule,保證更高的系統(tǒng)消耗和執(zhí)行效率。3、數(shù)據庫集群和庫表散列(表散列與水平分割相似,但沒有水平分割那樣的明顯分割 界限,采用Hash算法把數(shù)據分散到各個分表中,這樣10更加均衡)大型網站都有復雜的應用,這些應用必須使用數(shù)據庫,那么在面對大量訪問的時候,數(shù)據庫的瓶頸很快就能顯現(xiàn)出來,這時一臺數(shù)據庫將很快無法滿足應用,于是我們需要使用數(shù)據庫集群或者庫表散列。在數(shù)據庫集群方面,很多數(shù)據庫都有自己的解決方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是類似

34、的方案,您使用了什么樣的 DB ,就參 考相應的解決方案來實施即可。上面提到的數(shù)據庫集群由于在架構、 成本、擴張性方面都會受到所采用DB類型的限制,于是我們需要從應用程序的角度來考慮改善系統(tǒng)架構,庫表散列是常用并且最有效的解決方案。我們在應用程序中安裝業(yè)務和應用或者功能模塊將數(shù)據庫進行分離,不同的模塊對應不同的數(shù)據庫或者表,再按照一定的策略對某個頁面或者功能進行更小的數(shù)據庫散列,比如用戶表,按照用戶ID進行表散列,這樣就能夠低成本的提升系統(tǒng)的性能并且有很好的擴 展性。sohu的論壇就是采用了這樣的架構,將論壇的用戶、設置、帖子等信息進行數(shù)據庫分離,然后對帖子、用戶按照板塊和ID進行散列數(shù)據庫和

35、表,最終可以在配置文件中進行簡單的配置便能讓系統(tǒng)隨時增加一臺低成本的數(shù)據庫進來補充系統(tǒng)性能。4、緩存緩存一詞搞技術的都接觸過,很多地方用到緩存。網站架構和網站開發(fā)中的緩存也是非常重要。這里先講述最基本的兩種緩存。高級和分布式的緩存在后面講述。架構方面的緩存,對 Apache比較熟悉的人都能知道 Apache提供了自己的緩存模塊, 也可以使用外加的 Squid模塊進行緩存,這兩種方式均可以有效的提高Apache的訪問響應能力。網站程序開發(fā)方面的緩存,Linux上提供的Memory Cache是常用的緩存接口, 可以在 web開發(fā)中使用,比如用Java開發(fā)的時候就可以調用 MemoryCache對一些數(shù)據進行緩存 和通訊共享,一些大 型社區(qū)使用了這樣的架構。另外,在使用web語言開發(fā)的時候,各種語言基本都有自己的緩存模塊和方法,PHP有Pea

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論