多个 JVM 与单个应用服务器

2022-09-02 10:36:58

我正在处理的系统是每个客户在自己的JVM中运行Java应用程序。我们现在有大约六台专用服务器,总共运行近100个JVM,以及用于管理这些JVM的自定义脚本集。此时,此设置确实显示出了它的年龄:管理许多JVM正在成为监视/管理的噩梦,我们一直在处理堆大小问题。我们希望转向更现代的方法,在每台物理机的单个应用服务器中运行一堆应用程序。但是,保持应用程序分离在隔离方面确实具有明显的优势(例如,内存不足错误仅影响一个客户)。每个客户的软件堆栈的内存要求差异很大。

我的问题是:有没有办法在这里两全其美,在一个JVM(应用程序服务器)中运行多个应用程序,同时仍然保持一定程度的隔离?或者,现在您需要管理一组应用程序的内存需求,这仅仅是生活中的一个现代事实?除了应用程序服务器或Java EE容器(例如Wildfly或Spring)之外,这里还有其他解决方案吗?似乎这个系统是另一个时代的坚守者!


答案 1

签出“多租户”JVM。

IBM的JRE已经拥有了它:http://www.ibm.com/developerworks/library/j-multitenant-java/

Waratek在Oracle JRE之上实现了它,他们创建了ElastiCat,这是一个Tomcat分支,可以将不同的应用程序隔离在同一容器中:http://www.elasticat.com/faq/

有传言称,多租户也将出现在官方的Oracle Java 9 JVM中。

=======================================================

更新:Java 9已经发布,但Oracle没有关于多租户的消息。如今,他们似乎更喜欢拥有多个JVM,甚至多个容器(例如docker)。


答案 2

这两种方法都有其优点和缺点:

共享 JVM

  • 更低的开销 - JVM 内存占用(核心库等)只需要加载一次。
  • 更好的内存利用率。Java 进程将占用操作系统内存,用于当前可能未使用的堆空间。

单独的 JVM

  • 隔离“贪婪”或“泄漏”应用。
  • 提高恶意代码的安全性。
  • 更新更容易,更新一个应用程序而不会关闭另一个应用程序。

总的来说,我不会制定一揽子政策。寻找小型/微服务或其他低使用率的应用程序,这些应用程序可能是首先共享并从那里扩展的良好候选者。


推荐