构建可扩展的Java EE应用(一)

对于一个具备使用价值的应用而言,其使用者有可能会在一段时间内疯狂的增 长。随着越来越多的关键性质的应用在Java EE上运行,很多的Java开发者也开始 关注可扩展性的问题了。但目前来说,大部分的web 2.0站点是基于script语言编 写的,对于Java应用可扩展能力,很多人都抱着质疑的态度。在这篇文章中, Wang Yu基于他本身在实验室项目的经验来展示如何构建可扩展的java应用,同时 ,基于一些在可扩展性上做的比较失败的项目给读者带来构建可扩展java应用的 实践、理论、算法、框架和经验。

我一直为一家互联网性质的实验室工作,这个实验室采用我们公司最新的大型 服务器环境为合作伙伴的产品和解决方案免费做性能测试,我工作的部分就是帮 助他们在强大的CMT和SMP服务器上进行性能调优。

这些年来,我已经为不同的解决方案测试了数十种java应用。许多的产品都是 为了解决同样的领域问题,因此这些产品的功能基本都是类似的,但在可扩展性 上表现的却非常不同,其中有些不能扩展到64 CPU的服务器上运行,但可以扩展 到20台服务器做集群运行,有些则只能运行在不超过2 CPU的机器上。

造成这些差别的原因在于设计产品时的架构愿景,所有的具备良好扩展性的 java应用从需求需求阶段、系统设计阶段以及实现阶段都为可扩展性做了考虑, 所以,你所编写的java应用的可扩展能力完全取决于你的愿景。

可扩展性作为系统的属性之一,是个很难定义的名词,经常会与性能混淆。当 然,可扩展性和性能是有关系的,它的目的是为了达到高性能。但是衡量可扩展 性和性能的方法是不一样的,在这篇文章中,我们采用wikipedia中的定义:

可扩展性是系统、网络或进程的可选属性之一,它表达的含义是可以以一种优 雅的方式来处理不断增长的工作,或者以一种很明白的方式进行扩充。例如:它 可以用来表示系统具备随着资源(典型的有硬件)的增加提升吞吐量的能力。

垂直扩展的意思是给系统中的单节点增加资源,典型的是给机器增加CPU或内 存,垂直扩展为操作系统和应用模块提供了更多可共用的资源,因此它使得虚拟 化的技术(应该是指在一台机器上运行多个虚拟机)能够运行的更加有效。

水平扩展的意思是指给系统增加更多的节点,例如为一个分布式的软件系统增 加新的机器,一个更清晰的例子是将一台web服务器增加为三台。随着计算机价格 的不断降低以及性能的不断提升,以往需要依靠超级计算机来进行的高性能计算 的应用(例如:地震分析、生物计算等)现在可以采用这种多个低成本的应用来 完成。由上百台普通机器构成的集群可以达到传统的基于RISC处理器的科学计算 机所具备的计算能力。

这篇文章的第一部分来讨论下垂直扩展Java应用。

如何让Java EE应用垂直扩展

很多的软件设计人员和开发人员都认为功能是产品中最重要的因素,而性能和 可扩展性是附加的特性和功能完成后才做的工作。他们中大部分人认为可以借助 昂贵的硬件来缩小性能问题。

但有时候他们是错的,上个月,我们实验室中有一个紧急的项目,合作伙伴提 供的产品在他们客户提供的CPU的机器上测试未达到性能的要求,因此合作伙伴希 望在更多CPU(8 CPU)的机器上测试他们的产品,但结果却是在8 CPU的机器上性 能反而比4 CPU的机器更差。

为什么会这样呢?首先,如果你的系统是多进程或多线程的,并且已经用尽了 CPU的资源,那么在这种情况下增加CPU通常能让应用很好的得到扩展。

基于java技术的应用可以很简单的使用线程,Java语言不仅可以用来支持编写 多线程的应用,同时JVM本身在对java应用的执行管理和内存管理上采用的也是多 线程的方式,因此通常来说Java应用在多CPU的机器上可以运行的更好,例如Bea weblogic、IBM Websphere、开源的Glassfish和Tomcat等应用服务器,运行在 Java EE应用服务器中的应用可以立刻从CMT和SMP技术中获取到好处。

但在我的实验室中,我发现很多的产品并不能充分的使用CPU,有些应用在8 CPU的服务器上只能使用到不到20%的CPU,像这类应用即使增加CPU也提升不了多 少的。

热锁(Hot Lock)是可扩展性的关键障碍

在Java程序中,用来协调线程的最重要的工具就是 synchronized这个关键字 了。由于java所采用的规则,包括缓存刷新和失效,Java语言中的synchronized 块通常都会其他平台提供的类似的机制更加的昂贵。即使程序只是一个运行在单 处理器上的单线程程序,一个synchronized的方法调用也会比非同步的方法调用 慢。

要检查问题是否为采用synchronized关键字造成的,只需要像JVM进程发送一 个QUIT指令(译者注:在linux上也可以用kill -3 PID的方式)来获取线程堆栈 信息。如果你看到类似下面线程堆栈的信息,那么就意味着你的系统出现了热锁 的问题:

... ... ...
"Thread-0" prio=10 tid=0x08222eb0 nid=0x9 waiting for monitor entry [0xf927b000..0xf927bdb8]
at testthread.WaitThread.run(WaitThread.java:39)
- waiting to lock <0xef63bf08> (a java.lang.Object)
- locked <0xef63beb8> (a java.util.ArrayList)
at java.lang.Thread.run(Thread.java:595)
... ... ...

