簡體   English   中英

寫入TCP Netty ChannelGroup中除一個以外的所有人

[英]Writing to all but one in a TCP Netty ChannelGroup

我有一個基於TCP的Netty應用程序,有多個客戶端需要相互通信。 我將所有Channel引用存儲在ChannelGroup中。

雖然我知道我可以通過調用ChannelGroup.write寫入ChannelGroup中的每個客戶端,但是除了其中一個通道之外的所有通道都是有效的方式,例如:

'A','B','C'在一個頻道組中,'A'需要發送到'B'和'C','B'需要發送到'A'和'C'等。最好的方法是什么? 以下是我想到的一些選項,但有些反饋會受到贊賞:

  1. 只需遍歷組並單獨寫入通道(在這種情況下不要使用ChannelGroup.write)

  2. 重復“重制/克隆”ChannelGroup,使其僅包含要寫入的通道。 然后我會在修改后的組上調用ChannelGroup.write,然后將組恢復到完整組。

  3. 寫入所有通道但實現一些處理程序邏輯以丟棄(在編碼或下游處理程序上),如果來自排除的通道則不寫入消息。

就設計權衡而言,消息盡可能快地發送,ChannelGroups相對較小<20個通道,消息大小約為1kb(500字節 - 2kb)。 此外,還有一種情況,在這種情況下,如果不同的邏輯更適合本地主機反饋,許多連接與服務器位於同一主機上,將非常感激。

非常感謝您的幫助!

我不會做#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並添加一個足夠聰明的write方法來跳過相關頻道。 將通道添加到組時,可能需要提供更多的元數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM