我试图弄清楚当一个通道没有响应时,写请求会发生什么。例如,当对等方突然从网络上掉下来时,我们就再也没有rst了。
从阅读文档和理解netty channel buffers和watermarks可以看出,一旦达到高writerbufferwatermark,channeloutboundbuffer将被视为已满,并且:
channel.iswritable()将开始返回false。
从channel.iswritable():
当且仅当i/o线程将立即执行请求的写操作时,返回true。此方法返回false时发出的任何写请求都将排队,直到i/o线程准备好处理排队的写请求为止。
我最初的问题是:当我们继续写作的时候会发生什么?
如果netty channel iswriteable返回false表示存在内部缓冲区,并暗示它是无界的,那么数据将在哪里排队。
问题是,写请求到底排在哪里,更重要的是,我可以观察这些队列的大小吗?
或者:当netty/os检测到连接断开并且需要关闭时,是否有一些限制?
2条答案
按热度按时间8i9zcol21#
它仍将排队等候
ChannelOutboundBuffer
. 一旦缓冲区满了,你就有责任停止写,然后再开始写一次。你可以通过ChannelInboundHandler.channelWritabilityChanged(...)
.b91juud32#
查看4.1.37中channeloutboundbuffer的源代码,方法
addMessage
始终将传入的消息添加到内部链接列表,而不考虑isWritable
. 此列表无限增长。此缓冲区的总字节长度可通过
channel.unsafe().outboundBuffer().totalPendingWriteBytes()
.对于间接值,如果不想使用unsafe(),也可以使用
channel.bytesBeforeWritable()
它将返回队列字节减去低水位线。