0

if you needed to build a highly scalable web application using java, what framework would you use and why?

I'm just reading thinking-in-java, head first servlets and manning's spring framework book, but really I want to focus on highly scalable architectures etc.

would you use tomcat, hibernate, ehcache?

(just assume you have to design for scale, not looking for the 'worry about it when you get traffic type responses)

4

9 回答 9

5

答案取决于我们所说的“可扩展”是什么意思。很大程度上取决于您的应用程序,而不是您选择用来实现它的框架。

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

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

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

如果您已经非常了解 Spring,那么 Spring 是一个不错的选择。我认为遵循 Spring 习语将使您的应用程序更有可能是分层的和架构合理的,但这并不是可伸缩性的决定因素。

Hibernate 将使您的开发生活更轻松,但数据库的可伸缩性在很大程度上取决于模式、索引等。Hibernate 不能保证。

“可扩展”是那些包罗万象的术语之一(如“轻量级”),很容易抛弃但包含许多考虑因素。我不确定一个简单的框架选择是否能一劳永逸地解决这个问题。

于 2010-01-01T21:55:25.047 回答
4

I would check out Apache Mina. From the home page:

Apache MINA is a network application framework which helps users develop high performance and high scalability network applications easily. It provides an abstract · event-driven · asynchronous API over various transports such as TCP/IP and UDP/IP via Java NIO.

It has an HTTP engine AsyncWeb built on top of it.

A less radical suggestion (!) is Jetty - a servlet container geared towards performance and a small footprint.

于 2010-01-01T20:42:50.120 回答
4

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

看看AKKA关于异步和CouchDBMongoDB作为数据存储...

于 2010-01-01T22:53:08.143 回答
3

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

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

但是,更好的方法可能是选择一个优化开发时间的框架,然后找到瓶颈并在它们发生时解决它们。否则,您可能会针对从未发生过的情况过早地进行优化。但这可能属于“当您获得流量时担心它”的类别。

于 2010-01-01T22:09:41.853 回答
2

There is no framework that is magically going to make your web service scalable.

The key to scalability is replicating the functionality that is (or would otherwise be) a bottleneck. If you are serious about making your service, you need to start with a good understanding of the characteristics of your application, and hence an idea of where the bottlenecks are likely to be:

  • Is it a read-only service or do user requests cause primary data to change?
  • Do you have / need sessions, or is the system RESTful?
  • Are the requests normal HTTP requests with HTML responses, or are you doing AJAX or callbacks or something.
  • Are user requests computation intensive, I/O intensive, rendering intensive?
  • How big/complicated is your backend database?
  • What are the availability requirements?

Then you need to decide how scalable you want it to be. Do you need to support hundreds, thousands, millions of simultaneous users? (Different degrees of scalability require different architectures, and different implementation approaches.)

Once you have figured these things out, then you decide whether there is an existing framework that can cope with the level traffic that you need to support. If not, you need to design your own system architecture to be scalable in the problem areas.

于 2010-01-02T00:42:34.647 回答
2

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

如果您有特定要求,那么您可以就它提出问题并获得有关处理它的最佳方法的建议。

于 2010-01-01T20:50:29.750 回答
1

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

于 2010-01-01T23:44:42.410 回答
0

除上述内容外:

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

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

于 2010-01-02T16:19:14.863 回答
0

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

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

大型 web 应用层的一个示例:

  • 负载均衡器(TCP 级别)
  • 缓存反向代理
  • 静态内容的 CDN
  • 前端网络服务器
  • Appservers(应用程序的业务逻辑)
  • 持久存储(RDBMS、键/值、文档)
于 2010-01-02T13:25:40.197 回答