Spring 启动 Websocket 缩放
Spring boot Websocket scaling
我有一个 spring 使用 web-sockets 和 stomp 的引导应用程序,由于我们的 ISAM 设置的限制,我必须使用 xhr-polling
协议并且这个应用程序将托管在 Pivotal Cloud Foundry (PCF)
.
当我 运行 单个实例时,使用以下代码(下方)一切正常。
服务器
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/dummy");
registry.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry
.addEndpoint("/dummyendpoint")
.setAllowedOrigins("*")
.withSockJS();
}
}
客户端
var socket,client;
socket = new SockJS('http://localhost:8080/dummyendpoint');
client = Stomp.over(socket);
client.connect({}, function () {
client.subscribe('/dummy/message', function (message) {
console.log('subscribed');
}
});
但是,如果我扩展到 2 个实例,web-socket
连接开始失败:
GET localhost:8080/dummyendpoint/info -> Status 200
POST localhost:8080/dummyendpoint/300/jskdncdj/xhr -> Status 200 OK
POST localhost:8080/dummyendpoint/300/jskdncdj/xhr_send -> Status 204
POST localhost:8080/dummyendpoint/300/jskdncdj/xhr_send -> Status 404
我一直在查看发布的其他问题,例如 Spring Websocket in a tomcat cluster 我实施了他们的解决方案但没有成功。
我一直在阅读 spring-session
,它看起来支持网络套接字(如果我没看错的话?)。
我试过使用 spring-session
与 Redis 和 with/without RabbitMQ 作为消息代理:
public class WebSocketConfig extends AbstractSessionWebSocketMessageBrokerConfigurer<Session>{
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app");
registry
.enableStompBrokerRelay("/topic")
.setRelayHost("localhost")
.setRelayPort(61613)
.setClientLogin("guest")
.setClientPasscode("guest");
}
@Override
public void configureStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry
.addEndpoint("/dummyendpoint")
.setAllowedOrigins("*")
.withSockJS();
}
}
我尝试过的一切都以同样的错误结束:
GET localhost:8080/dummyendpoint/info -> Status 200
POST localhost:8080/dummyendpoint/300/jskdncdj/xhr_streaming -> Status 200 Aborted
POST localhost:8080/dummyendpoint/300/jskdncdj/xhr_send -> Status 204
POST localhost:8080/dummyendpoint/300/jskdncdj/xhr_send -> Status 404
有谁知道我为什么会收到这个错误?
我猜这是因为我正在连接到实例 1 而另一个请求正在访问另一个实例?
我可以在使用 xhr-polling
时垂直和水平缩放应用程序吗?
谢谢
斯宾塞
忘记更新了,Whosebug。com/a/43174082/4978471 解释了为什么这是不可能的。
我有一个 spring 使用 web-sockets 和 stomp 的引导应用程序,由于我们的 ISAM 设置的限制,我必须使用 xhr-polling
协议并且这个应用程序将托管在 Pivotal Cloud Foundry (PCF)
.
当我 运行 单个实例时,使用以下代码(下方)一切正常。
服务器
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/dummy");
registry.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry
.addEndpoint("/dummyendpoint")
.setAllowedOrigins("*")
.withSockJS();
}
}
客户端
var socket,client;
socket = new SockJS('http://localhost:8080/dummyendpoint');
client = Stomp.over(socket);
client.connect({}, function () {
client.subscribe('/dummy/message', function (message) {
console.log('subscribed');
}
});
但是,如果我扩展到 2 个实例,web-socket
连接开始失败:
GET localhost:8080/dummyendpoint/info -> Status 200
POST localhost:8080/dummyendpoint/300/jskdncdj/xhr -> Status 200 OK
POST localhost:8080/dummyendpoint/300/jskdncdj/xhr_send -> Status 204
POST localhost:8080/dummyendpoint/300/jskdncdj/xhr_send -> Status 404
我一直在查看发布的其他问题,例如 Spring Websocket in a tomcat cluster 我实施了他们的解决方案但没有成功。
我一直在阅读 spring-session
,它看起来支持网络套接字(如果我没看错的话?)。
我试过使用 spring-session
与 Redis 和 with/without RabbitMQ 作为消息代理:
public class WebSocketConfig extends AbstractSessionWebSocketMessageBrokerConfigurer<Session>{
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app");
registry
.enableStompBrokerRelay("/topic")
.setRelayHost("localhost")
.setRelayPort(61613)
.setClientLogin("guest")
.setClientPasscode("guest");
}
@Override
public void configureStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry
.addEndpoint("/dummyendpoint")
.setAllowedOrigins("*")
.withSockJS();
}
}
我尝试过的一切都以同样的错误结束:
GET localhost:8080/dummyendpoint/info -> Status 200
POST localhost:8080/dummyendpoint/300/jskdncdj/xhr_streaming -> Status 200 Aborted
POST localhost:8080/dummyendpoint/300/jskdncdj/xhr_send -> Status 204
POST localhost:8080/dummyendpoint/300/jskdncdj/xhr_send -> Status 404
有谁知道我为什么会收到这个错误?
我猜这是因为我正在连接到实例 1 而另一个请求正在访问另一个实例?
我可以在使用 xhr-polling
时垂直和水平缩放应用程序吗?
谢谢
斯宾塞
忘记更新了,Whosebug。com/a/43174082/4978471 解释了为什么这是不可能的。