Play 2.5 WebSocket Connection Build

У меня есть сервер AWS (средний), работающий на западе ЕС, и к нему подключено примерно 250 устройств, но они также всегда переподключаются из-за проблем с подключением к Интернету, но по какой-то причине количество TCP-подключений к серверу увеличивается до тех пор, пока не достигнет примерно 4300 Тогда никакие новые соединения не разрешены к серверу. Я подтвердил, что он изолирован от запросов WebSocket, а не от обычных запросов HTTP.

Соединения WebSocket сохраняются для каждого устройства на карте с UUID устройства в качестве ключа; иногда случается, что устройство отправит запрос на новое соединение WS, даже если сервер имеет соединение с устройством. В этом случае текущее соединение закрывается, и возвращается ошибка, чтобы устройство могло повторить запрос на соединение.

Ниже приведен фрагмент кода из контроллера, обрабатывающего соединения с помощью LegacyWebSocket. Соединения закрыты с помощью out.close() согласно https://www.playframework.com/documentation/2.5.x/JavaWebSockets

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

1 ответ

Похоже, проблема поддержания активности TCP - то есть то, что соединения TCP устарели из-за проблем со связью на стороне клиента, а сервер не обрабатывает и не очищает устаревшие соединения во времени до достижения предела.

Эта ссылка поможет вам настроить поддержку TCP на вашем сервере, чтобы обеспечить своевременную очистку устаревших соединений.

Другие вопросы по тегам