2016-10-26 3 views
0

У меня есть сервер 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

ответ

0

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

This link поможет вам настроить поддержку TCP на вашем сервере, чтобы гарантировать, что устаревшие соединения будут очищены вовремя.