Websockets和负载均衡

10

Spring和Java EE对WebSockets有很好的支持。 例如,在Spring中您可以做到:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

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

}

使用 MyHandler 类,您可以发送和侦听 HTML5 WebSocket 消息。

var webSocket = 
      new WebSocket('ws://localhost:8080/myHandler');
 webSocket.onmessage = function(event) {
      onMessage(event)
    };

问题在于当您在负载平衡器后运行多个服务器时,服务器A的客户端将无法收到服务器B上的事件通知。

在Spring中,可以使用使用Stomp协议的消息代理解决此问题 (http://assets.spring.io/wp/WebSocketBlogPost.html)

由于对我来说,使用处理程序和“本地”html5 WebSockets似乎更容易比使用Stomp方式,我的问题是:

  1. 是否可以在没有Stomp协议的情况下使用消息代理?
  2. 有没有其他选项来解决负载平衡问题?
1个回答

3
消息代理可以不使用STOMP,例如RabbitMQ代理,它可以与其他几种协议一起使用,如HTTP,AMQP,MQTT和JMS实现。
由于应用程序有多个实例,最好的选择是拥有一个中央消息代理来处理需要发布到所有应用程序客户端的消息。
任何替代方案都意味着需要手动完成类似的工作,后端服务器需要以某种方式相互通信并通知彼此的事件。一种替代方案是将某些事件写入数据库,并让每个服务器轮询某个表,但这是我们尝试避免的设计类型。
另外,关于负载均衡和Websockets,负载平衡器需要配置以允许转发HTTP Upgrade标头,默认情况下通常关闭。例如,nginx需要一些配置才能允许转发这些标头,否则Websockets将无法工作。
在这种情况下,SockJS将自动使用一些回退选项,当Websockets不可行时启用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接