簡體   English   中英

Websockets和負載平衡

[英]Websockets and load balancing

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. 還有其他選擇可以克服負載平衡問題嗎?

消息代理可以在沒有STOMP的情況下使用,例如RabbitMQ代理 ,它可以與其他幾個協議一起使用; HTTP,AMQP,MQTT,AMQP。 您可以將它們用作JMS實現。

由於應用程序有多個實例,因此最好的替代方案是使用中央消息傳遞代理來處理需要發布到所有應用程序的客戶端的消息。

任何替代方案都意味着手工做類似的事情,后端的服務器需要以某種方式進行通信並相互通知這些事件。 另一種方法是向數據庫寫入某些事件並讓每個服務器輪詢一些表,但這是我們試圖避免的設計類型。

此外,關於負載平衡和Web套接字,負載均衡器需要配置為允許轉發HTTP升級標頭,默認情況下通常是關閉的。 例如,nginx需要一些配置來允許轉發這些頭,否則Websockets將無法工作。

在這種情況下,當無法使用Web套接字時,SockJS將自動使用一些后備選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM