向这里所有聪明的人致以问候!
我想问一下将 Java 企业 Web 应用程序部署到 Amazon EC2 等云是否可行或是一个好主意。更确切地说,我正在寻找应用程序的基础设施选项,该应用程序将处理数百个用户,这些用户具有长时间但不占用大量 CPU 或内存的会话。我正在考虑专用服务器、虚拟专用服务器 (VPS) 和 EC2。我注意到有一个名为 JBoss Cloud 的项目,因此人们正在努力实现这样的部署,另一方面,它似乎还不成熟,我不确定云是否已为这种应用程序做好准备,它与 Twitter 等典型的基于云的应用程序不同。您会建议将其部署到云吗?有什么优缺点?
该应用程序是一个 Java EE 5 Web 应用程序,其主要功能是使用户能够通过组合可用的部件来组成自己的定制产品。它使用无状态和有状态会话 bean 以及 JPA 将实体持久化到 RDBMS,并通过 Web 服务从公司的库存系统获取有关部件的信息。除了外部用户之外,一些内部用户也使用它,这些用户通过公司的 LDAP 进行身份验证。该应用程序应该可以处理大约 300-400 个并发用户构建他们的产品,并且应该具有合理的可扩展性和可用性,尽管这些品质在现阶段只是中等重要性。
我提出了一种架构,该架构由防火墙 (FW) 和支持粘性会话和 https 的负载均衡器组成(在云中,这将被 EC2 的 Elastic Load Balancing 服务和应用服务器上的 FW 取代,在物理架构中,负载均衡器将是 HW),然后是两个物理集群应用服务器与 Web 服务器相结合(这样如果其中一个发生故障,用户不会丢失其长期构建的产品),最后是数据库服务器。DB 服务器需要一个从属备份实例,可以在主实例发生故障时替换主实例。只要单个 RDBMS 能够承受负载,这应该能够提供合理的可用性和容错能力并提供良好的可扩展性,这在相当长的一段时间内应该是可以的,因为大多数操作都是使用有状态 bean 在内存中完成的,并且只是偶尔从 DB 存储或检索,而且数据量也很低。有问题的部分可能是对远程库存系统 Web 服务的依赖,但如果在应用程序中对其输出进行良好的缓存,它也应该可以。
不幸的是,我对这种面向数百用户的“普通 Java EE 应用程序”所需的系统资源(内存大小、CPU/核心数量和速度)只有模糊的概念。根据亚马逊的实际产品,我粗略且基本没有根据的估计是,1.7GB 和一个速度约为 2.5GHz 的 2 核“现代 CPU”(高 CPU 中型实例)应该足以满足两台应用服务器中的任何一台的需求(因为我们可以通过配置更多服务器来处理更高的负载)。或者,我会考虑使用大型实例(64b、7.5GB RAM、2 核 1GHz)
所以我的问题是,这种部署到云在技术和财务上是否可行,或者专用/ VPS 服务器是否是更好的选择,以及是否有一些类似的实际经验。
非常感谢!/Jakub Holy
附言:我发现云中的 JBoss EAP 案例研究这表明可以将真实世界的 Java EE 应用程序部署到 EC2 云,但不幸的是,没有关于拓扑、实例类型或任何其他内容的详细信息 :-(
答案1
从长远来看,EC2 很少比您自己的专用服务器更具成本效益。它的主要优势在于快速可扩展性。如果您的用户群变化相对较慢,那么它可能不值得。
但最棒的是,只需花费少量的钱就可以轻松设置并试用,而无需提前在硬件上投入大量资金。
有现成的 Glassfish AMI。我的建议是尝试 1 或 2 个小型实例,它会清楚地显示 VPS/专用服务器是否更有价值,并让您更好地了解您的需求。
答案2
您可能想看看 Terracotta。
Terracotta 确实在 EC2 云中分发 JVM。因此,它只需进行少量代码修改,即可使不可扩展的 Java 应用程序变得可扩展。Terracotta 类似于 Elastic Beanstalk,但更适合处理:
Java
扩展
负载均衡
数据库复制
它是开源/开放核心