Netty 4:高写和低写水印

时间:2014-08-13 08:10:07

标签: java netty tcp-ip

我正在使用Netty 4.我看到Netty服务器的下列选项:WRITE_BUFFER_HIGH_WATER_MARK和WRITE_BUFFER_LOW_WATER_MARK。

官方网页Related articles已链接到Netty best practices (slides w/ video) by Norman Maurer。幻灯片之一看起来像这样:

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 个答案:

答案 0 :(得分:17)

有关this文章中水印的一些信息:

  

例如,假设您在服务器端有一个任务队列   由客户填写并由后端处理。如果客户端发送任务   队列的长度太快了。人们需要这样介绍   命名高水印和低水印。如果队列长度更长   比高水位停止读取套接字和队列长度会   减少。当队列长度变得小于低水印开始时   再次从套接字读取任务。

     

注意,使客户能够适应您的处理速度   任务(实际上要适应窗口大小)一个不应该有很大的差距   高水位和低水位之间。从另一方面来说,小差距意味着   你经常在事件循环中添加/删除套接字。

对于Netty来说,似乎是真的,因为this ChannelConfig的JavaDoc说:

  

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

对于低水印:

  

一旦写入缓冲区中排队的字节数超过了高位   水印然后下降到这个值以下,   Channel.isWritable()将再次返回true。

关于理智,我认为,这是相对的问题,这取决于您通过渠道发送的信息以及频率。对于必须为这些变量定义的值,没有严格的规则。所以,我认为,你必须在实践中找到自己的价值观。幻灯片向您展示了其中一个例子。

答案 1 :(得分:2)

WRITE_BUFFER_HIGH_WATER_MARK WRITE_BUFFER_LOW_WATER_MARK

ChannelConfig 中的

选项和相关方法已弃用。

  

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

你就是这样做的。