netty 4 中服务器端和客户端高低写水印选项的区别.Norman Maurer 的



Netty 最佳实践(带视频的幻灯片)介绍了WRITE_BUFFER_HIGH_WATER_MARKWRITE_BUFFER_LOW_WATER_MARK选项。它还给出了示例:

//Server
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.childOption(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024);
bootstrap.childOption(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024);
//Client
Bootstrap bootstrap = new Bootstrap();
bootstrap.option(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024);
bootstrap.option(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024);

在StackOverflow上还有另一个关于这个主题的讨论。但我仍然不确定一些细节。

客户端中设置的高和低写入水位线选项是否控制从客户端写入到服务器的队列的行为,以及服务器端选项是否控制从服务器写入到客户端的队列的行为?

这意味着如果设置了服务器端高水位线选项,那么当客户端接收缓慢并且之前写入的数据已填满队列时,将数据写入客户端的服务器端通道变得不可写?反之亦然,对于客户端选项。

顺便说一句,我正在使用 netty 4.1.0CR。

这意味着如果设置了服务器端高水位线选项,则 将数据写入客户端的服务器端通道变为 当客户端接收缓慢且先前写入时可写 数据已填满队列?反之亦然,对于客户端选项。

一旦通道中的数据达到高水位线,channel.isWritable 方法就会开始返回 false,直到通道再次达到低水位线。

但是,如果我们不检查/忽略 channel.isWriable 状态,即使在通道达到高水位线后仍继续写入通道,则最终可能导致 OOM 错误,如前两张幻灯片所示。

更新

执行客户端设置的高低写入水印选项 控制从客户端写入到服务器的队列的行为,以及 服务器端选项控制写入队列的行为 从服务器到客户端?

这是绝对正确的。

最新更新