gpt4 book ai didi

java - 网络 : back propogate pressure in channel handler pipeline to slow down sender

转载 作者:可可西里 更新时间:2023-11-01 02:57:33 25 4
gpt4 key购买 nike

我正在使用 netty 开发应用程序,它将通过 TCP 监听特定端口。一旦接收到字节,我就有了一个带有业务逻辑的管道来运行接收到的字节。该管道由多个 channel 处理程序组成,如 header 解码器、应用程序级碎片处理程序等。在管道的末端,一旦消息被处理,管道中的最后一个处理程序(比如 BufferWriter)会将处理过的消息放入阻塞队列。这个阻塞队列就像缓冲区,而 BufferWriter 就像生产者。请注意,此阻塞队列在所有 channel 之间共享。因此,应用程序收到的所有数据都将写入单个队列。还有另一个预定的执行程序服务将作为此缓冲区的使用者。这个消费者是周期性的任务,它以一定的时间间隔运行,从缓冲区中获取消息并写入文件。

我遇到的问题是,当有大量传入流量时,我的消费者线程无法跟上步伐。导致缓冲区队列变满。

在netty中,有没有什么办法可以降低socket的读取速度,让消费者跟上生产者的步伐?比如,一旦缓冲区满了,netty 就不会从 socket 读取,只要缓冲区有空间,它就会恢复从 socket 读取。

请注意,在这种情况下,发送者不是用 java/netty 编写的。它们是 c 程序,它将与我的服务器形成 TCP 连接并开始发送数据。我假设,当我减慢我的服务器套接字读取速率时,TCP 将使用拥塞控制策略自动减慢发送者的速度(慢启动)

最佳答案

为了控制阅读,在 Channel 中有一个名为 autoRead 的配置。您可以将其设置为 false:

ctx.channel().config().setAutoRead(false);

如果这样做,您需要手动触发从 channel 读取:

ctx.channel().read();

您可以通过最初将 autoRead 设置为 false 来降低读取速率,然后在读取端(入站)设置一个缓冲区/计数,并且仅在缓冲区为空时读取,直到缓冲区已满。

在 WSO2 传输中,它是按照 here 中的方式完成的使用监听器。

关于java - 网络 : back propogate pressure in channel handler pipeline to slow down sender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53441150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com