Java 跨多个服务器的Tomcat WebSocket 当前解决方案

Java 跨多个服务器的Tomcat WebSocket 当前解决方案,java,websocket,tomcat8,tomcat8.5,Java,Websocket,Tomcat8,Tomcat8.5,我有一个Java服务器(Tomcat)设置问题,希望有人能提供一些指导。目前,我的web应用程序是一个单一服务器,在Tomcat8.5上运行Java后端。为了处理Websocket连接,我保留了在onOpen()方法中传递的所有javax.Websocket.Session的Map @ServerEndpoint("/status") public class StatusMessenger { private static ConcurrentHashMap&

我有一个Java服务器(Tomcat)设置问题,希望有人能提供一些指导。目前,我的web应用程序是一个单一服务器,在Tomcat8.5上运行Java后端。为了处理Websocket连接,我保留了在
onOpen()
方法中传递的所有
javax.Websocket.Session
Map

@ServerEndpoint("/status")
public class StatusMessenger
{   
    private static ConcurrentHashMap<String, Session> sessions = new ConcurrentHashMap();

    @OnOpen
    public void onOpen(Session session) throws Exception
    {
        String sessionId = session.getRequestParameterMap().get("sessionId").get(0);
        sessions.put(session.getId(), session);
    }
  • 我甚至不确定这是否是Tomcat中处理WebSocket的正确方法,但它已经为我工作了多年,所以我认为它是可以接受的
  • 问题 现在,我想将AWS上的应用程序横向扩展到多个服务器。在大多数情况下,我的应用程序是无状态的,我将常规HTTP会话信息存储在数据库中。我的问题是
    javax.websocket.Session
    的静态
    Map
    ——它不是无状态的,每个服务器上都有不同的
    Map
    ,每个服务器都有自己的
    javax.websocket.Session
    列表

    在我的应用程序中,服务器代码在某些情况下需要向所有用户广播一条消息。这些事件可能发生在此多服务器设置中的任何服务器上。该事件将触发
    broadcast()
    方法,该方法在
    javax.websocket.Session
    s中循环。但是,它将只在自己的
    映射中循环会话


    如何让多服务器应用程序将此消息广播到安装程序中所有服务器上存储的所有websocket连接?该应用程序在单个服务器上运行良好(显然),因为只有一个websocket会话列表。换句话说,我该如何编写一个无状态应用程序来存储websocket连接,以便以后可以与它们通信?

    我找到了两种解决方案

  • 在我的负载平衡器中,我设置了一条规则,将所有路径与/{my websocket server path}一起路由到1台服务器,以便所有会话都在同一台服务器上

  • 使用第三方web推送库,如Pusher()


  • 我找到了两种解决方案

  • 在我的负载平衡器中,我设置了一条规则,将所有路径与/{my websocket server path}一起路由到1台服务器,以便所有会话都在同一台服务器上

  • 使用第三方web推送库,如Pusher()

  • public static void broadcast(String event, String message)
    {
        for (Session session: sessions.values())
        {
           // send the message
        }
    }