我也有像 Mikael 一样的确切问题,并到此页面寻找答案。
没有一个答案对我来说是 100% 满意的。所以我在想4个选择:
使用有权访问所有用户的 Linux 组。在该组下运行单个 Java 应用程序。这个 Java 应用程序可以使用任何方式与“根”应用程序通信。
潜在地,它可以是“酒店”版。例如,每 100 个用户(或视情况而定)有 1 个“酒店”(具有组权限的应用程序)。因此,如果您有 10,000 个用户,您需要 100 家酒店,这是非常易于管理的。
为每个子应用程序在其自己的用户 ID 下生成一个 JVM。这就像调用脚本,但不是使用 stdin/stdio/stderr,而是使用任何通信协议。就我而言,我使用的是 XMPP 和IO 数据(因为它已经被其他组件使用,所以它在“哪里”运行,也就是运行哪个 JVM 并不重要)。
创建一个超级服务器“根”应用程序。这可以是原始“根”应用程序的一部分,也可以是专门用于服务管理的单独服务。
超级服务器负责处理用户特定子应用的传入请求(即它实际上成为反向代理),并启动真正的子应用(如果它们尚未运行),并来回传递消息在客户端和子应用程序之间。
此外,可以将子应用程序池化(或者甚至“钝化”,如果有的话),就像Java EE EJB 容器那样。因此,即使有 10,000 个用户和(可能)10,000 个子应用程序服务,运行的子应用程序的最大数量也是有上限的。闲置的应用程序被关闭以为其他应用程序腾出空间。
与#3 相同,但不是创建专有的服务管理机制,而是与Upstart(或底层操作系统中的服务管理框架)集成。即有一个可以控制Upstart 的“根”服务。Upstart可以启动、停止、重启,可以查询子服务的状态,就像它可以控制mysqld、Apache等一样。
For me, now, the quickest and simplest to implement would be #1. However, my ideal solution would be #4, but it will take time and testing whether it works well. (the concept itself borrows from inetd/xinetd and EJB, so I think it's pretty sound fundamentally)