当前位置: 首页 > 知识库问答 >
问题:

Netty:反向传播通道处理器管道中的压力,以降低发送器的速度

冀嘉木
2023-03-14

我正在使用netty开发应用程序,该应用程序将通过TCP侦听特定端口。一旦接收到字节,我就有了一个带有业务逻辑的管道,可以在接收到的字节上运行。此管道由多个通道处理程序组成,如标头解码器、应用程序级碎片处理程序等。在管道末尾,一旦处理完消息,管道中的最后一个处理程序(如BufferWriter)将把处理过的消息放入阻塞队列。这个阻塞队列的作用类似于缓冲区,而BufferWriter的作用类似于生产者。注意,此阻塞队列在所有通道中共享。所以,应用程序接收到的所有数据都将写入单个队列。还有另一个计划执行器服务将作为此缓冲区的使用者。此使用者是按一定时间间隔运行的定期任务,从缓冲区中提取消息并写入文件。

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

在netty中,有没有什么方法可以减慢从套接字的读取速度,这样消费者就可以跟上生产者的步伐?例如,一旦缓冲区满了,netty就不会从套接字读取,每当缓冲区有空间时,它就会从套接字恢复读取。

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

共有1个答案

公良理
2023-03-14

控制读取,在通道中有一个名为“自动读取”的配置。您可以将其设置为false:

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

如果这样做,则需要手动触发通道的读取:

ctx.channel().read();

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

在WSO2传输中,它是使用侦听器完成的。

 类似资料:
  • 我正在尝试使用动态ChannelHandler管道实现Netty 4. X。正如人们建议的“出于性能考虑,在运行时使用调用而不是管道修改”,我实现了一个Server、一个RouterInoundHander和一个Client来测试这个理论。但它不起作用。这是我的代码 计算机网络服务器 RouterInboundHandler 和客户 如代码所示,在Channel的连接初始化阶段创建了Channel

  • 看看文档,它说: https://netty.io/4.0/api/io/netty/channel/ChannelPipeline.html 假设用户在管道中有一个或多个ChannelHandlers来接收I/O事件(例如读取)和请求I/O操作(例如写入和关闭)。例如,一个典型的服务器在每个通道的管道中都有以下处理程序,但是根据协议和业务逻辑的复杂性和特征,这些处理程序可能会有所不同: 协议解码

  • 我正在为我的应用程序(两个系统集成)使用protobuf rpc pro。protobuf rpc pro基于Netty并使用Netty的这种依赖关系: 我需要为两个系统之间的通信实现通道池,以获得高性能。一、 在我的实现中,我希望获得多个连接,这些连接将并行发送消息(非阻塞通信)。这里的问题是,我如何检查发送缓冲区是否已满,并切换到另一个连接(如负载平衡)。在Netty或某些外部实现中是否有任何

  • 在通道初始化器中, 在上面这段代码中,当通道初始化时,我可以使用IdleStateHandler的静态对象,而不是为每个通道使用新实例。线程安全吗? 而且 当我给一个频道写东西的时候。我向它添加了一个空闲的读取处理程序,这样如果某个时候没有得到响应,我就关闭通道。 我可以在上面的代码中使用静态idleReadHandler吗? 我正在使用Netty-4.1.0 在netty 3之前,它在jboss

  • 我试图通过“网络在行动”这本书来掌握网络概念。 在我看来,有几个概念解释得不太好或太模糊。因此,我想我会来这里就这些话题做一些明确的解释。 渠道管道: 所以我有一个这样的渠道管道: 对于channelInitializer,从概念上讲,我会假设该过程将按以下顺序进行:

  • 在 Netty 4.1 中,是否可以创建子通道/管道或嵌套通道/管道? 例如,我有一个管道,其中安装了各种编解码器,用于协议/序列化。在管道结束时,我将一条消息传递给我的应用程序级逻辑。过度简化的示例: 然后,这个应用逻辑的句柄方法可以执行它想要的任何顺序逻辑。这清楚地分离了我的应用程序级别逻辑,但是,我想利用Netty的ChannelPipeline提供的“拦截过滤器模式的高级形式”。我想将管道