Netty 4: 高低水位线写入

14

我正在使用Netty 4进行工作。我看到Netty服务器有以下选项:WRITE_BUFFER_HIGH_WATER_MARK和WRITE_BUFFER_LOW_WATER_MARK。

官方页面的相关文章中有一个链接指向Norman Maurer的Netty最佳实践(幻灯片及视频) 。其中一张幻灯片如下:

ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.childOption(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024);
bootstrap.childOption(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024);   

并且有这样的前言:

设置合理的WRITE_BUFFER_HIGH_WATER_MARK和WRITE_BUFFER_LOW_WATER_MARK

但是什么是WRITE_BUFFER_HIGH_WATER_MARK和WRITE_BUFFER_LOW_WATER_MARK?如何将它们设置为“合理”?

我没有找到任何清晰的信息。感谢您的帮助。

2个回答

22

这篇文章关于水印的一些信息:

例如,想象一下您在服务器端有一个队列,由客户端填充并由后端处理。如果客户端发送任务太快,则队列长度会增加。需要引入所谓的高水位线和低水位线。如果队列长度大于高水位线,则停止从套接字读取数据,并且队列长度将减少。当队列长度小于低水位线时,再次开始从套接字读取任务。

请注意,为了使客户端适应您处理任务的速度(实际上是调整窗口大小),不应该在高水位线和低水位线之间产生大的差距。从另一方面来看,小的差距意味着您将经常添加/删除事件循环中的套接字。

对于Netty而言,似乎也是如此,因为ChannelConfigJavaDoc说:

如果待写入缓冲区的字节数超过writeBufferHighWaterMark值,则Channel.isWritable()将开始返回false。

关于低水位线:

一旦待写入缓冲区的字节数超过高水位线,然后下降到低水位线以下,Channel.isWritable()将再次返回true。

关于合理性,我认为这是一个相对的问题,取决于通过通道发送的信息和频率。没有严格的规则来定义这些变量必须定义哪些值。因此,我认为您必须在实践中找到自己的值。幻灯片展示了其中一个示例。


感谢您的时间和帮助!谢谢你,米哈伊尔。您真正为我澄清了这个问题。 - DmitryKanunnikoff
很高兴为您服务。没关系 :) - Michael Zhavzharov

4

WRITE_BUFFER_HIGH_WATER_MARKWRITE_BUFFER_LOW_WATER_MARK

ChannelConfig中的选项和相关方法已被弃用。

.option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1, 2))

以上是正确操作方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接