7

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

但是我想将背压从输出通道传播到输入通道具体来说——因为 netty API 是异步的——当out不再被阻塞时我如何得到通知;告诉暂停/恢复?

部分解决方案

我相信可以判断通道何时准备好使用channel.isWritable().

这个问题的答案提到禁用AUTO_READ,但我相信我必须负责轮询通道以进行读取。我对此并不高兴——除非我可以在准备好阅读时收到一条消息。在这一点上,使用 netty 的实用程序主要是无复制缓冲区和 ByteToMessageDecoder 超类。

4

2 回答 2

7

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

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

于 2013-11-04T13:05:07.960 回答
4

Right, you can disable AUTO_READ on the IN channel when the OUT is not writable and enable AUTO_READ again when the OUT will be ready. No polling is required here.

于 2013-11-03T05:35:18.270 回答