Netty best practices (slides w/ video) by Norman Maurer引入了WRITE_BUFFER_HIGH_WATER_MARK
和WRITE_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上还有关于此主题的另一个discussion。但我仍然不确定一些细节。
客户端设置的高和低写水印选项是否控制从客户端写入服务器的队列行为,服务器端选项是否控制从服务器写入客户端的队列行为?
这意味着如果设置了服务器端高水位选项,那么当客户端缓慢接收并且先前写入的数据已填满队列时,将数据写入客户端的服务器端通道将变为不可写?反之亦然,客户端选项。
BTW,我正在使用netty 4.1.0CR。
答案 0 :(得分:1)
这意味着如果设置了服务器端高水印选项,那么 将数据写入客户端的服务器端通道不会 当客户端缓慢接收并且先前写入时可写 数据填满了队列?反之亦然,客户端选项。
一旦通道中的数据达到高水印,channel.isWritable方法开始返回false,直到通道再次达到低水印。
但是,如果我们不检查/忽略channel.isWritable状态并且即使在达到高水印后也继续写入通道,最终可能导致OOM错误,如前两张幻灯片所示。
<强>更新强>
在客户端设置高和低写水印选项 控制从客户端写入服务器的队列的行为,以及 服务器端选项控制写入的队列的行为 从服务器到客户端?
这是绝对正确的。