时间: 2024-09-27 17:35:03

构建可扩展的Java EE应用(一)的相关文章

构建可扩展的Java EE应用(二)

当并发用户数明显的开始增长,你可能会不满意一台机器所能提供的性能,或 者由于单个JVM实例gc的限制,你没法扩展你的java应用,在这样的情况下你可以 做的另外的选择是在多个JVM实例或多台服务器上运行你的系统,我们把这种方法 称为水平扩展. 请注意,我们相信能够在一台机器的多个JVM上运行系统的扩展方式是水平扩 展方式,而非垂直扩展方式.JVM实例之间的IPC机制是有限的,两个JVM实例之间 无法通过管道.共享内存.信号量或指令来进行通讯,不同的JVM进程之间最有效 的通讯方式是socket.

构建可扩展的Java图表组件

前言 Java语言所具有的面向对象特性,使许多复杂的问题可以分解成相对独立的对象来处理.本文用面向对象的方法,将一个图表组件从分解到如何组合,以及如何进行扩展作了详细的讲解.从简单的折线图到稍复杂的多种形状组合的图表,读者可以学到构建一个可扩展的图表组件是多么的容易. 常见的图表类型 图表具有很直观的视觉效果,可以方便的用来比较数据的差异.图案和趋势等. 从外观上来看,常用到的图表主要有散点图.(折)曲线图.柱状图等.本文主要讨论这几种图形样式.其中这每种图又可以与其它的类型组合产生更多的形式.

针对Java EE 7三个特性进行详细的剖析

Java EE 7 使得开发人员可以写更少的样板代码,通过丰富的组件来提供一个完整.全面.集成的堆栈来支持和构建最新的 Web 应用程序和框架,同时提供更具扩展性.丰富性和简易的功能.企业将会从便捷式批处理.改进的扩展性等新功能中获益.本文将通过对这个版本中新增组件 WebSocket 1.0.JSON Processing 1.0.JAX-RS 2.0.JSF 2.2 和 JMS 2.0 的介绍及若干示例的展示,来对以上三个特性进行详细的剖析. Java EE 作为一个企业应用的部署平台,具有

甲骨文将推出Java EE 7版本扩展对HTML 5的支持

甲骨文全球大会,2012 年 10 月 2 日--在2012 JavaOne大会上,甲骨文展示了 Java平台企业版 (Java Platform, Enterprise http://www.aliyun.com/zixun/aggregation/29806.html">Edition,Java EE) 的最新开发进展,并针对即将推出的Java EE 7 版本进行了讨论. 越来越多的开发者采用Java EE,而且超过5000万用户下载了Java EE组件,从而使其成为最受开发人员欢迎的

使用IBM Rational Application Developer V7.5和WAS V7.0构建Java EE应用程序

使用IBM Rational Application Developer V7.5和WebSphere Application Server V7.0构建Java EE应用程序 引言 本文向您介绍 IBM Rational Application Developer for WebSphere Software V7.5,并带您构建 JPA 实体.session bean,并将它 们部署到 IBM WebSphere V7.0 上. Java Platform, Enterprise Editi

java ee 运行不起来,貌似tomcat的问题,构建路径调过了

问题描述 java ee 运行不起来,貌似tomcat的问题,构建路径调过了 我是真的看不懂这个是什么问题了,数据库的开了,但是还说错的.第一句话<%@那里也说错的额,service里面tomcat下面好几个文件都有警告 哪位大神能告诉我这是什么情况~ 构建路径里弄过了 解决方案 重启一下IDE试试,看起来是没有错误的,或者清理一下项目试试 解决方案二: 你把<!doc,,,,这行删除,eclipse认为他是一个html页面,不是jsp页面,你仔细对照其他jsp页面头是啥样的.. 解决方案三:

Java EE 5

简介 Java EE 技术是 Java 语言平台的扩展,支持开发人员创建可伸缩的强大的可移植企业应用程序.它为应用程序组件定义了四种容器:Web.Enterprise JavaBean(EJB).应用程序客户机和 applet.一个应用服务器规范详细描述了这些容器和它们必须支持的 Java API,这促使 Java EE 产品相互竞争,同时保证符合这个规范的应用程序可以在服务器之间移植. 这个平台的最新版本 Java EE 5 已经于 2006 年 5 月发布.Java EE 5 主要关注提高开

由 Eclipse 基金会接手的 Java EE 正在发生改变

Java EE 的新东家开始对 Java EE 的开发工作和支持进行更改. 自 Java EE 移交给 Eclipse 基金会以来,它的开发工作和管理方式正在开始改变. 一方面,Oracle 正在制作 Java EE 技术兼容性工具包(TCK - Technology Compatibility Kits),该工具是开源的,可以确定一个实现是否符合与 Java 兼容.Eclipse 执行总监 Milinkovich 称这是"对这个生态系统的驱动力的一个非常根本的变化". Milinko

微服务:Java EE的掘墓人

在Java问世之初,包括IBM.BEA.Oracle在内的一些巨头公司看到了Java作为一门杰出的Web编程语言可能给他们带来的巨大商机.那么如何通过一门编程语言来赚钱呢?答案就是使用这门语言构建复杂无比的服务器,让那些大公司支付一大笔费用来购买这些服务器.于是紧接着就出现了Java EE规范.JSR规范,以及WebLogic.WebSphere等服务器中间件. 在这些服务器上面部署了大型的程序包,它们运行缓慢,消耗大量的内存.基于这些容器的开发和调试对开发人员来说简直就是噩梦,作为对他们的补偿