【问题标题】:OOM Netty with broken or slow clients客户端损坏或速度慢的 OOM Netty
【发布时间】:2014-04-23 23:33:45
【问题描述】:

我有一个 Netty 服务器 (3.6.2),它生成一些数据并向订阅的客户端广播。有时有些客户端似乎因为客户端损坏或网络资源状况不佳而无法获取数据。在这种情况下,服务器会填充 Channel 写入队列并不断生成事件,最终这可能会导致 OutOfMemoryError。

一种解决方案是在写入之前检查通道是否为 isWritable() 并且不要以否定的方式写入(无论如何我必须存储此消息,否则我会丢失它们)。但我宁愿断开在某个时间或以我生成广播事件的速度没有刷新写入缓冲区的客户端。

我怎么能这样做?如何实现这个写缓冲区没有被刷新“超时”?如果 isWritable 为 false,我应该关闭客户端吗?

我真的很感激任何想法。

谢谢。

【问题讨论】:

    标签: netty


    【解决方案1】:

    是的,如果 Channel.isWritable() 返回 false,您可以关闭连接。

    【讨论】:

    • 是不是有点过激?在 Websocket 连接中,客户端可能只是暂时的缓慢并且可以恢复速度。在处理程序中是否没有某种超时机制可以实现,例如“如果此客户端不可写超过 x 周期,则断开连接?”。我想避免 OOM,但我不想让很多客户端因为暂时的网络问题而丢失消息。
    • WriteTimeoutHandler 可用于指定允许写入任何单个缓冲区的最长时间。超过时间会抛出异常。这将实现您的目标,但如果 channel.isWritable 返回 false 以防止在写入超时发生之前发生 OOM,您仍然需要停止写入。或者,您可以将写入缓冲区的大小调整为您可以承受的最大积压水平。诺曼的回答将是有效的,因为 channel.isWritable() == false 将发生在积压被认为太大的时候。
    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    相关资源
    最近更新 更多