Tomcat具有相同应用程序的多个实例

时间:2014-01-08 12:20:32

标签: java tomcat deployment architecture

我们正在构建一个java Web应用程序,其中每个客户都将拥有它自己的数据库模式的实例。

它将由我的公司管理,所以我想知道在同一个Tomcat运行时运行多个应用程序实例的最佳方法是什么,因为我们尝试在单个Tomcat上运行3个实例,最终结果为Out内存异常 我们考虑在同一台服务器上运行多个tomcat实例,但我们还没有测试过它。此外,我们正在考虑为每个客户提供单独的服务器。

根据您对类似场景的体验,您有什么看法?

EDITED:此应用程序不能是多租户,因为它的某些部分将有代码自定义,以及需要每个客户端的应用程序实例的一些其他业务事实。所以请求应用程序架构不是这里的主题。

谢谢,

木桥

2 个答案:

答案 0 :(得分:3)

您想使用multi tenant architecture。将只有一个数据库和Web应用程序实例,并且每个记录都将由“所有者”公司进行限定。您可以使用客户端用来访问应用程序的子域/域来区分它们。

简单地说,你为每个表添加了一个'domain_id'列,你有一个'where domain_id =?'在每个查询中。每个用户都有一个关联的domain_id,您将在登录时收到并放入会话中。实际上还会有其他考虑因素。

编辑:根据问题中的编辑,这是答案的另一部分。

在多租户架构中,可以自定义每个实例,而无需维护单独的代码库。一些自定义可以是“配置文件”的一部分。这适用于数据值和标志,如货币,日期格式等。需要特定于客户端的新功能的情况,这可以通过支持插件来实现。

将解决方案融入多租户架构中需要花费一次时间,这比为每个客户端维护几个单独版本的代码要好。您可能想要阅读“技术债务”主题。

ERP是业务应用程序的复杂案例,您可以从阅读OpenBravo Trial FAQ中获得灵感,以了解我们所说的内容。 Openbravo是开源的,你可以通过查看他们的代码获得技术细节。

答案 1 :(得分:2)

我的意见与Kinjal Dixit完全相同。你的方法是错误的,将是一个巨大的资源浪费。

如果您希望能够为同一服务器部署不同版本的Web应用程序,则必须隔离每个应用程序的类加载,这将意味着巨大的内存消耗。否则,如果所有web-app始终相同,则无需多次部署它。

为每个客户提供单独的服务器也将浪费资源(JVM的多个实例,相同库的多个类加载,线程数量的增加以及调度成本的增加)并且将使部署显着复杂化,特别是如果你计划一些集群策略,其中负载平衡可能会成为一个地狱

此外,如果你想为一个特定的客户提供一些特定功能,它也将成为管理/部署/升级等的地狱......

多租户架构并不一定意味着共享数据库(您可以为每个客户端配置一个数据库实例,并使用低级别的拦截器发送请求)但是共享Web应用程序是绝对必要的。

我还建议提供某种配置,以便为给定的客户端启用自定义功能。

我在一家公司工作,我们遇到了这个问题(将旧版Web应用程序公开为SAAS)我们开始为每个客户端部署一个Web应用程序,花费大量时间进行各种优化(包括类加载因子分解)以达到每个服务器14个客户的“巨大”数量。

这远远超出了我们的预期,我们最终转向多租户架构,但每个客户保留一个数据库实例,以避免数据模型重构的重要成本。新部署能够在同一台服务器上处理100多个客户,并具有无与伦比的性能。

编辑(根据问题更新)

如果你绝对想避免多租户,那么我建议每个服务器只使用一个servlet容器(tomcat)。在这种情况下,您将不得不让默认的web-app类加载隔离(因为您将在不同的实例中具有自定义代码),这将意味着高内存占用。但是,您应该将所有公共库放在common / lib tomcat目录中以分解它们的加载(请参阅http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html)。