很多人访问一个action,action访问数据库读取数据。 暂时不过多考虑框架方面,不想在数据库方面优化。最终找到2套解决方案。
1.内存缓存数据:把从数据库查询的数据存入servletContext里,做个线程定时器进行刷新servletContext,设计一个立即更新servletContext的方法。2.物理硬盘存储:动态生成html静态页面,做个线程定时器进行刷新生成静态页,设计一个立即更新生成静态页方法。这两天方案访问action 都以“计时器”间隔时间,判断是否访问数据库。通过立即更新方法保证必要数据的时时性。先说下我对这里个方案的评价。1、由于访问数据放入内存,当客户端请求的时候可做最快的提取操作。不过依然进行jsp反射显示并生成(serlvet过程不详细说明)html发送到客户端。2、生成静态页html放入硬盘,当客户端请求是要把返回目标指向html静态页位置进行返回。这是我的基本想法,我觉得直接生成静态页方案更好一些。可是有人说存入servletContext里好。只是一些简单优化方案,希望大家能一起交流下思想! 同时留下个疑问“可不可以直接把 压力过大页面直接放入缓存,每次读取直接内存返回?”
1.内存缓存数据:把从数据库查询的数据存入servletContext里,做个线程定时器进行刷新servletContext,设计一个立即更新servletContext的方法。2.物理硬盘存储:动态生成html静态页面,做个线程定时器进行刷新生成静态页,设计一个立即更新生成静态页方法。这两天方案访问action 都以“计时器”间隔时间,判断是否访问数据库。通过立即更新方法保证必要数据的时时性。先说下我对这里个方案的评价。1、由于访问数据放入内存,当客户端请求的时候可做最快的提取操作。不过依然进行jsp反射显示并生成(serlvet过程不详细说明)html发送到客户端。2、生成静态页html放入硬盘,当客户端请求是要把返回目标指向html静态页位置进行返回。这是我的基本想法,我觉得直接生成静态页方案更好一些。可是有人说存入servletContext里好。只是一些简单优化方案,希望大家能一起交流下思想! 同时留下个疑问“可不可以直接把 压力过大页面直接放入缓存,每次读取直接内存返回?”
如果你说的是Struts的action,那么立足点是错误的。action是ThreadLocal。
1. Memcache
2. StaticContext
都有现成的解决方案。
同时感谢runffer_yang、ldh911的回复,我度娘了下,虽然不算太懂。现在不牵扯任何框架。
最简陋的访问流程: 客户端发送请求到服务器,服务器拦截处理(此处我喜欢称action、当然servlet也行)做出反应。返回html到客户端。
内存存储整个页面我觉得也是不错,喜欢物理硬盘储存的是因为可以让整个动态网站完全变成静态。全自动生成。还可以用伪静态进行物理定位。
访问时连Action都不走,直接访问HTML,里面的所有超链接都直接指向各个HTML
连servlet都不走
可能我没说清楚我的建议方案,有几个前提先需要明确下:
◎ 即便是静态资源,比如js、css、gif文件,Weblogic的处理效率也要比Apache低最少1个数量级,更不要说类似于EngineX这样的轻量级服务器了;
◎ 缓存需要考虑的额外两个问题是:1、如何便捷的更新;2、更新时如何不造成影响。依据上面的这两个前提,我们其实可以初步有一些推论:
◎ 仅最大努力不要让请求落到Weblogic身上;
◎ 类似于Apache所提供的MemCache机制,可以将大量请求通过缓存给处理掉;此外,设置缓存过期时间可以便捷的解决内容的更新问题;
◎ 类似于Apache所提供的MemCache机制,在大并发量情况下,一旦MemCache过期,所有请求压力将直接落到Weblogic身上;根据这两个推论,引申出我建议的方案:
◎ Weblogic服务器,负责将更新的内容,作为静态资源,发布到Web服务器上;
◎ Web服务器(Apache、EngineX),负责所有静态资源请求的本地化处理;
◎ 考虑到磁盘效率访问的底下,将内存虚拟为存储,作为Web服务器的资源目录。
◎ 访问控制:是否需要授权才能访问?还是完全公开型的?
◎ 资源规模:MB?GB?TB? 或者: 数千个?数十万个?数千万个?
◎ 时效性:对交互时效性的需求程度:实时?分钟?小时?对于这两个问题进行谨慎分析后,你会发现很多问题会有不同的答案,最终都是组合结果,没有一招制敌的。其实CSDN就是一个非常非常好的例子:
◎ 访问控制:浏览可以完全公开;但发言需要授权。
◎ 资源规模:数千万。
◎ 时效性:分钟。但是你看看CSDN这些帖子的页面后缀都是什么? html
所以静态页面未必不能满足互动要求,关键是你怎么把各功能需求进行合理切分。至于要不要采用内存虚拟为存储,完全看资源规模和访问频度的综合性价比,如果你的总体资源规模才1G,但是访问频度是每秒几千次,那用内存为啥不好?内存压力再大也比你直接去压磁盘小。而类似CSDN,我相信用的应该是Web服务器自带缓存+磁盘存储,也就是并非使用我所说的模式。
至于集群就不在讨论范围了,这是必选项目。
然后又分别在4台服务器上安装了tomcat
是不是每个apache分别与这4个tomcat做集群
就行了呢?
不够,你还要解决2台Apache服务器自己如何集群(或者说负载均衡)的问题。理想的情况是前面有硬件负载均衡设备,不行的话就需要借助LVS之类的软件实现机制。
如果没有硬件负载均衡设备的话
那这2台apache服务器间的负载均衡应该如何配置呢?
不知道有没有相关资料
我查了很多,都是apache+N个tomcat的,这个我已经做到了
问题是,现在又需要重新架起一个apache
这个apache和之前的apache之间如何做,我不是很清楚
这个话题超越了Java技术论坛,可能你需要去找玩平台的论坛才能得到更专业的帮助了。
参考资料:
http://baike.baidu.com/view/645050.html?fromTaglisthttp://zh.linuxvirtualserver.org/
如果你非常想直接依赖于中间件能力来做的话,也是可以的。但JVM内存使用上存在限制,所以大概其需要用MemCache,直接放在JVM的HashMap里面容易OOM。可以写一个Filter,每当有请求来的时候,首先去MemCache中查找,找到了就直接向response输出即可(也别重定向了)。找不到就不管了。Servlet处理完毕后,需要先将结果写入MemCache,这样下次就可以直接使用。
最后补充上缓存过期时限即可。