Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在spring boot应用程序中处理长轮询,通过nginx实现负载平衡?_Javascript_Nginx_Spring Boot_Stomp_Spring Websocket - Fatal编程技术网

Javascript 如何在spring boot应用程序中处理长轮询,通过nginx实现负载平衡?

Javascript 如何在spring boot应用程序中处理长轮询,通过nginx实现负载平衡?,javascript,nginx,spring-boot,stomp,spring-websocket,Javascript,Nginx,Spring Boot,Stomp,Spring Websocket,让我首先描述一下给定的情况 我有一个有角度的JavaScript前端。我需要使用websocket,因此我使用“sockjs”和“stomp websocket” 我的后端是一个Spring启动应用程序: @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override pub

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

我有一个有角度的JavaScript前端。我需要使用websocket,因此我使用“sockjs”和“stomp websocket”

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

@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中禁用WebSocket,它仍然可以正常工作(在这种情况下,回退可以正常工作)

当我启动更多后端实例并使用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";
    }
}
当我对多个后端使用此设置时,WebSocket仍能正常工作,但如果我在浏览器中禁用WebSocket,回退将不再工作。它只是保持连接并立即断开连接

浏览器控制台中出现错误:

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
在这一点上,我不知道如何配置nginx或我的后端以在给定的设置下正常工作。
现在我希望有人对这个问题有一个想法或提示。

我找到了一个可能对其他人有用的解决方案。它适用于粘性会话()


不幸的是,我不允许使用粘性会话。因此,我的搜索一直在进行。

能否在浏览器开发工具中检查浏览器选择了哪种传输,以及在“网络”选项卡中收到了什么错误消息?它不断重复这四个请求:-获取->状态200-发布->状态200中止-发布->状态204-发布->状态404在这种情况下,可能与此相关?谢谢你的回复。我尝试禁用代理缓冲,但没有解决问题。在不使用nginx的情况下尝试-如果有效,这意味着这个问题应该是关于nginx的(并移至serverfault)
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
org.apache.catalina.connector.ClientAbortException: java.io.IOException: Datenübergabe unterbrochen (broken pipe)
upstream ws_be {
    ip_hash;
    server localhost:8081;
    server localhost:8082;
}