Netty v4を使用してTCPサーバーを作成しています。サーバーはクライアントからの複数の接続を処理し、それらにデータをストリームします。Nettyサーバー - 遅いコンシューマーのTCPで
クライアントが低速でデータを消費していることを検出できるようにしたいと考えています。私は基本的にクライアントが遅いためにTCPバッファがいっぱいにならないようにしたい!
これは基本的にZeroMQの機能です(「低速加入者検出(自殺カタツムリパターン)」と呼ばれています)。 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()'を使うことができます。彼らはデフォルト値を持っています。'Selector'はソケット送信バッファがいっぱいになるとOP_WRITEを報告しなくなります。 – EJP
@Nicholas大変ありがとうございます。非常に単純なバージョンは次のようなものです: 'if(!ctx.channel()。isWritable())ctx.channel()。close();'それは安全ですか? – Will
@Nicholasあなたは私の最後の質問に答えなかったが、私はまだあなたの答えが役に立つと思う:Pありがとう!私はそれを受け入れるよ! – Will