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

标签 java tcp netty bandwidth-throttling congestion-control

我正在使用 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/

相关文章:

java - Netty 乒乓球与 POJO

java - XStream 不会调用 readObject()

java - Eclipse 为可访问的代码(变体)提供死代码警告

java - 在netty中发送带有body的POST请求

c# - 我如何持续监控新的 TCP 客户端?

c - 尝试在 C 中发送数据包时 TCP 校验和不正确

netty - 使用 WebSockets 和 Netty 的服务器到客户端流式传输

java - 请求的资源不可用。 (jsp、servlet)

java - 从在其他计算机上运行的 jar 文件创建 exe

linux - 在这些情况下,TCP 会自动关闭套接字吗?