Netty 4:高和低写入水位线

2022-09-04 08:00:24

我正在与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是什么?如何让他们保持理智

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


答案 1

本文中有关水印的些信息:

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

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

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

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

对于低水位线:

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

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


答案 2

WRITE_BUFFER_HIGH_WATER_MARKWRITE_BUFFER_LOW_WATER_MARK

通道配置中的选项和相关方法已弃用。

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

这就是你的做法。


推荐