写入所有,但一个在TCP Netty的通道组(Writing to all but one in a

2019-10-16 16:24发布

我有需要相互通信的多个客户端基于TCP的Netty应用。 我存储所有的频道引用的一个通道组。

虽然我知道,我可以通过调用ChannelGroup.write写在通道组所有客户端,这将是写信给所有但这些渠道,例如之一的有效方式:

“A”,“B”,“C”是在一个信道组一起与“A”需要发送到“B”和“C”,“B”需要发送到“A”和“C”等什么是做到这一点的最好方法是什么? 下面是我想的,但一些反馈,将不胜感激一些选项:

  1. 只要通过组迭代和写入通道单独(不要在这种情况下使用ChannelGroup.write)

  2. 多次获得“翻拍/克隆”此通道,因此只包含渠道写入。 然后,我会打电话ChannelGroup.write上修改组,则该组恢复到全组。

  3. 写入所有频道,但一些实施处理程序逻辑,用于丢弃(或者在编码或下游处理程序),而不是写该消息,如果它是从排除的通道。

至于设计折衷关注,消息被尽可能迅速发送成为可能,通道组是相对小的<20个信道和消息是大小约1kb的每个(500个字节 - 2 KB)。 此外,还有一个情况下,许多连接都是相同的主机服务器上,如果不同的逻辑适用于本地主机的反馈更好的在这个将不胜感激。

非常感谢您的帮助!

Answer 1:

我不会做#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要么因为你只是给下游处理更多的工作要做,丢弃你去了所有的麻烦摆在首位,以写入数据。

所以我会之一:

  1. 实施方案#1
  2. 延伸DefaultChannelGroup并添加足够聪明跳过所讨论的信道的写入方法。 你可能会对当您添加的渠道向集团提供更多的元数据。


文章来源: Writing to all but one in a TCP Netty ChannelGroup