Java WebSocket和负载平衡

Java WebSocket和负载平衡,java,javascript,html,spring,websocket,Java,Javascript,Html,Spring,Websocket,Spring和JavaEE对WebSocket有很好的支持。 例如,在Spring中,您可以有: @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { regis

Spring和JavaEE对WebSocket有很好的支持。 例如,在Spring中,您可以有:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyHandler(), "/myHandler")
            .addInterceptors(new HttpSessionHandshakeInterceptor());
    }

}
使用
MyHandler
类,您可以向HTML5WebSocket发送和侦听消息

var webSocket = 
      new WebSocket('ws://localhost:8080/myHandler');
 webSocket.onmessage = function(event) {
      onMessage(event)
    };
问题是如果在负载平衡器后面运行多个服务器。服务器B上的事件不会通知服务器A的客户端

这个问题在Spring中通过使用带有Stomp协议()的MessageBroker解决

由于使用handler和“原生”html5 WebSocket在我看来比使用Stomp方式更容易,我的问题是:

  • 是否可以在没有Stomp协议的情况下使用MessageBroker
  • 有没有其他解决负载平衡问题的方法

  • 消息代理可以在不使用STOMP的情况下使用,例如,它可以与其他几种协议一起使用;HTTP,AMQP,MQTT,AMQP。您可以将它们用作JMS实现

    由于该应用程序有多个实例,因此最好的替代方法是使用一个中央消息代理来处理需要发布到所有应用程序的客户端的消息

    任何替代方案都意味着手动执行类似的操作,后端的服务器需要以某种方式相互通信并通知这些事件。另一种方法是向数据库写入某些事件,并让每个服务器轮询一些表,但这是我们试图避免的设计类型

    另外,关于负载平衡和web套接字,负载平衡器需要配置为允许HTTP升级头的转发,这通常在默认情况下是关闭的。例如,nginx需要一些配置来允许转发这些头,否则Websockets将无法工作

    在这种情况下,SockJS将自动使用一些回退选项,这些选项在web套接字不可用时生效