Spring Web Socket 未向所有应用程序服务器广播消息

Spring Web Socket not broadcasting message to all application servers

我正在尝试设置具有 2 个应用程序服务器实例的负载平衡环境。我无法向所有实例发送 spring 网络套接字中继消息。让我们举个例子来更好地描述我的问题:

两者都连接到相同的数据库模式,因此作业请求可以来自任何服务器实例,但将在服务器 1 上执行。

现在,我已经为我的 GRAILS 应用程序使用了 spring 网络套接字插件,并且我使用

将消息推送到浏览器
brokerMessagingTemplate.convertAndSend(user.notificationChannel, ((notification.toMap(user) as JSON)).toString())

它在单服务器设置上运行良好。但是在多服务器设置中, 通知仅在服务器 1 上接收,因为它是调用代码块的服务器,如果情况相反,则反之亦然。

如何将相同的通知推送到所有服务器实例,以便用户无论在哪个服务器实例上都能始终收到通知?

我最初考虑使用像 RabitMQ 这样的公共队列,但这会增加系统要求,并且会被客户拒绝。

注意:第三方服务解决方案不适用于我的情况,因为应用程序位于 Intranet 上并且无法访问 Internet。

websockets 默认指向一个 hostname/ip 地址——同时你可以设置一个指向多个不同 ip/服务器的 dns 记录/主机名。如果它向一个人发送握手并将消息发送给另一个人,这本身就会破坏 websockets 的通信流。

最简单的方法是考虑一些数据库 table 两者共享,并且当每个实例出现时 up/alive 它将其本地 ip / 套接字端口记录到数据库 table - 然后每个实例都可以读取这个 table 并在任何时候计算出将套接字消息传输到的主机 - (这个 table 需要以某种方式管理 - 在全新的启动时)它会是空的,并且会在实例出现时弹出 - 当主机关闭时再次管理一些东西。

然后每个实例都会 运行 一个 ws internal client. When a message is sent the ws client would be triggered attempting to find all alive websocket servers "from the db" to each using the ws client 它会尝试连接并发送消息。然后每个人都会收到消息并广播给所有连接的用户,或者如果它来自用户 x 意味着用户 x 那么就像每个聊天插件一样,如果在服务器 y 上找到它只会将它转发给用户 x 等等。

然后通过 1 种技术控制整个过程的 websocket 服务器保持一致,该服务器有自己的客户端,中继到多实例 ws 套接字服务器