繁体   English   中英

构建一个大型Java应用程序,您将使用什么堆栈?

[英]building a high scale java app, what stack would you use?

如果您需要使用Java构建高度可扩展的Web应用程序,那么将使用什么框架,为什么?

我只是在阅读Java思考,首先介绍servlet和Manning的spring框架书,但实际上我想专注于高度可扩展的体系结构等。

您会使用tomcat,hibernate,ehcache吗?

(仅假设您必须针对规模进行设计,而不是在获得流量类型响应时寻找“后顾之忧”)

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

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

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

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

如果您已经非常了解春天,那么它是一个不错的选择。 我认为,遵循Spring习惯用法将使您的应用更有可能是分层的并且在体系结构上合理,但这并不是可伸缩性的决定因素。

Hibernate将使您的开发工作更加轻松,但是数据库的可伸缩性在很大程度上取决于架构,索引等。Hibernate并不能保证。

“可伸缩”是易于理解但包含许多考虑因素的广泛使用的术语之一(例如“轻量级”)。 我不确定简单选择框架会一劳永逸地解决问题。

我会检查Apache Mina 从主页:

Apache MINA是一个网络应用程序框架,可帮助用户轻松开发高性能和高可伸缩性的网络应用程序。 它通过Java NIO通过各种传输(例如TCP / IP和UDP / IP)提供了一个抽象的,事件驱动的异步API。

它基于HTTP引擎AsyncWeb

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

我主要关注的两个关键字是异步无状态 或至少“尽可能地无状态:当然,您需要状态,但也许,而不是使用完整的RDBMS,请查看以文档为中心的数据存储。

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

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

因此,我将假设“裸机”(即纯servlet)来设计您的体系结构(是的,您甚至可以使用更低的级别,但我假设您不想编写自己的http套接字层),直接JDBC等。返回并找出最适合您的架构的框架,加快开发速度,并且不要增加太多开销。 Tomcat与其他容器,Hibernate与其他ORM,Struts与其他Web框架-如果您对关键性能瓶颈做出错误决定,那么这些都不重要。

但是,更好的方法可能是选择一个针对开发时间进行优化的框架,然后找到瓶颈并在出现瓶颈时加以解决。 否则,您可能会过早地旋转车轮以应对从未发生的情况。 但这可能属于“担心交通拥堵”类别。

如果使用得当 ,所有流行的现代框架(和“堆栈”)都精心编写,不会对性能和扩展性构成任何威胁。 因此,重点放在最适合您的需求的堆栈上,而不要从前期的可伸缩性开始。

如果您有特定要求,则可以提出有关此问题的建议,并获得有关最佳处理方式的建议。

没有任何框架可以使您的Web服务具有可扩展性。

可伸缩性的关键是复制曾经(或将是瓶颈)的功能。 如果您认真考虑提供服务,则需要对应用程序的特性有一个很好的了解,从而对可能出现瓶颈的地方有所了解:

  • 它是只读服务,还是用户请求导致主要数据更改?
  • 您是否有/需要会话,或者系统是否为RESTful?
  • 请求是带有HTML响应的普通HTTP请求,还是正在执行AJAX或回调或其他操作。
  • 用户请求是计算密集型,I / O密集型还是渲染密集型吗?
  • 后端数据库有多大/复杂?
  • 可用性要求是什么?

然后,你需要决定你想如何可扩展的它是。 您需要支持成千上万的同时用户吗? (不同程度的可伸缩性需要不同的体系结构和不同的实现方法。)

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

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

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

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

大型Web应用程序的图层示例:

  • 负载均衡器(TCP级别)
  • 缓存反向代理
  • CDN用于静态内容
  • 前端网络服务器
  • 应用服务器(应用的业务逻辑)
  • 永久存储(RDBMS,键/值,文档)

除了上述内容:

充分了解JMS(Java消息服务)。 这是一项远远低于额定的技术。 有供应商解决方案,例如TibCo EMS,Oracle等。但是也有免费堆栈,例如Active MQ。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM