浏览 7256 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-06-08
我开始想用lighttpd + N*jetty 的模式,但在一番尝试之后,发现lighttpd有一个缺点。就是rewrite不支持复杂的规则,例如: RewriteCond %{REQUEST_FILENAME} -f lighttpd无法在rewrite指令中判断一个物理文件是否存在。这个功能对我目前的设计很重要,因为我希望系统可以在运行时自动将动态页面转静态页面,这里面有一个关键逻辑是: 1.如果lighttpd判断一个url对应的物理文件不存在,就转给Java程序执行。 2.Java程序执行后返回结果后,同时在磁盘写成物理文件,以便其他的连接可以以静态方式访问。 3.Java程序负责维护这些物理文件的有效性和删除。 RewriteCond限制在lighttpd论坛上也有讨论,有人提出解决办法是利用server.error-handler-404,写cgi来做判断。 但我查找了lighttpd的cgi支持和fastcgi的资料后,发现与其采用下面的结构: lighttpd ---(cgi/fastcgi);---> perl/php --(http);----> jetty/tomcat -(local);->Java businness Layer 还不如直接一点,使用fastcgi的Java实现(www.fastcgi.com) ××× lighttpd ----(fastcgi);----> Java fastcgi接口 -(local);->Java businness Layer 这种方式感觉上甚至比常用的proxy对接模式要快 lighttpd ---(http proxy);-----> jetty/tomcat -->Java businness Layer 如果是这样,我相当于在Ajax之外,又使用了一个旧技术 -- Java Fastcgi,这个曾经被Sun的servlet彻底打败的模型。 但现在还是很犹豫,不知道Java Fastcgi的可靠性怎么样, 有没有人尝试过? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-06-08
我曾经想尝试用lighttpd去配合tomcat。但是经过尝试和思考以后,我的结论就是Java的解决方案和rails/PHP的就是完全不同,没有办法直接迁移。
有几方面的原因,主要是Java的序列化开销太高导致无法进行集中式全局变量存取,所以Java的方案没有办法做到SNA(Share nothing architecture),而必须采用Session sticky方案。lighttpd追求的是功能简单,所以不支持session sticky。因此就只能用apache。 另外Java启动开销很高的,而且Server JVM也做了很多必要优化,我很怀疑用FastCGI方式去跑的意义。 另外想说明的是,在单台物理服务器上面,两个tomcat实例已经足够好了,瓶颈已经转移到数据库访问上了。 |
|
返回顶楼 | |
发表时间:2006-06-09
robbin 写道 我曾经想尝试用lighttpd去配合tomcat。但是经过尝试和思考以后,我的结论就是Java的解决方案和rails/PHP的就是完全不同,没有办法直接迁移。
有几方面的原因,主要是Java的序列化开销太高导致无法进行集中式全局变量存取,所以Java的方案没有办法做到SNA(Share nothing architecture),而必须采用Session sticky方案。lighttpd追求的是功能简单,所以不支持session sticky。因此就只能用apache。 如果充分利用lighttpd的page cache,是否可以在后端减少对全局缓存的需求?对于个人信息缓存,使用cookie或者数据库(访问不频繁的数据)。 我最近一直在琢磨如何让Page Cache更加有效,动态页面实时转静态页的作用到底如何。我目前的思路是,结合DWR Ajax技术,不缓存整个用户界面,而缓存DWR调用的方法的返回数据。这样有很多好处: 1. 缓存有效性提高,一个界面通常由多个Ajax调用的结果组成,不同调用的生命期是不同的。分开缓存,可以提高有效性。 2. 基于方法缓存,就可以利用Java的method interceptor和Annotation来做方便的配置。例如 @MethodCache(maxInMemory=1000,secondsToLive=3600,autoUpdates = { @CacheUpdate(entity = Post.class, field="parent.owner.id",value="#p[0]");}); public PageObject findAllReplyForUserId(String userId, int start, 这样,不仅可以做定时失效的缓存,还可以和后台entity机制联动,做主动缓存清除。 3. 缓存的结果存为静态文件,由lighttpd直接服务。 4. 既然是静态页面,让Ajax调用利用http的if-modified 机制,减少browser和lighttpd之间的数据传输。 robbin 写道 另外Java启动开销很高的,而且Server JVM也做了很多必要优化,我很怀疑用FastCGI方式去跑的意义。
另外想说明的是,在单台物理服务器上面,两个tomcat实例已经足够好了,瓶颈已经转移到数据库访问上了。 FastCGI也是服务器方式,没有启动开销吧。 我有一个习惯,如果用一个外部工具,只能利用它10%的功能,那我想着换更简单的替代品。tomcat在我目前方案中就是这样。它提供的功能无非就是: 1. 给我的后台程序一个容器,提供http接口 2. 提供session管理功能 其他的功能例如静态页面、网站配置、动态部署、loadbalance等等,都是lighttpd完成的。tomcat的动态界面功能,我也用不上了,因为系统完全使用的Ajax+静态界面。Java Web服务器的多应用部署的功能好像也不实用,部署在一个Server里还不如多进程分离开来安全。 更进一步讲,我觉得,对于纯粹的Ajax应用来说,如果使用了native Web服务器,其他语言的Web服务器包括Java/Ruby,都是不需要的。各种语言的动态界面技术包括JSP/Ruby也都不需要了。大家都回到cgi的年代,思路重新回到fastcgi的解决方案上去。说白了不就是为Web访问提供点动态内容嘛。 |
|
返回顶楼 | |
发表时间:2006-06-09
页面缓存确实很好,但是需要仔细规划什么能缓存什么不能,能缓存的部分有效期又是多久(何时过期再刷新),这些要根据具体应用来调整,比较麻烦的。不像数据库缓存那样简单通用。
不需要Java/Ruby是什么意思?不明白,服务端总要东西来编写巴。 |
|
返回顶楼 | |
发表时间:2006-06-12
cookoo 写道 页面缓存确实很好,但是需要仔细规划什么能缓存什么不能,能缓存的部分有效期又是多久(何时过期再刷新),这些要根据具体应用来调整,比较麻烦的。不像数据库缓存那样简单通用。
确实,这和应用相关。我现在是在业务逻辑层判断缓存页面的有效期,使用annotation进行配置,而不用hard code。 数据库缓存是比较简单,但是它的有效性不如页面缓存,还有分布式环境下的额外同步开销。 很难想到有比页面缓存更快的方案了,不仅是在服务器缓存,而且可以充分利用浏览器缓存。此外,页面缓存只存储一份,由前端WEB服务器访问,后台无论多少台业务服务器都没关系。 引用 不需要Java/Ruby是什么意思?不明白,服务端总要东西来编写巴。
抱歉,我没说清楚。我是指不要这些语言的WEB框架(例如tomcat),只用它们写单纯的服务程序,完成业务逻辑。它们通过factcgi/socket/webservices等接口和外界交互。 如果采用这个架构,Java目前应该比Ruby强很多吧。 |
|
返回顶楼 | |