我正在开发一个需要向数千个客户端频道广播小消息(<100byte)的项目。 Netty和JDK为每个通道最小化数据复制的最有效方法是什么?
如果使用包装共享DirectByteBuf(池化或非池化)的DuplicatedByteBuf的N个实例,JDK可以使用netty的DirectByteBuf中的Direct ByteBuffer对象而不是为每个SocketChannel复制一个新的ByteBuffer吗?
答案 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个接收器后,您将再次将其重新用于下一个接收器。