2015-03-04 2 views
1

Мы используем https://github.com/mrniko/netty-socketio.Дросселирующие websockets с сервером netty-socketio

Сценарий приложения: сервер толкает сообщения через websocket клиенту с высокой скоростью.

Недавно мы столкнулись с проблемой, когда клиент не смог обработать все сообщения о событиях с сервера socket.io. Сообщения websocket начали накапливаться, и клиент стал невосприимчивым. В инструментах разработчика Chrome мы могли наблюдать постепенное увеличение объема памяти клиента.

Анализ tcpdump с помощью wirehark показывает, что происходит много повторных передач, и клиент не может справиться.

Мы планируем использовать механизм дросселирования на стороне сервера. Есть ли какое-либо событие/обратный вызов, который может использоваться для обнаружения медленных клиентов, чтобы мы могли начать дросселирование на стороне сервера для этого конкретного веб-узла?

ответ

2

Да. Channel.isWritable() - хорошее место для начала. Чтобы немного упростить, он возвращает false, когда у вас слишком много ожидающих исходящих байтов в исходящем буфере канала. Вы можете продолжить отправку до тех пор, пока Channel.isWritable() не вернет false. Когда записываемая возможность канала изменяется, ваш обработчик уведомляется о событии channelWritabilityChanged(). Затем вы можете возобновить передачу.

public void generateTraffic(ChannelHandlerContext ctx) { 
    while (ctx.channel().isWritable()) { 
     ctx.write(...); 
    } 
} 

public void channelWritabilityChanged(ChannelHandlerContext ctx) { 
    generateTraffic(ctx); 
} 

В реальном приложении вам необходимо будет сохранить некоторую информацию о состоянии, чтобы определить, какое сообщение следует отправлять, когда.

Кроме того, пожалуйста, обратите внимание на ChannelConfig.writeBufferHigh/LowWatermark свойства для настройки при isWritable() должен начать возвращать false или true.