2012-05-08 6 views
1

서로 통신해야하는 여러 클라이언트가있는 TCP 기반 Netty 응용 프로그램이 있습니다. ChannelGroup에 모든 채널 참조를 저장합니다.TCP Netty ChannelGroup에있는 하나를 제외한 모든 것에 쓰기

내가 ChannelGroup.write를 호출하여 ChannelGroup의 모든 클라이언트를 기록 할 수 있지만 어떤 것은 예를 들어 이러한 채널 중 하나를 제외하고 모두 쓸 수있는 효율적인 방법이 될 것이라고 알고 있지만 :

'A' , 'B', 'C'는 채널 그룹에 함께 있고 'A'는 'B'와 'C'로 보내야하며, 'B'는 'A'와 'C'등으로 보내야합니다. 이 일을하는 가장 좋은 방법은? 여기에 내가 생각 몇 가지 옵션이 있지만 몇 가지 의견을 주시면 감사하겠습니다 :

  1. 반복적으로

  2. 그냥 그룹을 통해 반복하고 (이 경우 ChannelGroup.write를 사용하지 않는) 개별적으로 채널에 쓰기 "remake/clone"채널 그룹에 쓰기 전용 채널이 포함되도록하십시오. 그런 다음 수정 된 그룹에서 ChannelGroup.write를 호출 한 다음 그룹을 전체 그룹으로 복원합니다.

  3. 모든 채널에 쓰지 만 폐기 할 채널 (인코딩 또는 다운 스트림 처리기)을 처리하고 제외 된 채널에서 온 것 인 경우 메시지를 쓰지 않는 일부 처리기 논리를 구현합니다. 설계 트레이드 오프에 관한 한

같이까지 메시지를 최대한 빠르게 전송된다 ChannelGroups가 < 20 채널 메시지 크기 1킬로바이트 대해 비교적 작은 각 (500 바이트 - 2킬로바이트). 또한, 여러 논리 회로가 localhost 피드백에 대해 더 잘 작동하면이 연결에 대한 많은 연결이 서버와 동일한 호스트에있는 시나리오가 있습니다.이 연결에 대한 피드백은 크게 감사 할 것입니다.

도움을 주셔서 감사합니다.

+0

나는 옵션 3의 행을 따라 아마 할 것입니다. 진정으로 채널이 스스로 쓰기를 원하지 않는다면, 채널 (또는 처리기?) 내에 논리를 갖는 것이 합리적입니다. 그 자체. 이렇게하면 메시지 자체를 원한다면 걱정할 채널에 달려 있습니다. 이 작업을 수행함에있어 다른 의미가있을 수 있지만 그렇지 않은 경우에는 깨끗해 보입니다. – Jeremy

답변

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을 수행하지 않을 것입니다. 왜냐하면 모든 작업을 처리하는 데 더 많은 작업이 필요하기 때문에 다운 스트림 처리기가 더 많은 작업을 수행하고 있기 때문입니다.

그래서 나는 것 중 하나

  1. 이 옵션 #을 구현 한
  2. DefaultChannelGroup을 확장하고 해당 채널을 건너 뛸 수있을만큼 영리 쓰기 방법을 추가 할 수 있습니다. 그룹에 채널을 추가 할 때 좀 더 많은 메타 데이터를 제공해야 할 것입니다.
+0

도움과 분석에 진심으로 감사드립니다. 대단히 감사합니다. –

관련 문제