У меня есть сервер AWS (средний), работающий на ЕС-Западе, и есть примерно 250 подключенных устройств, но также постоянно подключаются из-за проблем с подключением к Интернету, но по некоторым причинам количество соединений TCP с сервер растет до тех пор, пока он не достигнет 4300. Тогда новые серверы не разрешены. Я подтвердил, что он изолирован от запросов WebSocket и не является обычным HTTP-запросом.Play 2.5 WebSocket Connection Build
Соединения в WebSocket поддерживаются на устройство на карте с устройством UUID в качестве ключа; иногда бывает, что устройство отправит запрос на новое соединение WS, даже если сервер имеет подключение к устройству. В этом случае текущее соединение закрывается, и возвращается ошибка, чтобы устройство могло повторить запрос на соединение.
Ниже приведен фрагмент кода контроллера, обрабатывающего соединения с помощью LegacyWebSocket. Соединения закрыты с помощью out.close()
согласно https://www.playframework.com/documentation/2.5.x/JavaWebSockets#handling-websockets-using-callbacks
public LegacyWebSocket<String> create(String uuid) {
logger.debug("NEW WebSocket request from {}, creating new socket...", uuid);
if(webSocketMap.containsKey(uuid)){
logger.debug("WebSocket already exists for {}, closing existing connection", uuid);
webSocketMap.get(uuid).close();
logger.debug("Responding forbidden to force WS restart from device {}", uuid);
return WebSocket.reject(forbidden());
}
LegacyWebSocket<String> ws = WebSocket.whenReady((in, out) -> {
logger.debug("Adding downstream connection to webSocketMap-> {} webSocketMap.size() = {}",uuid, webSocketMap.size());
webSocketMap.put(uuid,out);
// For each event received on the socket,
in.onMessage(message->{
if(message.equals("ping")){
logger.debug("PING received from {} {}",uuid, message);
out.write("pong");
}
});
// When the socket is closed.
in.onClose(() -> {
logger.debug("onClose, removing for {}",uuid);
webSocketMap.remove(uuid);
});
});
return ws;
}
Как я могу гарантировать, что Play Framework закрывает соединение TCP для закрытого WS соединений?
вызов, который я использую, чтобы проверить количество TCP соединений является netstat -n -t | wc -l