《java处理高并发高负载类网站的优化方法》由会员分享,可在线阅读,更多相关《java处理高并发高负载类网站的优化方法(16页珍藏版)》请在金锄头文库上搜索。
1、java处理高并发高负载类网站的优化方法一:高并发高负载类网站关注点之数据库没错,首先是数据库,这是大多数应用所面临的首个SPOF。尤其是Web2.0 的应用,数据库的响应是首先要解决的。一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加 到100万以上,那么,MySQL的效能急剧下降。常用的优化措施是M-S (主-从)方式进行同步复制,将查询和操作和分别在不同的服务器上进行操作。我推荐的是M-M-Slaves方式,2个主Mysql,多个Slaves, 需要注意的是,虽然有2个Mas ter,但是同时只有1个是Act ive,我 们可以在一定时候切换。之所以用2个M,是保证
2、M不会又成为系统的 SPOF。Slaves可以进一步负载均衡,可以结合LVS,从而将select操作适当的 平衡到不同的slaves上。以上架构可以抗衡到一定量的负载,但是随着用户进一步增加,你的用 户表数据超过1千万,这时那个M变成了 SPOFo你不能任意扩充Slaves, 否则复制同步的开销将直线上升,怎么办?我的方法是表分区,从业务 层面上进行分区。最简单的,以用户数据为例。根据一定的切分方式, 比如id,切分到不同的数据库集群去。全局数据库用于meta数据的查询。缺点是每次查询,会增加一次,比 如你要查一个用户nightsailer,你首先要到全局数据库群找到 nightsailer对
3、应的cluster id,然后再到指定的cluster找到 nightsailer的实际数据。每个cluster可以用m-m方式,或者m-m-slaves方式。这是一个可以 扩展的结构,随着负载的增加,你可以简单的增加新的mysql clus ter 进去。需要注意的是:1、禁用全部auto_increment的字段2、id需要采用通用的算法集中分配3、要具有比较好的方法来监控mysql主机的负载和服务的运行状态。如果你有30台以上的mysql数据库在跑就明白我的意思了。4、不要使用持久性链接(不要用pconnect),相反,使用sqlrelay这 种第三方的数据库链接池,或者干脆自己做,因为
4、php4中mysql的链 接池经常出问题。二:高并发高负载网站的系统架构之HTML静态化其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面, 所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简 单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的 网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布 系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他 频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现 最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、 自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的C
5、MS 是必不可少的。除了门户和信息发布类型的网站,对于交互性要求很高的社区类型 网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、 文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策 略,像Mop的大杂烩就是使用了这样的策略,网易社区等也是如此。 同时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用 数据库查询但是内容更新很小的应用,可以考虑使用html静态化来实 现,比如论坛中论坛的公用设置信息,这些信息目前的主流论坛都可 以进行后台管理并且存储再数据库中,这些信息其实大量被前台程序调 用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候 进行
6、静态化,这样避免了大量的数据库访问请求高并发。网站HTML静态化解决方案当一个Servlet资源请求到达WEB服务器之后我们会填充指定的JSP页 面来响应请求:HTTP请求Web服务器Servlet-业务逻辑处理-访问数据-填充JSP响应请求HTML静态化之后:HTTP请求一-Web服务器-一ServletHTML响应请求 静态访求如下Servlet:java view plaincopyprint?1. public void doGet(HttpServletRequest request, HttpServletResponse response)2. throws ServletExc
7、eption, IOException 3. if(request.getParameter(chapterld) != null)4. String chapterFileName =bookChapterRead_+request.getParameter(chapterId)+.html;5. String chapterFilePath = getServletContext().getRealPath(/) + chapterFileName;6. File chapterFile = new File(chapterFilePath);7. if(chapterFile.exist
8、s()response.sendRedirect(chapterFileName);return;/ /如果有这个文件就告诉浏览器转向8. INovelChapterBiz novelChapterBiz = new NovelChapterBizImpl();9. NovelChapter novelChapter =novelChapterBiz.searchNovelChapterById(Integer.parseInt(request.getParame t er(chap terId);/章节信息10. int lastPageId =novelChapterBiz.searchL
9、astCHapterId(novelChapter.getNovelId().getId(), novelChapter.getId();11. int nextPageId =novelChapterBiz.searchNextChapterId(novelChapter.getNovelId().getId(), novelChapter.getId();12. request.setAttribute(novelChapter, novelChapter);13. request.setAttribute(lastPageId, lastPageId);14. request.setAt
10、tribute(nextPageId, nextPageId);15. new CreateStaticHTMLPage().createStaticHTMLPage(request, response, getServletContext(),16. chapterFileName, chapterFilePath, /bookRead.jsp);17. 18. 生成HTML静态页面的类:java view plaincopyprint?1. package com.jb.y2t034.thefifth.web.servlet;2. import java.io.ByteArrayOutpu
11、tStream;3. import java.io.FileOutputStream;4. import java.io.IOException;5. import java.io.OutputStreamWriter;6. import java.io.PrintWriter;7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.import javax.servlet.RequestDispatcher;import javax.servlet.ServletContex
12、t;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;/*创建HTML静态页面*功能:创建HTML静态页面*时间:2009年1011日*地点:home* author mavk* */public cla
13、ss CreateStaticHTMLPage /*生成静态HTML页面的方法* param request 请求对象* param response 响应对象* param servletContext Servlet 上下文* param fileName 文件名称* param fileFullPath 文件完整路径* param jspPath需要生成静态文件的JSP路径(相对即可)* throws IOException* throws ServletException*/public void createStaticHTMLPage(HttpServletRequest requ
14、est,HttpServletResponse response,ServletContext servletContext,String fileName,String fileFullPath,String jspPath) throws ServletException, IOExceptionresponse.setContentType(text/html;charset=gb2312);/设置 HTML 结果流编码 (即HTML文件编码)RequestDispatcher rd = servletContext.getRequestDispatcher(jspPath);/得至卩
15、JSP资源37. final ByteArrayOutputStream byteArrayOutputStream = newByteArrayOutputStream();/用于从 ServletOutputStream 中接收资源38. final ServletOutputStream servletOuputStream = new ServletOutputStream()/ 用于从HttpServletResponse中接收资源39. public void write(byte b, int off,int len)40. byteArrayOutputStream.write(b, off, len);41. 42. public void write(int b)43. byteArrayOutputStream.write(b);44. 45. ;46. final PrintWriter printWriter = new PrintWriter(newOu tpu tSt reamWri ter(