2014-04-20 19 views
8

Spring và Java EE có hỗ trợ tốt cho websockets. Ví dụ trong mùa xuân, bạn có thể có:Websockets và cân bằng tải

@Configuration 
@EnableWebSocket 
public class WebSocketConfig implements WebSocketConfigurer { 

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

} 

Và với MyHandler lớp học mà bạn có thể gửi và lắng nghe các thông điệp sang HTML5 WebSocket.

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

Vấn đề là nếu bạn chạy nhiều máy chủ phía sau bộ cân bằng tải. Các khách hàng của máy chủ A sẽ không được thông báo cho các sự kiện trên máy chủ B.

Vấn đề này được giải quyết trong mùa xuân bằng cách sử dụng môi giới thông điệp với Stomp giao thức (http://assets.spring.io/wp/WebSocketBlogPost.html)

Kể từ khi sử dụng bộ xử lý và "mẹ đẻ" html5 WebSockets vẻ dễ dàng hơn với tôi thì cách Stomp, câu hỏi của tôi là:

  1. Có thể sử dụng nhà môi giới thư không có giao thức Stomp không?
  2. Có tùy chọn nào khác để khắc phục sự cố cân bằng tải không?

Trả lời

3

Có thể sử dụng môi giới thư không có STOMP, ví dụ: RabbitMQ broker, có thể sử dụng với một số giao thức khác; HTTP, AMQP, MQTT, AMQP. Bạn có thể sử dụng chúng như là một thực hiện JMS.

Vì có một số trường hợp của ứng dụng, cách thay thế tốt nhất là thực sự có một nhà môi giới nhắn tin trung tâm để xử lý các thư cần được xuất bản cho khách hàng của tất cả các ứng dụng.

Bất kỳ phương án thay thế nào sẽ ngụ ý thực hiện điều gì đó tương tự bằng tay, các máy chủ trong chương trình phụ trợ cần liên lạc và thông báo cho nhau về những sự kiện đó theo một cách nào đó. Một lựa chọn khác là viết vào cơ sở dữ liệu các sự kiện nhất định và yêu cầu mỗi máy chủ thăm dò một số bảng, nhưng đó là kiểu thiết kế mà chúng ta cố gắng tránh.

Cũng liên quan đến cân bằng tải và ổ cắm web, trình cân bằng tải cần phải được định cấu hình để cho phép chuyển tiếp tiêu đề HTTP Upgrade, thường bị tắt theo mặc định. Ví dụ nginx cần một số cấu hình để cho phép chuyển tiếp các tiêu đề này, nếu không Websockets sẽ không hoạt động.

Trong trường hợp đó, SockJS sẽ tự động sử dụng một số tùy chọn dự phòng khởi động khi không thể sử dụng ổ cắm web.

Các vấn đề liên quan