如何在向大量频道广播消息时最小化Netty / jvm中的数据拷贝

时间:2014-05-23 06:04:53

标签: java netty

我正在开发一个需要向数千个客户端频道广播小消息(<100byte)的项目。 Netty和JDK为每个通道最小化数据复制的最有效方法是什么?

如果使用包装共享DirectByteBuf(池化或非池化)的DuplicatedByteBuf的N个实例,JDK可以使用netty的DirectByteBuf中的Direct ByteBuffer对象而不是为每个SocketChannel复制一个新的ByteBuffer吗?

2 个答案:

答案 0 :(得分:0)

将缓冲区写入出站通道时,不会复制缓冲区 据我所知,'write'会调用HeapByteBuffer.duplicate,这是一个浅拷贝。

答案 1 :(得分:0)

你几乎没有选择:

选项1.消息共享相同的数据(您的100个字节)但是每次retainDuplicate()调用都有开销,因为它创建了新的缓冲区实例(即使它共享100个字节):

ByteBuf msg = createMessage(); //pooled, unpooled

for (Channel target : targets) {
    target.writeAndFlush(msg.retainedDuplicate());
}

这个选项对你的情况不太好,因为你的消息很小。

选项2.您总是使用相同的消息,但您必须自己处理消息读/写索引。

ByteBuf msg = createMessage(); //pooled, unpooled
if (targets.size() > 1) {
   msg.retain(targetsNum - 1).markReaderIndex();
}

for (Channel target : targets) {
    target.writeAndFlush(msg);
    if (msg.refCnt() > 0) {
       msg.resetReaderIndex();
    }
}

此选项更适合您的情况。由于您只创建一次消息,并且在将消息传递给1个接收器后,您将再次将其重新用于下一个接收器。