有许多 JBoss 节点,并且每个节点都部署了同一个耳朵(Java EE 应用程序)。在我的应用程序中,用户可以登录到每个单独的节点,我想跟踪同一用户是否登录到不同的节点。我如何追踪它?
如果只有一个节点,那么我可以使用所有用户登录的全局地图进行跟踪。但我找不到不同节点的解决方案。这可以使用数据库来完成,但由于另一个约束,我不想使用 DB。
请问有什么解决办法吗?
有许多 JBoss 节点,并且每个节点都部署了同一个耳朵(Java EE 应用程序)。在我的应用程序中,用户可以登录到每个单独的节点,我想跟踪同一用户是否登录到不同的节点。我如何追踪它?
如果只有一个节点,那么我可以使用所有用户登录的全局地图进行跟踪。但我找不到不同节点的解决方案。这可以使用数据库来完成,但由于另一个约束,我不想使用 DB。
请问有什么解决办法吗?
选择您的一个节点作为主节点。每次登录都会向 master 注册用户,而 master 又会保留一个列表。这会产生单点故障 (SPOF),但如果仅用于日志记录,则可能没问题。通过一些努力,您可以消除 SPOF。
使用像JGroups这样的多播库。因此,每个节点在登录后都会通知所有其他节点。所有节点都包含一个本地登录用户列表。
使用 JMS 主题,并在每个节点上让 MDB 监听该主题:登录后,在主题上发布一条消息,每个节点可能会构建一个登录用户列表(这个想法由 Aash Maharoon 指出在评论中,见下文)
使用 JBoss 7 考虑Infinispan。它是内置的,对于您的用例,它基本上提供了一个集群感知的java.util.Map
. 它在内部使用 JGroups。
第一个选项可以用一些 servlet 来实现(= 没有任何额外的库等)。第二个需要另一个库。
第三个选项需要 JMS(JBoss 有一个内置的 JMS 提供程序)。如果一个节点宕机,它可能会丢失一些消息。如果这是一个问题,请考虑使用持久主题订阅。示例:Pub-Sub(发送部分相关)和MDB
第四个选项甚至需要一个“成熟的”模块/服务,但它提供了最高级别的抽象。