Comment gérer les longues interrogations dans une application de démarrage printanière, équilibrée par nginx?

Laissez-moi d’abord décrire la situation donnée.

J’ai un frontend angular en JavaScript. J’ai besoin d’utiliser des websockets, donc j’utilise “sockjs” et “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'); } }); 

Mon backend est une application 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); } } 

Cette configuration fonctionne sans aucun problème. Même lorsque je désactive les websockets dans Firefox, cela fonctionne toujours sans aucun problème (le retour en arrière fonctionne dans ce scénario).

Mes problèmes commencent lorsque je lance plus d’instances de mon backend et que j’utilise nginx.

Mon nginx config est:

 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"; } } 

Lorsque j’utilise cette configuration avec plusieurs backends, les websockets fonctionnent toujours comme prévu mais si je désactive les websockets dans mon navigateur, le retour ne fonctionne plus. Il ne fait que restr connecté et déconnecter instantanément.

Erreur dans la console du navigateur:

 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 <<>> SUBSCRIBE id:sub-0 destination:/dummy/message Whoops! Lost connection to undefined 

Sur le backend je reçois une erreur de pipe cassée IO:

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

À ce stade, je n’ai aucune idée de la façon dont je dois configurer nginx ou mon backend pour qu’il fonctionne correctement avec la configuration donnée. Maintenant, j’espère que quelqu’un a une idée ou un indice pour ce problème.

J’ai trouvé une solution qui peut fonctionner pour d’autres. Cela fonctionne avec la session collante ( http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash )

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

Malheureusement, je ne suis pas autorisé à utiliser des sessions autocollantes. Pour cela ma recherche continue.