2016-10-26 6 views
0

私はEU西部で動作しているAWSサーバー(中規模)を使用していますが、約250のデバイスが接続されていますが、インターネット接続の問題で常に再接続していますが、サーバーは約4300に達するまで増加します。サーバーへの新しい接続は許可されません。私はそれがWebSocket要求に分離され、通常のHTTP要求ではないことを確認しました。Play 2.5 WebSocket Connection Build

WebSocket接続は、デバイスUUIDをキーにしてデバイスのマップに保持されます。サーバーにデバイスへの接続があっても、デバイスが新しいWS接続の要求を送信することがあります。この場合、現在の接続が閉じられ、デバイスが接続要求を再試行できるようにエラーが返されます。

以下は、LegacyWebSocketを使用して接続を処理するコントローラのコードスニペットです。接続はどのようにプレイFrameworkが閉じWS接続のTCP接続を終了することを保証することができますか?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; 
} 

ごとにout.close()を使用して閉鎖されていますか

私はTCP接続の量をチェックするために使用するコールがnetstat -n -t | wc -l

答えて

0

は、TCPキープアライブの問題のように見えるされる - すなわち、TCP接続がクライアント側であるため、接続の問題の古くなると、サーバーがないこと制限に達する前に失効した接続を処理したりクリーンアップしたりしないでください。

This linkあなたのサーバーでTCPキープアライブを設定して、間に合わない接続が確実にクリーンアップされるようにするのに役立ちます。