字节跳动是否总是由第一通道Read()中的DirectByteBuffer支持



ChannelInboundHandler.channelRead()方法中,我想调用ByteBuf.nioBuffer()方法来获得ByteBuffer,对于某些逻辑,使用在NIOByteBuffer上操作的库(其他逻辑在Netty的ByteBuf上操作(。但是,如果每个ByteBuf.nioBuffer()调用都会导致内存复制操作,那么成本会很高,我可能想寻找其他解决方案。因此,我写了以下简单的测试作为初步调查:

object InboundReadBufferUnderlying {
def main(args: Array[String]): Unit = {
val bootstrap = new ServerBootstrap()
val bossGroup = new NioEventLoopGroup()
val workerGroup = new NioEventLoopGroup()
bootstrap.channel(classOf[NioServerSocketChannel])
.group(bossGroup, workerGroup)
.childHandler(new ChannelInitializer[SocketChannel] {
override def initChannel(ch: SocketChannel): Unit = {
ch.pipeline().addLast(new InboundReadBufferUnderlyingHandler)
}
})
.bind(60000)
}
}
class InboundReadBufferUnderlyingHandler extends ChannelInboundHandlerAdapter {
override def channelRead(ctx: ChannelHandlerContext, msg: Any): Unit = {
msg match {
case m: ByteBuf =>
// OUTPUT:
//    nioBufferCount=1
//    nioBufferClass=DirectByteBuffer
// Is it means the ByteBuf is backed by a ByteBuffer(DirectByteBuffer) ?
println("nioBufferCount=" + m.nioBufferCount())
val nioBuffer = m.nioBuffer()
println("nioBufferClass=" + nioBuffer.getClass.getSimpleName)
ctx.writeAndFlush(m)
case _ =>
super.channelRead(ctx, msg)
}
}
}

上述程序的输出:

nioBufferCount=1
nioBufferClass=DirectByteBuffer

根据Netty文档,nioBufferCount((返回非-1值,表示它至少有一个底层ByteBuffer。我的问题是:

  • 在第一个ChannelInboundHandler中,在channelRead((中接收到的byteBuf是否总是由NIOByteBuffer支持?并且CCD_ 9总是CCD_

这是一个实现细节,取决于传输本身。你永远不应该想当然。

最新更新