Spring Web 套接字不向所有应用程序服务器广播消息



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

  • 服务器 1:负责作业执行和 35% 的用户负载。
  • 服务器 2:100% 用户负载。

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

现在,我已经为我的GRAILS应用程序使用了Spring Web套接字插件,并且我使用以下方法将消息推送到浏览器

brokerMessagingTemplate.convertAndSend(user.notificationChannel, ((notification.toMap(user) as JSON)).toString())

它在单服务器设置上工作正常。但是在多服务器设置中, 通知仅在服务器 1 上接收,因为这是调用代码块的服务器,如果反转场景,则观察到反之亦然的结果。

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

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

注意:第三方服务解决方案在我的情况下不起作用,因为应用程序位于内部网上并且无法访问互联网。

默认情况下,websocket 指向主机名/IP 地址 - 而您可以设置指向多个不同 IP/服务器的 DNS 记录/主机名。如果 websocket 向一个发送握手并将消息发送到另一个,这本身就会中断 websocket 的通信流。

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

然后,每个实例都将运行一个 ws 内部客户端。发送消息时,ws 客户端将被触发,尝试使用它尝试连接并发送消息的 ws 客户端"从数据库"查找所有活动的 websocket 服务器。然后每个人都会收到消息并广播给所有连接的用户,或者如果它来自用户 x 意味着用户 x,那么就像每个聊天插件一样,如果在服务器 y 上找到它,它只会将其中继给用户 x,依此类推。

然后,这使所有内容都与控制整个过程WebSocket服务器的1技术保持一致,该服务器具有自己的客户端,该客户端将多个实例WS套接字服务器中继到末端

相关内容

最新更新