gpt4 book ai didi

javascript - 如何在 spring boot 应用程序中处理长轮询,由 nginx 进行负载平衡?

转载 作者:行者123 更新时间:2023-12-04 17:11:51 25 4
gpt4 key购买 nike

让我先描述一下给定的情况。

我有一个 Angular JavaScript 前端。我需要使用 websockets,因此我使用“sockjs”和“stomp-websocket”。

var socket,
client;
socket = new SockJS('http://localhost:8080/stomp');
client = Stomp.over(socket);
client.connect({}, function () {
client.subscribe('/dummy/message', function (message) {
console.log('subscribed');
}
});

我的后端是一个 Spring Boot 应用程序:

@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("/stomp")
.setAllowedOrigins("*")
.withSockJS()
.setSessionCookieNeeded(false);
}
}

此设置没有任何问题。即使我在 firefox 中禁用 websockets,它仍然可以正常工作(在这种情况下可以回退)。

当我启动更多后端实例并使用 nginx 时,我的问题就开始了。

我的 nginx 配置是:

upstream ws_be {
server localhost:8081;
server localhost:8082;
}

server {
listen 8080;

location / {
proxy_pass http://ws_be;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}

当我将此设置与多个后端一起使用时,websockets 仍按预期工作但是如果我在浏览器中禁用 websockets,则回退将不再起作用。它只是保持连接并立即断开连接。

浏览器控制台错误:

Opening Web Socket...  stomp.min.js:8:1893
Web Socket Opened... stomp.min.js:8:1893
>>> CONNECT
accept-version:1.1,1.0
heart-beat:10000,10000

<<< CONNECTED
version:1.1
heart-beat:0,0

connected to server undefined stomp.min.js:8:1893
>>> SUBSCRIBE
id:sub-0
destination:/dummy/message

Whoops! Lost connection to undefined

在后端,我收到一个 IO 损坏的管道错误:

org.apache.catalina.connector.ClientAbortException: java.io.IOException: Datenübergabe unterbrochen (broken pipe)

在这一点上,我不知道我必须如何配置 nginx 或我的后端才能在给定的设置下正常工作。现在我希望有人对这个问题有想法或提示。

最佳答案

我找到了一种可能对其他人有用的解决方案。它适用于粘性 session (http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash)

upstream ws_be {
ip_hash;
server localhost:8081;
server localhost:8082;
}

不幸的是,我不允许使用粘性 session 。因此我的搜索不断。

关于javascript - 如何在 spring boot 应用程序中处理长轮询,由 nginx 进行负载平衡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45861294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com