当前位置:文档之家› 高并发网站架构解决方案

高并发网站架构解决方案

一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单,随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的。

大型网站,比如门户网站。

在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。

但是除了这几个方面,还没法根本解决大型网站面临的高负载和高并发问题。

上面提供的几个解决思路在一定程度上也意味着更大的投入,并且这样的解决思路具备瓶颈,没有很好的扩展性,下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。

1、HTML静态化其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。

但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。

除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策略,像Mop的大杂烩就是使用了这样的策略,网易社区等也是如此。

同时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以考虑使用html静态化来实现,比如论坛中论坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。

一下是一个SSH下的html静态化例子用Article表来演示下页面静态化,在此做记录,便于今后参考。

这里是基于SSH2架构来演示的。

1.演示工程整体结构概览这里我引入了htdz_lib这么个User Libraliry,包含了SSH2整合所需的jar以及urlrewrite.jar。

同时urlrewrite.xml也已创建于WEB-INF下。

2.Article表预览我们给Article表增加个HadStatic字段,用以标识此文章是否已静态化。

我们不建议添加一篇文章就直接生成对应的静态页面,如果都没有用户来阅读,服务器就徒增了大量html文件,浪费资源。

所以我们一般采用访问生成策略:用户访问某文章,判断服务器是否存在此文章对应的静态页,存在则直接重定向到此静态页面,不存在则执行静态化,然后再重定向到生成的静态页。

然而每次通过IO去查找文件是否存在,耗费性能,所以像Article这类表加个HadStatic 字段,直接判断字段的值来决定是否静态化显得合理多了。

3.配置web.xml1.<!-- 定义Spring的装载器 -->2.<context-param>3.<param-name>contextConfigLocation</param-name>4.<param-value>5. classpath:conf/spring/applicationContext.xml6.</param-value>7.</context-param>8. <!-- 监听Spring装载器 -->9.<listener>10.<listener-class>11. org.springframework.web.context.ContextLoaderListener12.</listener-class>13.</listener>14.15. <!-- 定义Struts2核心过滤器 -->16.<filter>17.<filter-name>struts2</filter-name>18.<filter-class>19. org.apache.struts2.dispatcher.FilterDispatcher20.</filter-class>21.</filter>22.<filter-mapping>23.<filter-name>struts2</filter-name>24.<url-pattern>/*</url-pattern>25.<dispatcher>REQUEST</dispatcher>26.<dispatcher>FORWARD</dispatcher>27.<dispatcher>INCLUDE</dispatcher>28.</filter-mapping>29.30.<filter>31.<filter-name>UrlRewriteFilter</filter-name>32.<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>33.<init-param>34.<param-name>logLevel</param-name>35.<param-value>WARN</param-value>36.</init-param>37.</filter>38.<filter-mapping>39.<filter-name>UrlRewriteFilter</filter-name>40.<url-pattern>/*</url-pattern>41.</filter-mapping>其它你懂的,就是修改了struts2的过滤器的<filter-mapping/>,增加了几个<dispatcher/>,WHY?后面会讲到。

另外再加了个urlrewrite的过滤器。

4.配置applicationContext.xml1.<bean id="articleAction"class="com.htdz.test.action.ArticleAction"></bean>2.<bean id="articleService"class="com.htdz.test.service.impl.ArticleServiceImpl"></bean>3.<bean id="articleDao"class="com.htdz.test.dao.ArticleDao"></bean>其他dataSource、sessionFactory、事务等配置,不是本帖的重点,略去了。

这里我在<beans/>中用了default-autowire="byName"让spring自动装配依赖的bean 了。

5.下面贴上各层的代码以下是ArticleDao.java再是ArticleService.java及ArticleServiceImpl.java然后是ArticleAction.java这里省略了getter、setter方法。

CreateStaticHTML.java这里我们采用了mapping方式实现静态化。

另外还有用freemarker作为模版来实现静态化的,将在《用urlrewrite及mapping方式实现静态化》内做介绍。

建议采用mappding方式。

6.struts.xml7.页面articleList.jsp及article.jsp 下面是articleList.jsp下面是article.jsp这里我们先看下静态化的目标,总结如下:1.直接返回已存在的静态页,减少服务端压力;2.隐藏真实访问地址,增强系统安全性;3.增加网站被搜索引擎爬虫捕获的概率;为了实现2和3的目标,我们还使用了urlrewrite伪静态技术,把articleList.jsp的“查看”链接编写为<a href="article_${article.articleID}_${article.hadStatic}.html" target="_blank">查看</a>。

8.在urlrewrite.xml里配置了转向链接前面我们不是在web.xml里配置了urlrewrite过滤器嘛,这里的article_(/d+)_([0-1]).html 的请求被过滤成showArticle.action?articleID=$1&hadStatic=$2这里的$1指第一个位置正则表达式的值,$2指第二个位置正则表达式的值,所以当我们点击页面的链接<a href="article_${article.articleID}_${article.hadStatic}.html" target="_blank">查看</a>后台实际去访问了showArticle.action?articleID=${article.articleID}&hadStatic=${article.hadStatic}。

struts2的过滤器只过滤直接来自客户端.action的request请求。

相关主题