代码之家  ›  专栏  ›  技术社区  ›  Aditya T

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

  •  0
  • Aditya T  · 技术社区  · 7 年前

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

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

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

    现在,我已经为我的GRAILS应用程序使用了SpringWebSocket插件,并使用

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

    它在单服务器设置上运行良好。但在多服务器设置中, 仅在服务器1上接收通知,因为它是调用代码块的服务器,如果反转场景,则会观察到相反的结果。

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

    我最初考虑使用RabitMQ这样的通用队列,但这会增加系统需求,并会遭到客户的反对。

    注意:第三方服务解决方案在我的情况下不起作用,因为应用程序位于intranet上,并且没有internet访问。

    1 回复  |  直到 7 年前
        1
  •  0
  •   V H    6 年前

    websockets默认指向主机名/ip地址,而您可以设置指向多个不同ip/服务器的dns记录/主机名。如果它向一方发送握手,并向另一方发送消息,则这本身将中断WebSocket的通信流。

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

    然后,每个实例将运行 ws internal client . 当发送消息时,ws-client将被触发,试图使用 ws client 它将尝试在上连接并发送消息。然后,每个人都会收到消息,并广播给所有连接的用户,或者如果消息来自用户x,则意味着用户x,然后像每个聊天插件一样,如果在服务器y上找到,则只会将消息转发给用户x,以此类推。

    然后,这使其与控制整个流程的websocket服务器的1种技术保持内联,该服务器有自己的客户端,该客户端中继到多实例ws-socket服务器