java - nkzawa - Estrangulamiento de websockets con servidor netty-socketio
socket.io java example (1)
Sí. Channel.isWritable()
es un buen lugar para comenzar. Para simplificar un poco, devuelve false
cuando tiene demasiados bytes de salida pendientes en el búfer de salida del canal. Puede seguir enviando hasta que Channel.isWritable()
devuelva false
. Cuando cambia la capacidad de escritura del canal, se notifica a su controlador con el evento channelWritabilityChanged()
. Entonces, puedes reanudar tu transferencia.
public void generateTraffic(ChannelHandlerContext ctx) {
while (ctx.channel().isWritable()) {
ctx.write(...);
}
}
public void channelWritabilityChanged(ChannelHandlerContext ctx) {
generateTraffic(ctx);
}
En una aplicación real, deberá mantener cierta información con estado para determinar qué mensaje se debe enviar cuando.
Además, eche un vistazo a las propiedades ChannelConfig.writeBufferHigh/LowWatermark
para configurar cuándo isWritable()
debería comenzar a devolver false
o true
.
Estamos usando el https://github.com/mrniko/netty-socketio .
Escenario de aplicación: el servidor está enviando mensajes a través de websocket al cliente a una velocidad elevada.
Recientemente encontramos un problema en el que el cliente no podía procesar todos los mensajes de eventos del servidor socket.io. Los mensajes de websocket comenzaron a acumularse y el cliente dejó de responder. En las herramientas de desarrollo de Chrome, pudimos ver un aumento gradual en la memoria del cliente.
Analizar el tcpdump utilizando wireshark muestra que hay muchas retransmisiones y que el cliente no puede arreglárselas.
Estamos planeando tener un mecanismo de aceleración en el lado del servidor. ¿Hay algún evento / devolución de llamada que pueda usarse para detectar clientes lentos para que podamos comenzar a estrangular en el lado del servidor para este websocket en particular?