我正在使用Netty4。我看到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是什么?以及如何使他们 理智 ?
我没有找到任何明确的信息。谢谢你的帮助。
有关从水印的一些信息本文章:
例如,假设您在服务器端有一个由客户端填充并由后端处理的任务队列。如果客户端发送任务的速度过快,则队列的长度会增加。需要引入所谓的高水印和低水印。如果队列长度大于高水位标记,请停止从套接字读取,并且队列长度将减少。当队列长度小于低水位标记时,再次开始从套接字读取任务。 请注意,为了使客户能够适应您的处理任务(实际上是适应窗口大小)的速度,不应在高水位线和低水位线之间留出较大的差距。另一方面,小间隙意味着您经常会在事件循环中添加/删除套接字。
例如,假设您在服务器端有一个由客户端填充并由后端处理的任务队列。如果客户端发送任务的速度过快,则队列的长度会增加。需要引入所谓的高水印和低水印。如果队列长度大于高水位标记,请停止从套接字读取,并且队列长度将减少。当队列长度小于低水位标记时,再次开始从套接字读取任务。
请注意,为了使客户能够适应您的处理任务(实际上是适应窗口大小)的速度,不应在高水位线和低水位线之间留出较大的差距。另一方面,小间隙意味着您经常会在事件循环中添加/删除套接字。
对于Netty而言,这似乎是真的,因为此 JavaDoc ChannelConfig表示:
ChannelConfig
如果写缓冲区中排队的字节数超过writeBufferHighWaterMark值, Channel.isWritable()将开始返回false。
writeBufferHighWaterMark
Channel.isWritable()
对于低水印:
一旦在写缓冲区中排队的字节数超过了高水位线,然后下降到该值以下,Channel.isWritable()将再次返回true。
关于理智,我认为这是一个相对的问题,取决于您通过渠道发送的信息以及发送频率。对于必须为该变量定义什么值,没有严格的规则。因此,我认为,您必须在实践中找到自己的价值观。幻灯片向您展示了其中的示例之一。