我正在使用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?以及如何将它们设置为理智?
我没有找到任何明确的信息。谢谢你的帮助。
答案 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))
你就是这样做的。