传播两个网络通道之间的背压

时间:2013-11-02 22:54:42

标签: java netty

我想使用netty-4编写一个系统,其中服务器从一个通道接收请求(在中巧妙地称为),进行转换并可能将结果放到另一个通道到另一个后端 - 系统(被称为 out )。

但我想将 out 频道的反压传播到频道的?具体而言 - 因为netty API是异步的 - 当 out 不再被阻止时,如何收到通知;并告诉 in 暂停/恢复?

部分解决方案

我相信可以判断 out 频道何时可以使用channel.isWritable()进行编写。

this question的回答提到禁用AUTO_READ,但我相信我必须负责轮询通道以进行读取。我不会对此感到高兴 - 除非我可以在准备阅读时收到消息。此时,使用netty的实用程序主要是无副本缓冲区和ByteToMessageDecoder超类。

2 个答案:

答案 0 :(得分:5)

要添加到Igor的答案 - 您有几个选项可以重新激活读取。第一个显示here表示捕获目标通道上的channelWritabilityChanged事件。您可以检查通道的状态并在源通道上启用自动读取。

或者代理示例显示设置写入完成侦听器以进行写入和刷新。这种技术也有效,但没有利用Netty的高/低水印排队系统,因为只有在写入刷新到网络缓冲区后才会被告知写入完成。

答案 1 :(得分:3)

对,当OUT不可写时,您可以在IN通道上禁用AUTO_READ,并在OUT准备就绪时再次启用AUTO_READ。 这里不需要轮询。