虽然这是一个以 Java 为中心的问题,但它确实适用于任何使用多层架构的系统。
在 3 层架构中,您通常有 3 层:
- 客户端代码所在的客户端/表示层;和
- 业务逻辑所在的中间件层;和
- RDBMS 和其他数据密集型系统所在的data/eis层
在 Java 领域,对于 Web 应用程序,这可能看起来像:
- 应用程序服务器,例如
GlassFish
,同时运行“Web 层”(WAR 包含 Web 应用程序中的客户端层)和“业务层”(EJB、中间件等。 );和 - 包含数据层的 RDBMS 服务器
在虚拟化/集群环境中,这些应用程序(GlassFish、RBMBS,如 Oracle 或 PostgreSQL 等)将在 VM 上运行。
我的问题:在这些 VM 之间分配/分发此 3 层架构的标准方法是什么?意思是,以下任何一种“策略”都可能可行,但不是优先:
- 一个运行 GlassFish 和 RDBMS(所有 3 层)的 VM(假设所有 VM 都是 Ubuntu 服务器,因此成本/价格不计入等式)
- 两个虚拟机:一个运行 GlassFish 的应用程序服务器虚拟机,以及一个运行 PostgreSQL 的数据库服务器虚拟机
- 三个虚拟机:两个应用服务器虚拟机都运行 GlassFish,但是 1 个 GlassFish 实例只运行 WAR(网络层),而第二个 FlassFish 实例运行中间件/业务逻辑;然后是第三个数据库服务器
显然,如果所有服务器(所有层)都在同一个虚拟机上运行,它们可能会运行得更快或更高效,因为它们不会因网络延迟而陷入困境。但它们会在同一个虚拟机上,这需要我需要大型硬件来支持它们。此设置也可能存在安全问题。
各有利弊。我感兴趣的是什么策略最能实现以下目标:(1) 最大化吞吐量/速度,(2) 最适合集群/云环境,以及 (3) 最大化安全性。
提前致谢!
最佳答案
(1) maximizes throughput/speed,
这完全取决于您的应用程序。例如,数据库可能是您的瓶颈,在这种情况下,您在 JVM 中的工作非常重要。
(2) is best suited for a clustered/cloud environment
如果您要分发您的系统,您很可能想要分发您的表示层。这是因为他们所做的工作取决于客户的数量,而每个客户所做的工作在很大程度上是独立的。 (在表现层)
and (3) maximizes security.
拥有更多虚拟机并不能保证提高安全性。您的 JVM 应该已设置好,因此运行在其中的不同应用程序无论如何都是完全独立的。如果你想防止拒绝攻击,而你的后端服务被其他系统使用,你可能希望将它们分开,否则没有太大区别。
关于java - 跨 VM 分布层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8791902/