Помочь с настройкой надежного stomp websocket сервера на Spring Boot

10 000 руб. за проект
27 июля 2019, 02:14 • 0 откликов • 26 просмотров
Есть три ноды Spring приложения, которые выполняют роль реле между фронтэндом и rabbit-mq кластером.

Под нагрузкой случается такой баг: одна из нод отваливается и перестает отвечать фреймом CONNECTED на фрейм CONNECT. Хотя http запрос на Upgrade успешно уходит и возвращается со 101 статусом.

Когда я гружу сервер нагрузкой (пока просто подключениями и одной подпиской, хотя в реальности подписок больше и в них приходят сообщения), я не могу получить такой же результат, но зато получаю вот такую запись в логах:

23:05:12.690 DEBUG 1 --- [io-8082-exec-17] s.w.s.h.LoggingWebSocketHandlerDecorator : Transport error in StandardWebSocketSession[id=bf5ef2ed-93a6-5d38-ccf9-e77d14b7f294, uri=***]

java.io.EOFException: null
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1206) ~[tomcat-embed-core-9.0.17.jar!/:9.0.17]
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1140) ~[tomcat-embed-core-9.0.17.jar!/:9.0.17]
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72) ~[tomcat-embed-websocket-9.0.17.jar!/:9.0.17]
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171) ~[tomcat-embed-websocket-9.0.17.jar!/:9.0.17]
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151) ~[tomcat-embed-websocket-9.0.17.jar!/:9.0.17]
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148) ~[tomcat-embed-websocket-9.0.17.jar!/:9.0.17]
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54) ~[tomcat-embed-core-9.0.17.jar!/:9.0.17]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53) ~[tomcat-embed-core-9.0.17.jar!/:9.0.17]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) ~[tomcat-embed-core-9.0.17.jar!/:9.0.17]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415) ~[tomcat-embed-core-9.0.17.jar!/:9.0.17]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.17.jar!/:9.0.17]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.17.jar!/:9.0.17]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

23:05:12.692 DEBUG 1 --- [io-8082-exec-17] s.w.s.h.LoggingWebSocketHandlerDecorator : StandardWebSocketSession[id=bf5ef2ed-93a6-5d38-ccf9-e77d14b7f294, uri=***] closed with CloseStatus[code=1006, reason=null]
По результатам такого теста обычно большая часть запросов ведет себя именно так: подключается, получает 101 стату, отправляет CONNECT, но CONNECTED не получает.

Собственно задача - подсказать, как создать и настроить такую систему из нод, чтобы выдерживала желаемую нагрузку.

Версия Spring Boot - 2.1.4