Я пишу TCP-сервер, используя Netty v4. Сервер будет обрабатывать несколько подключений от клиентов и передавать данные им.Netty server - медленный потребитель по TCP
Я хочу, чтобы определить, когда клиент потребляет данные с низким коэффициентом. Я в основном хочу избежать буферов TCP, чтобы их заполнить только потому, что клиент медленный!
Это в основном то, что делает ZeroMQ (называемое «Медленное обнаружение подписчика (Suicidal Snail Pattern)»). Как это можно сделать с помощью Netty?
Мой текущий код (я просто покажу настройки сервера):
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 1000)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
p.addLast(new Handler());
}
});
ChannelFuture f = b.bind(8000).sync();
f.channel().closeFuture().sync();
Это вариант Ва SO_BACKLOG
делает? Он говорит, что для подключения в очереди, но я заинтересован в том, чтобы пакеты были поставлены в очередь для определенного соединения.
Вы можете использовать 'Channel.isWritable()' даже без изменения водяных знаков. Они имеют значения по умолчанию.«Селектор» перестает сообщать OP_WRITE, когда заполняется буфер отправки сокета. – EJP
@ Николас большое спасибо. Очень простая версия: 'if (! Ctx.channel(). IsWritable()) ctx.channel(). Close();' right? Это безопасно? – Will
@ Николас, ты не ответил на мой последний вопрос, но я все еще думаю, что ваш ответ полезен: Р спасибо! Я соглашусь! – Will