私は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