Мы используем контейнер Jetty версии 9.3.11 для развертывания нашего приложения.
мы используем клиент tyrus для подключения клиента к серверу веб-сокетов, который мы развернули.
когда я подключаюсь, используя следующий код:
WebSocket ws = null;
try {
ws = new WebSocketFactory().createSocket(server)
.addListener(new NotifierAdapter(userId, channel))
.addExtension(WebSocketExtension.PERMESSAGE_DEFLATE).connect();
} catch (WebSocketException we) {
connect(server, userId, channel);
}catch(Exception e)
{
e.printStackTrace();
}return ws;
Около 8000 подключений моя машина занимала 40% памяти
Но с модификацией кода (удаление расширения deflate)
try {
ws = new WebSocketFactory().createSocket(server)
.addListener(new NotifierAdapter(userId, channel))
.connect();
} catch (WebSocketException we) {
connect(server, userId, channel);
}catch(Exception e)
{
e.printStackTrace();
}return ws;
Удалось подключиться к 15000 соединений только с 15% памяти. Есть ли утечка с соответствующими дефляторами даже в последней версии сервера Jetty..
Есть ли способ отключить PERMESSAGE_DEFLATE на стороне сервера причала. Также мы используем стратегию весеннего веб-сокета, передающую jettyrequestupgrade
Код конфигурации Spring выглядит следующим образом:
@Configuration
@EnableWebMvc
@EnableAspectJAutoProxy
@EnableWebSocket
public class WebMVCConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
private static final String NOTIFIER_ENDPOINT_URL = "/notificationHandler";
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(socketHandler(), NOTIFIER_ENDPOINT_URL).setAllowedOrigins("*");
}
@Bean
public WebSocketHandler socketHandler() {
return new NotificationSocketHandler();
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Bean
public DefaultHandshakeHandler handshakeHandler() {
WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER);
policy.setInputBufferSize(8192);
policy.setIdleTimeout(600000);
WebSocketServerFactory ws=new WebSocketServerFactory(policy);
ws.getExtensionFactory().unregister("permessage-deflate");
return new DefaultHandshakeHandler(new JettyRequestUpgradeStrategy(ws));
}
}
Хотя я не зарегистрировал permessage-deflate, когда я подключаюсь из браузера в заголовке ответа, я вижу, что флаг все еще включен, любые другие изменения должны быть сделаны в контейнере для этого ??
Или есть какие-либо проблемы с конфигурацией весеннего веб-сокета:
Также заголовок ответа выглядит следующим образом:
Connection:Upgrade
Sec-WebSocket-Accept:xbbUnu7pDWs9Q0st4T1LzsIfqao=
Sec-WebSocket-Extensions:permessage-deflate
Upgrade:WebSocket
Я думаю, что ошибка ниже еще не решена.
https://github.com/eclipse/jetty.project/issues/293
Есть ли какой-либо обходной путь для этого (явная конфигурация на сервере причала для отключения PERMESSAGE_DEFLATE в контейнере сервера причала или конфигурация весны для причала
После поиска я не смог найти какое-либо решение для конфигурации контейнера/кода сервера с весенним веб-сокетом, который не работал.
В качестве обходного пути я написал перехватчик, который удалит параметр Sec Websocket entension из заголовка, чтобы сервер отправил ответ без этого расширения.