2014-04-20 24 views
8

Spring i Java EE mają dobre wsparcie dla websockets. Na przykład wiosną można mieć:Websockets i równoważenie obciążenia

@Configuration 
@EnableWebSocket 
public class WebSocketConfig implements WebSocketConfigurer { 

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

} 

I z MyHandler klasie można wysyłać i nasłuchiwać wiadomości do HTML5 websocket.

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

Problem polega na uruchomieniu wielu serwerów za modułem równoważenia obciążenia. Klienci serwerze A nie zostaną powiadomieni o imprezach na serwerze B.

Ten problem został rozwiązany wiosną za pomocą Message Broker z protokołem Stomp (http://assets.spring.io/wp/WebSocketBlogPost.html)

Od użyciu przewodnika i „native” html5 WebSockets wyglądem prostsze dla mnie niż sposób Stomp, moje pytania to:

  1. Czy można użyć brokera komunikatów bez protokołu Stomp?
  2. Czy są jakieś inne opcje rozwiązania problemu równoważenia obciążenia?

Odpowiedz

3

Pośredników komunikatów można używać bez STOMP, przyjmując na przykład kod RabbitMQ broker, można go używać z kilkoma innymi protokołami; HTTP, AMQP, MQTT, AMQP. Można ich używać jako implementacji JMS.

Ponieważ istnieje kilka wystąpień aplikacji, najlepszą alternatywą jest posiadanie centralnego brokera komunikatów do obsługi komunikatów, które muszą być publikowane dla klientów wszystkich aplikacji.

Każda alternatywa oznaczałaby robienie czegoś podobnego ręcznie, serwery w zapleczu muszą komunikować się i powiadamiać się nawzajem o tych zdarzeniach w jakiś sposób. Alternatywą byłoby zapisanie do bazy danych pewnych zdarzeń i sprawdzenie, czy każdy serwer odpytuje jakąś tabelę, ale jest to rodzaj projektu, który staramy się ominąć.

Również w odniesieniu do równoważenia obciążenia i gniazd internetowych, moduł równoważenia obciążenia musi być skonfigurowany tak, aby zezwolić na przekazywanie nagłówków uaktualnień HTTP, które zazwyczaj są domyślnie wyłączone. Na przykład nginx potrzebuje pewnej konfiguracji, aby umożliwić przekazywanie tych nagłówków, w przeciwnym razie Websockets nie będą działać.

W takim przypadku SockJS automatycznie użyje niektórych opcji awaryjnych, które zostaną uruchomione, gdy gniazda internetowe nie będą możliwe.

Powiązane problemy