Netty 4:高写和低写水印
我正在使用Netty 4.我看到Netty服务器的下列选项:WRITE_BUFFER_HIGH_WATER_MARK和WRITE_BUFFER_LOW_WATER_MARK。
官方页面相关文章链接到Norman Maurer的Netty最佳实践(带video的幻灯片) 。 幻灯片之一看起来像这样:
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来说似乎是真的,因为ChannelConfig
这个 JavaDoc说:
如果写入缓冲区中排队的字节数超过
writeBufferHighWaterMark
值,则writeBufferHighWaterMark
Channel.isWritable()
将开始返回false。
对于低水印:
一旦在写缓冲区中排队的字节数超过高水位线然后降低到该值以下,Channel.isWritable()将再次返回true。
关于理智,我认为,这是相对的问题,这取决于您通过渠道发送的信息以及频率。 对于必须为这些变量定义的值,没有严格的规则。 所以,我认为,你必须在实践中找到自己的价值观。 幻灯片向您展示了其中一个示例。
WRITE_BUFFER_HIGH_WATER_MARK和WRITE_BUFFER_LOW_WATER_MARK
不推荐使用 ChannelConfig中的选项和相关方法。
.option(ChannelOption.WRITE_BUFFER_WATER_MARK,new WriteBufferWaterMark(1,2))
这就是你如何做到的。
- 如何找出用于分割线的BufferedReader#readLine()哪个行分隔符?
- Spring Data Rest:在一对多关系中调用post后,外键更新为null
- 使用Maven运行spockunit testing
- 用于Java的STUN,TURN,ICE库
- 在Struts2中使用Tuckey URL Rewrite在URL Rewrite中需要帮助
- 如何将图像绘制到JPanel或JFrame?
- 没有Spring-boot的Eureka服务发现
- java error:message无效的tld文件:有关更多详细信息,请参阅JSP 2.2规范部分7.3.1
- 如何将android java类中的值/变量传递给android 4.4.2 kitkat中的javascript / .html文件