如果您需要使用java构建高度可伸缩的Web应用程序,您将使用什么框架?为什么?
我只是在阅读java中的思考,首先是servlet和manning的spring框架书,但我真的想要专注于高度可扩展的架构等。
你会使用tomcat,hibernate,ehcache吗?
(假设您必须设计规模,而不是在获得流量类型响应时寻找'担心它)
答案 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,看看以文档为中心的数据存储。
答案 3 :(得分:3)
框架更适合加速开发,而不是性能。任何框架都会有一些开销,因为它处理的用例是你不需要的。当然,开销可能很低,大多数框架都会指向已经证明可以扩展的模式,但这些模式也可以在没有框架的情况下使用。
所以我会设计你的架构假设'裸机',即纯servlet(是的,你可以去更低级别,但我假设你不想编写自己的http套接字层),直接JDBC,然后返回并找出最适合您的架构的框架,加快开发速度,并且不要增加太多开销。 Tomcat与其他容器,Hibernate与其他ORM,Struts与其他Web框架相比 - 如果您对关键性能瓶颈做出错误的决定,这一切都不重要。
但是,更好的方法可能是选择一个优化开发时间的框架,然后找出瓶颈并在发生时解决这些问题。否则,对于从未发生过的情况,您可以过早地优化轮子。但这可能属于“当你获得交通时担心它”的类别。
答案 4 :(得分:2)
所有流行的现代框架(和“堆栈”)编写得很好,不会对性能和扩展造成任何威胁,如果使用正确。因此,请关注哪种堆栈最适合您的需求,而不是从可扩展性开始。
如果您有特殊要求,那么您可以询问有关它的问题并获得有关处理它的最佳建议。
答案 5 :(得分:2)
没有任何框架可以神奇地使您的Web服务可扩展。
可扩展性的关键是复制(或者可能是)瓶颈的功能。如果您认真考虑提供服务,首先需要充分了解应用程序的特性,从而了解瓶颈可能存在的位置:
然后,您需要确定 的扩展程度。您需要支持数百,数千,数百万的并发用户吗? (不同程度的可扩展性需要不同的体系结构和不同的实现方法。)
一旦确定了这些内容,就可以决定是否有一个现有的框架可以应对您需要支持的级别流量。如果没有,您需要设计自己的系统架构,以便在问题区域中进行扩展。
答案 6 :(得分:1)
如果您能够使用商业系统,那么我建议您在http://jazz.net查看Jazz Foundation。它是IBM Rational新产品的基础。该项目由在开源之前在IBM内部开发Eclipse的人领导。它具有可插拔的DB层以及支持多个App Server。它旨在处理群集和多站点类型部署。它具有很好的功能,如OAuth支持和许可证管理。
答案 7 :(得分:0)
正如其他人已经回复的那样,可扩展性与您使用的框架无关。当然,从每个节点挤出尽可能多的性能是很好的,但您理想的是通过添加另一个节点,您可以线性方式扩展应用程序。
应用程序应该在不同的层中进行架构,这样就可以在不重写的情况下为应用程序的不同层添加更多功能,还可以添加不同的分层缓存。缓存是存档速度的关键。
大型网络应用层的一个示例:
答案 8 :(得分:0)
除上述内容外:
好好看看JMS(Java消息服务)。这是一项评级很低的技术。有供应商解决方案,如TibCo EMS,Oracle等。但也有免费的堆栈,如Active MQ。
JMS允许您使用队列构建同步和异步解决方案。您可以选择拥有持久性或非持久性队列。