构建一个高规模的Java应用程序,你会使用什么堆栈?

时间:2010-01-01 20:40:00

标签: java hibernate spring tomcat ehcache

如果您需要使用java构建高度可伸缩的Web应用程序,您将使用什么框架?为什么?

我只是在阅读java中的思考,首先是servlet和manning的spring框架书,但我真的想要专注于高度可扩展的架构等。

你会使用tomcat,hibernate,ehcache吗?

(假设您必须设计规模,而不是在获得流量类型响应时寻找'担心它)

9 个答案:

答案 0 :(得分:5)

答案取决于“可扩展”的含义。很大程度上取决于您的应用程序,而不是您选择使用它的框架。

无论您选择哪种框架,事实是您部署它的硬件将具有其能够处理的同时请求数量的上限。如果您想要处理更多流量,则必须在其上投入更多硬件并包括负载平衡等。

在这种情况下相关的部分与共享状态有关。如果你有很多共享状态,你必须确保它是线程安全的,当它需要时是“粘性的”,在整个集群中复制等等。所有这些都与你将它部署到的app服务器有关以及你设计应用程序的方式,而不是框架。

Tomcat不是“框架”,它是一个servlet / JSP引擎。它具有集群功能,但大多数其他Java EE应用服务器也是如此。如果您已经选择了Spring,则可以使用Tomcat,因为它意味着您没有EJB。 Jetty,Resin,WebLogic,JBOSS,Glassfish - 其中任何一个都可以。

如果你已经熟悉的话,春天是个不错的选择。我认为遵循Spring惯用法会使你的应用程序更有可能是分层的,在架构上是健全的,但这不是决定可伸缩性的决定性因素。

Hibernate将使您的开发生活更轻松,但数据库的可伸缩性在很大程度上取决于架构,索引等.Hibernate不是一种保证。

“可扩展”是易于折腾但包含许多考虑因素的众所周知的术语之一(如“轻量级”)。我不确定一个简单的框架选择会一劳永逸地解决这个问题。

答案 1 :(得分:4)

我会查看Apache Mina。从主页:

  

Apache MINA是一个网络应用程序   帮助用户发展的框架   高性能和高可扩展性   网络应用很容易。它   提供抽象·事件驱动·   各种异步API   传输,如TCP / IP和UDP / IP   通过Java NIO。

它上面构建了一个HTTP引擎AsyncWeb

一个不那么激进的建议(!)是Jetty - 一个面向性能和占用空间小的servlet容器。

答案 2 :(得分:4)

我主要关注的两个关键词是异步无状态。或者至少“尽可能无状态:当然你需要状态,但也许,而不是寻找完整的RDBMS,看看以文档为中心的数据存储。

请查看有关异步的AKKA和数据存储的CouchDBMongoDB ...

答案 3 :(得分:3)

框架更适合加速开发,而不是性能。任何框架都会有一些开销,因为它处理的用例是你不需要的。当然,开销可能很低,大多数框架都会指向已经证明可以扩展的模式,但这些模式也可以在没有框架的情况下使用。

所以我会设计你的架构假设'裸机',即纯servlet(是的,你可以去更低级别,但我假设你不想编写自己的http套接字层),直接JDBC,然后返回并找出最适合您的架构的框架,加快开发速度,并且不要增加太多开销。 Tomcat与其他容器,Hibernate与其他ORM,Struts与其他Web框架相比 - 如果您对关键性能瓶颈做出错误的决定,这一切都不重要。

但是,更好的方法可能是选择一个优化开发时间的框架,然后找出瓶颈并在发生时解决这些问题。否则,对于从未发生过的情况,您可以过早地优化轮子。但这可能属于“当你获得交通时担心它”的类别。

答案 4 :(得分:2)

所有流行的现代框架(和“堆栈”)编写得很好,不会对性能和扩展造成任何威胁,如果使用正确。因此,请关注哪种堆栈最适合您的需求,而不是从可扩展性开始。

如果您有特殊要求,那么您可以询问有关它的问题并获得有关处理它的最佳建议。

答案 5 :(得分:2)

没有任何框架可以神奇地使您的Web服务可扩展。

可扩展性的关键是复制(或者可能是)瓶颈的功能。如果您认真考虑提供服务,首先需要充分了解应用程序的特性,从而了解瓶颈可能存在的位置:

  • 是只读服务还是用户请求导致主数据发生变化?
  • 您有/需要会话,还是系统RESTful?
  • 请求是否是带有HTML响应的正常HTTP请求,或者您正在执行AJAX或回调等。
  • 用户请求计算密集,I / O密集,渲染密集吗?
  • 您的后端数据库有多大/多复杂?
  • 有哪些可用性要求?

然后,您需要确定 的扩展程度。您需要支持数百,数千,数百万的并发用户吗? (不同程度的可扩展性需要不同的体系结构和不同的实现方法。)

一旦确定了这些内容,就可以决定是否有一个现有的框架可以应对您需要支持的级别流量。如果没有,您需要设计自己的系统架构,以便在问题区域中进行扩展。

答案 6 :(得分:1)

如果您能够使用商业系统,那么我建议您在http://jazz.net查看Jazz Foundation。它是IBM Rational新产品的基础。该项目由在开源之前在IBM内部开发Eclipse的人领导。它具有可插拔的DB层以及支持多个App Server。它旨在处理群集和多站点类型部署。它具有很好的功能,如OAuth支持和许可证管理。

答案 7 :(得分:0)

正如其他人已经回复的那样,可扩展性与您使用的框架无关。当然,从每个节点挤出尽可能多的性能是很好的,但您理想的是通过添加另一个节点,您可以线性方式扩展应用程序。

应用程序应该在不同的层中进行架构,这样就可以在不重写的情况下为应用程序的不同层添加更多功能,还可以添加不同的分层缓存。缓存是存档速度的关键。

大型网络应用层的一个示例:

  • 负载均衡器(TCP级别)
  • 缓存反向代理
  • CDN for static content
  • 前端网络服务器
  • Appservers(应用程序的业务逻辑)
  • 持久存储(RDBMS,密钥/值,文档)

答案 8 :(得分:0)

除上述内容外:

好好看看JMS(Java消息服务)。这是一项评级很低的技术。有供应商解决方案,如TibCo EMS,Oracle等。但也有免费的堆栈,如Active MQ。

JMS允许您使用队列构建同步和异步解决方案。您可以选择拥有持久性或非持久性队列。

相关问题