Websockets和负载平衡

时间:2014-04-20 18:30:28

标签: java javascript html5 spring websocket

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上的事件通知。

使用带有Stomp协议(http://assets.spring.io/wp/WebSocketBlogPost.html

的消息代理在Spring中解决了这个问题

由于使用处理程序和“native”html5 websockets对我来说更容易,然后是Stomp方式,我的问题是:

  1. 在没有Stomp协议的情况下使用消息代理是否可行?
  2. 还有其他选项可以克服负载平衡问题吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

还涉及负载平衡和Web套接字,需要将负载均衡器配置为允许转发HTTP Upgrade标头,默认情况下通常是关闭的。例如,nginx需要一些配置来允许转发这些头,否则Websockets将无法工作。

在这种情况下,当无法使用网络套接字时,SockJS会自动使用一些后备选项。