我有一个基于TCP的Netty应用程序,其中有多个客户端需要相互通信。我将所有Channel引用存储在ChannelGroup中。
虽然我知道我可以通过调用ChannelGroup.write写入ChannelGroup中的每个客户端,但是除了其中一个通道之外的所有通道都是有效的方法,例如:
'A','B','C'在通道组中,'A'需要发送到'B'和'C','B'需要发送到'A'和'C'等等。最好的方法是什么?以下是我想到的一些选项,但有些反馈将会受到赞赏:
只需遍历群组并单独写入频道(在这种情况下不要使用ChannelGroup.write)
反复“重制/克隆”ChannelGroup,使其仅包含要写入的通道。然后我会在修改后的组上调用ChannelGroup.write,然后将该组恢复为完整组。
写入所有通道,但实现一些处理程序逻辑以丢弃(在编码或下游处理程序上),如果来自排除的通道,则不写入消息。
就设计权衡而言,消息尽可能快地发送,ChannelGroups相对较小< 20通道,消息大小约为1kb(500字节 - 2 kb)。此外,还有一种情况,在这种情况下,如果不同的逻辑更适合本地主机反馈,许多连接与服务器位于同一主机上,将非常感激。
非常感谢您的帮助!
答案 0 :(得分:3)
我不会做#2。据我所知,写入频道组没有固有的性能优势。如果你查看DefaultChannelGroup的代码,它只是遍历已注册的渠道,发出写入并收集期货:
public ChannelGroupFuture write(Object message) {
Map<Integer, ChannelFuture> futures =
new LinkedHashMap<Integer, ChannelFuture>(size());
if (message instanceof ChannelBuffer) {
ChannelBuffer buf = (ChannelBuffer) message;
for (Channel c: nonServerChannels.values()) {
futures.put(c.getId(), c.write(buf.duplicate()));
}
} else {
for (Channel c: nonServerChannels.values()) {
futures.put(c.getId(), c.write(message));
}
}
return new DefaultChannelGroupFuture(this, futures);
}
....尽管你确实从多路复用的未来中获益,如果你关心完成回调,这是有用的。
我不会做#3,因为你只是给了下游处理程序更多的工作要做,丢弃你想要写的所有麻烦的数据。
所以我要么: