本文已经发表于InfoQ中文站,(
大型Java Web项目的架构和部署问题)
<style type="text/css">
blockquote {background:#eee;font-size:12px;}</style>
一位ID是jackson1225的网友在javaeye询问了一个大型Web系统的架构和部署选型问题,希望能提高现有的基于Java的Web应用的服务能力。由于架构模式和部署调优一直是Java社区的热门话题,这个问题引发了很多热心网友的讨论,其中一些意见对其它大型Web项目也有很好的指导意义。在讨论之初jackson1225这样描述了当前的应用的架构和部署方案:
目前系统架构如下:
- web层采用struts+tomcat实现,整个系统采用20多台web服务器,其负载均衡采用硬件F5来实现;
- 中间层采用无状态会话Bean+DAO+helper类来实现,共3台weblogic服务器,部署有多个EJB,其负载均衡也采用F5来实现;
- 数据库层的操作是自己写的通用类实现的,两台ORACLE数据库服务器,分别存放用户信息和业务数据;一台SQL SERVER数据库,是第三方的业务数据信息;
web层调用EJB远程接口来访问中间件层。web层首先通过一个XML配置文件中配置的EJB接口信息来调用相应的EJB远程接口;
该系统中一次操作涉及到两个ORACLE库以及一个SQL SERVER库的访问和操作,即有三个数据库连接,在一个事务中完成。
这样的架构其实很多公司都在使用,因为Struts和Tomcat分别是最流行的Java Web MVC框架和Servlet容器,而F5公司的负载均衡是横向扩展常见的解决方案(例如配置session sticky方案)。由于这个系统中有跨数据源的事务,所以使用Weblogic Server EJB容器和支持两阶段提交的数据库驱动就可以保证跨数据源的事物完整性(当然,容器管理的分布式事务并非是唯一和最优的解决方案)。
但是随着Rod Johnson重量级的著作《J2EE Development without EJB》和其中的Spring框架的流行,轻量级框架和轻量级容器的概念已经深入人心。所以对于jackson1225提出的这个场景,大多数网友都提出了置疑,认为这个系统滥用了技术,完全是在浪费钱。网友们大都认为SLSB(无状态会话Bean)完全没有必要出现在这个场景中,认为SLSB通过远程接口访问本地资源会有很大的性能开销,这种观点也是Rod johnson在without EJB中批判EJB 2.x中的一大反模式。
由于JavaEE是一个以模式见长的解决方案,模式和架构在JavaEE中占有很重要的地位,所以很多业内专家也都警惕“反模式(Anti-patterns)”的出现。对于上面所述的方案是否是反模式,jackson1225马上站出来申辩:
我们项目就是把EJB作为一个Facade,只是提供给WEB层调用的远程接口,而且只用了无状态会话Bean,所以性能上还可以的。
这个解释很快得到了一些网友的认可,但是大家很快意识到架构的好坏决定于是否能够满足用户的需求,davexin(可能是jackson1225的同事)描述了这个系统的用户和并发情况:
现在有用户4000万,马上要和另一个公司的会员系统合并,加起来一共有9000万用户。数据量单表中有一亿条以上的数据。这是基本的情况,其实我觉得现在的架构还是可以的,现在支持的并发大概5000并发用户左右,接下来会进行系统改造,目标支持1万个并发用户。
具体的并发量公布后又有网友置疑这个数据,认为这个系统的Servlet容器支持的并发数太小,怀疑是否配置不够优化。davexin又补充了该项目的服务器配置:
系统前端tomcat都是用的刀片,配置在2G内存,cpu大概在2.0G,每台机器也就支持250-400个并发,再多的话,就会相应时间非常的常,超过20秒,失去了意义 ,所以我们才得出这样的结论的。
一位ID是cauherk的网友提出了比较中肯的意见,他没有从Web容器单纯的并发支持能力上提出改进方案,而是提出了对于类似的应用的一些通用的改进提示,这里摘要一下:
- 数据库压力问题
可以按照业务、区域等等特性对数据库进行配置,可以考虑分库、使用rac、分区、分表等等策略,确保数据库能正常的进行交易。
- 事务问题
要在两个数据库中操作,那么必须考虑到分布式事务。你应该仔细的设计你的系统,来避免使用分布式事务,以避免分布式事务带来更多的数据库压力和其它问题。推荐你采用延迟提交的策略(并不保证数据的完整),来避免分布式事务的问题,毕竟commit失败的几率很低。
- web的优化
将静态、图片独立使用不同的服务器,对于常态的静态文件,采用E-TAG或者客户端缓存, google很多就是这样干的。对于热点的功能,考虑使用完全装载到内存,保证绝对的响应速度,对于需要频繁访问的热点数据,采用集中缓存(多个可以采用负载均衡),减轻数据库的压力。
对于几乎除二进制文件,都应该在L4上配置基于硬件的压缩方案,减少网络的流量。提高用户使用的感知。
- 网络问题
可以考虑采用镜像、多路网络接入、基于DNS的负载均衡。如果有足够的投资,可以采用CDN(内容分发网),减轻你的服务器压力。
cauherk的这个分析比较到位,其中ETags的方案是最近的一个热点,InfoQ的“使用ETags减少Web应用带宽和负载”里面对这种方案有很详细的介绍。一般以数据库为中心的Web应用的性能瓶颈都在数据库上,所以cauherk把数据库和事务问题放到了前两位来讨论。但是davexin解释在所讨论的这个项目中数据库并非瓶颈:
我们的压力不在数据库层,在web层和F5。 当高峰的时候 ,F5也被点死了,就是每秒点击超过30万,web动态部分根本承受不了。根据我们程序记录,20台web最多承受5000个并发,如果再多,tomcat就不响应了。就像死了一样。
这个回复让接下来的讨论都集中于Web容器的性能优化,但是JavaEye站长robbin发表了自己的意见,将话题引回了这个项目的架构本身:
performance tuning最重要的就是定位瓶颈在哪里,以及瓶颈是怎么产生的。
我的推测是瓶颈还是出在EJB远程方法调用上!
tomcat上面的java应用要通过EJB远程方法调用,来访问weblogic上面的无状态SessionBean,这样的远程方法调用一般都在100ms~500ms级别,或者更多。而如果没有远程方法调用,即使大量采用spring的动态反射,一次完整的web请求处理在本地JVM内部的完成时间一般也不过20ms而已。一次web请求需要过长的执行时间,就会导致servlet线程被占用更多的时间,从而无法及时响应更多的后续请求。
如果这个推测是成立的话,那么我的建议就是既然你没有用到分布式事务,那么就干脆去掉EJB。weblogic也可以全部撤掉,业务层使用spring取代EJB,不要搞分布式架构,在每个tomcat实例上面部署一个完整的分层结构。
另外在高并发情况下,apache处理静态资源也很耗内存和CPU,可以考虑用轻量级web server如lighttpd/litespeed/nginx取代之。
robbin的推断得到了网友们的支持,davexin也认同robbin的看法,但是他解释说公司认为放弃SLSB存在风险,所以公司倾向于通过将Tomcat替换为Weblogic Server 10来提升系统的用户支撑能力。robbin则马上批评了这种做法:
坦白说我还从来没有听说过大规模互联网应用使用EJB的先例。为什么大规模互联网应用不能用EJB,其实就是因为EJB性能太差,用了EJB几乎必然出现性能障碍。
web容器的性能说到底无非就是Servlet线程调度能力而已,Tomcat不像WebLogic那样附加n多管理功能,跑得快很正常。对比测试一下WebLogic的数据库连接池和C3P0连接池的性能也会发现类似的结论,C3P0可要比WebLogic的连接池快好几倍了。这不是说WebLogic性能不好,只不过weblogic要实现更多的功能,所以在单一的速度方面就会牺牲很多东西。
以我的经验来判断,使用tomcat5.5以上的版本,配置apr支持,进行必要的tuning,使用BEA JRockit JVM的话,在你们目前的刀片上面,支撑500个并发完全是可以做到的。结合你们目前20个刀片的硬件,那么达到1万并发是没问题的。当然这样做的前提是必须扔掉EJB,并置web层和业务层在同一个JVM内部。
接下来robbin还针对davexin对话题中的应用分别在tomcat和weblogic上的测试数据进行了分析:
引用:
2。1台weblogic10 Express(相当于1台tomcat,用于发布jsp应用)加1台weblogic10(发布ejb应用),能支持1000个并发用户......
......
4。1台tomcat4.1加1台weblogic8,只能支持350个并发用户,tomcat就连结超时,说明此种结构瓶颈在tomcat。
这说明瓶颈还不在EJB远程调用上,但是问题已经逐渐清楚了。为什么weblogic充当web容器发起远程EJB调用的时候可以支撑1000个并发,但是tomcat只能到350个?只有两个可能的原因:
- 你的tomcat没有配置好,严重影响了性能表现
- tomcat和weblogic之间的接口出了问题
接着springside项目发起者江南白衣也提出了一个总体的优化指导:
1.基础配置优化
tomcat 6? tomcat参数调优?
JRockit JVM? JVM参数调优?
Apache+Squid 处理静态内容?
2.业务层优化
部分功能本地化,而不调remote session bean?
异步提交操作,JMS?
cache热点数据?
3.展示层优化
动态页面发布为静态页面?
Cache部分动态页面内容?
davexin在调整了Tomcat配置后应验了robbin对tomcat配置问题的质疑,davexin这样描述经过配置优化以后的测试结果:
经过测试,并发人数是可以达到像robbin所说的一样,能够在600人左右,如果压到并发700人,就有15%左右的失败,虽然在调整上面参数之后,并发人数上去了,但是在同样的时间内所完成的事务数量下降了10%左右,并且响应时间延迟了1秒左右,但从整体上来说,牺牲一点事务吞吐量和响应时间,并发人数能够提高500,觉得还是值得的。
至此这个话题有了一个比较好的结果。这个话题并非完全针对一个具体的项目才有意义,更重要的是在分析和讨论问题的过程中网友们解决问题的思路,尤其是cauherk、robbin、江南白衣等几位网友提出的意见可以让广大Java Web项目开发者了解到中、大型项目所需要考虑的架构和部署所需要考虑的关键问题,也消除了很多人对轻量Servlet容器与EJB容器性能的一些误解。
在讨论中还有一些小插曲,如davexin和江南白衣讨论了JRocket的实时(Realtime)版本是否可以提升Servlet容器的相应能力,答案是不可以。还有ID为mfc42d的网友从Servlet容器的并发支持能力引申到了Java的线程调度能力和NIO对Servelet容器的意义,他推荐了自己的两篇不错的blog“java的线程实现”和“java进程使用的最大内存的数值”,blog文章里面从JVM源码级别分析了Java的线程支持能力,面临JVM性能调优问题的网友可以认真阅读一下。
相关推荐
总的来说,大型Java Web项目的架构和部署调优需要综合考虑各个层面,包括应用架构、数据库设计、服务器配置、网络优化等。选择合适的技术栈、遵循最佳实践、持续监控并迭代优化,才能确保系统在面对大规模用户和高...
- **问题背景**:本文讨论了一位名为jackson1225的网友在其Java Web项目的架构和部署方面遇到的问题。该系统的目标是提升服务能力,以应对大规模用户需求。 - **现有架构概述**: - **Web层**:采用Struts + Tomcat...
【大型Web项目部署调优】涉及的是企业级Java Web应用的优化问题,主要涵盖了架构设计、性能调优、数据库管理等多个方面。在这个场景中,项目使用了Struts作为Web层框架,Hibernate作为ORM工具,Spring作为应用上下文...
- **Chapter 10**: 最后一章可能会讨论项目的部署和测试,包括使用Tomcat服务器,编写测试用例,以及性能监控和调优。 3. **源码分析与实践**:每个章节的源码文件(如ch01到ch10)代表了一个特定主题的实现,学习...
本教程通过12个章节的深入讲解,旨在让学习者全面了解并掌握Java Web开发的相关技术和最佳实践,为实际项目开发打下坚实的基础。每个章节都应包含丰富的实例和练习,以帮助学习者巩固理论知识,并提升实际操作能力。
《Java高手真经_系统架构卷:Java.Web系统设计与架构》是一本深入探讨Java Web系统构建和架构设计的专业书籍。这本书主要针对那些希望通过提升Java技术能力,掌握Web系统架构设计精髓的开发者。标签“java”表明了...
8. **部署与优化**:如何将Java Web应用部署到Web服务器(如Tomcat、Jetty)和应用服务器(如WebLogic、GlassFish),以及如何进行性能调优,都是开发者需要掌握的重要技能。 9. **最新技术趋势**:考虑到是修订版...
8. **实战项目**:为了加深理解,书中通常会包含实际的开发案例,例如构建一个简单的网上商城系统,从需求分析到系统部署,全程覆盖Java Web开发流程。 通过学习《独门架构:Java Web开发应用详解》,读者不仅可以...
Java技术框架方案架构图汇总汇编是一份详尽的文档,涵盖了从基础的Java平台到复杂的分布式系统架构的多种技术和框架。以下是对其中部分关键知识点的详细解释: 1. **Java类加载器架构**:Java类加载器是JVM的重要...
通过这个“Java Web新闻发布系统”项目教程,读者不仅能学习到Java Web的基础知识,还能掌握如何将理论知识应用于实际开发中,提升解决实际问题的能力。无论是初学者还是有一定经验的开发者,都能从中受益,为自己的...
了解JVM内存模型(如堆、栈、方法区等)对于进行性能调优和避免内存泄漏至关重要。 3. **Java技术体系**:涵盖了从基本语法、面向对象特性到高级特性的完整范围,如集合框架、多线程、网络编程、I/O流、反射、注解...
部署和运维过程中,需要考虑应用的热更新、监控、日志记录、性能调优等环节。 通过对这个大型J2EE金融项目的源代码学习,你可以深入了解金融业务的逻辑处理、数据模型设计、并发控制、安全策略等多个方面。实践中,...
总之,《Tomcat与Java Web开发技术详解》的这部分内容全面覆盖了Tomcat的基础使用、配置、部署、Servlet和JSP编程、MVC架构以及性能调优等多个方面,是Java Web开发者不可或缺的参考资料。通过深入学习,开发者可以...
### 高并发Web架构实现思路——Java版 #### 一、引言 随着互联网的快速发展,Web应用系统面临着巨大的挑战,尤其是如何处理高并发、海量数据的情况。传统的Web架构已经无法满足当前的需求,这就需要我们探索新的...
在Java项目开发实践中,开发者需要掌握一系列技术和工具,这些技术和工具涵盖了从项目规划、编码、测试到部署的全过程。以下是一些关键知识点的详细说明: 1. **Java编程基础**:Java是一种面向对象的编程语言,...
通过以上知识点的学习,读者不仅能够系统地掌握Tomcat与Java Web开发的基本原理和技术要点,还能了解到在实际项目开发过程中需要注意的问题和解决方法。这对于想要从事Java Web开发的技术人员来说,无疑是一份宝贵的...
该项目是一个基于Java Web技术的互联网+养殖业管理系统,旨在帮助在校学生快速理解并掌握Web开发的基本流程和技术。作为毕业设计,它涵盖了从需求分析、系统设计到编码实现、测试及部署的完整周期,是学习实践的好...