论坛首页 编程语言技术论坛

Java系统是否可以模仿ROR使用fastcgi呢

浏览 7259 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-06-08  
看了potian,robbin的介绍,我也去下了lighttpd,感觉确实比apache快多了。
我开始想用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的可靠性怎么样, 有没有人尝试过?
   发表时间: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实例已经足够好了,瓶颈已经转移到数据库访问上了。
0 请登录后投票
   发表时间: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访问提供点动态内容嘛。
0 请登录后投票
   发表时间:2006-06-09  
页面缓存确实很好,但是需要仔细规划什么能缓存什么不能,能缓存的部分有效期又是多久(何时过期再刷新),这些要根据具体应用来调整,比较麻烦的。不像数据库缓存那样简单通用。

不需要Java/Ruby是什么意思?不明白,服务端总要东西来编写巴。
0 请登录后投票
   发表时间:2006-06-12  
cookoo 写道
页面缓存确实很好,但是需要仔细规划什么能缓存什么不能,能缓存的部分有效期又是多久(何时过期再刷新),这些要根据具体应用来调整,比较麻烦的。不像数据库缓存那样简单通用。


确实,这和应用相关。我现在是在业务逻辑层判断缓存页面的有效期,使用annotation进行配置,而不用hard code。
数据库缓存是比较简单,但是它的有效性不如页面缓存,还有分布式环境下的额外同步开销。
很难想到有比页面缓存更快的方案了,不仅是在服务器缓存,而且可以充分利用浏览器缓存。此外,页面缓存只存储一份,由前端WEB服务器访问,后台无论多少台业务服务器都没关系。

引用
不需要Java/Ruby是什么意思?不明白,服务端总要东西来编写巴。


抱歉,我没说清楚。我是指不要这些语言的WEB框架(例如tomcat),只用它们写单纯的服务程序,完成业务逻辑。它们通过factcgi/socket/webservices等接口和外界交互。
如果采用这个架构,Java目前应该比Ruby强很多吧。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics