我有一个相对较高级别的架构问题。我的应用程序在群集中的多个物理节点上的多个JVM上运行。如果我定义一个websocket端点以便它可以由任何JVM提供服务,我如何启动服务器启动的“发送”消息,以便跨任何JVM的所有适当连接都可以发送消息?
我的意思是,如果用户A连接到JVM-A并且用户B连接到JVM-B,然后发生JVM-C上的事件,则需要通知用户A和B如何工作?起初我正在考虑在分布式内存中共享连接/会话对象,但我不认为因为物理连接在某个服务器上而拥有该对象就足够了?
有没有更标准的方法来处理这个问题?
答案 0 :(得分:1)
如果使用订阅多播套接字的CDI(最好只能在LAN上访问的网络接口),建议创建一个ApplicationScoped
(如果是JSF)或Singleton
的bean。当一个websocket启动“发送”时,它还会向组播组发送LAN消息(可能包括要重新分配的Web套接字消息)。接收bean应该检查它们是否分派了已发送的消息(取决于组播环回是否处于活动状态)并丢弃它们自己发起的任何内容,但是一旦在组播组上收到LAN消息,它们将使用它们自己的活动websockets重新分派相关消息。
答案 1 :(得分:0)
您可以创建一个队列,并从此队列中读取您的节点。比知道何时从队列中删除消息更具挑战性。 建议:每个节点读取消息并为其自己的连接套接字进行多播,而不是为消息建立超时,这样每个节点都应该知道它已经发送了该消息,并且如果消息超时,任何节点都可以将其从队列中删除。 你的情况会有可能吗?
答案 2 :(得分:0)
从Phoenix框架中借来的一个想法:
您可以引入某种发布/订阅(例如Redis)。每当集群中的一台服务器上发生有趣的事情时,就向发布/订阅发布通知。所有服务器都订阅该发布/订阅。每当服务器从pub / sub接收到通知时,服务器都会检查自身的网络套接字,确定哪些网络套接字应接收消息,将通知转换为消息,然后将其发送给客户端。
最困难的部分是发布/订阅服务器的单点故障。您必须复制它。