【问题标题】:Where will the data been queued if Netty channel isWritable return false如果Netty channel isWritable return false,数据会在哪里排队
【发布时间】:2019-05-18 09:27:58
【问题描述】:

从 Netty api 显示,如果 isWritable 返回 false,请求将被排队。我能知道请求将在哪里排队吗?在什么情况下,队列可能已满并导致 OOM 问题?

下面是isWritable()的文档

当且仅当 I/O 线程将立即执行请求的写入操作时才返回 true。当此方法返回 false 时发出的任何写入请求都会排队,直到 I/O 线程准备好处理排队的写入请求。

https://netty.io/4.1/api/io/netty/channel/Channel.html#isWritable--

【问题讨论】:

    标签: java out-of-memory netty


    【解决方案1】:

    它将在 netty 维护的内部缓冲区中排队。为避免系统出现 OOM,您必须覆盖 ChannelInboundHandler 的方法 channelWritabilityChanged 并进行背压处理。

    在这里,您可以使用channelautoread 配置减慢入站数据的读取速度,并按照here 的描述手动读取请求。或者,如果您在不同的线程上编写,您可能需要阻止该线程。

    【讨论】:

    • 感谢 Riyafa。由于 netty 将请求排队到内部缓冲区中。如果我的客户端一直在发送数据,它会先出java堆内存的内存吗?我们使用 ChannelOutboundHandler 发送数据。你知道为什么channelWritabilityChanged只在ChannelInboundHandler中吗?
    • 您将在ChannelOutboundHandler 之外启动写入。在ChannelOutboundHandler 中没有太多的背压处理,因为它在 netty 线程中。
    • 消息缓存在ChannelOutboundBuffer。如果您在通道不可写时继续写入数据,则可能会发生 OOM,因为 netty 基本上会一直缓冲您要求在内存中写入的数据(在那个 ChannelOutboundBuffer 中)。检查这些幻灯片以及normanmaurer.me/presentations/2014-facebook-eng-netty/…
    • 如果您想知道确切数据的去向,我在这里找到了 mroe 信息:stackoverflow.com/a/65004753/1207791
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2013-05-03
    • 2014-06-30
    • 1970-01-01
    • 2012-06-09
    • 2014-04-10
    • 2011-02-16
    • 1970-01-01
    相关资源
    最近更新 更多