2010-01-21 2 views
1

자바로 Stomp 프로토콜 클라이언트를 작성 중이며 IO를 처리 할 스레드가 하나뿐입니다. 이는 스레드가 들어오는 데이터를 읽고 애플리케이션에 앞뒤로 읽고 쓰는 것을 의미합니다. 내 문제는 멀티 스레딩과 NIO를 사용하여이 응용 프로그램을 확장해야하는 경우 어떻게 배치 할 수 있습니까?이 단일 스레드 Java 클라이언트를 확장하는 방법은 무엇입니까?

내 IO 프로세서 스레드가 "TcpLink"링크라고하고 skeletion과

class TcpLink implements Runnable { 

     public void run() { 
      // read data from socket and assign it to a byte buffer 
      // notify the listening application 
     } 
    } 

내가 여러 스레드가 수신 메시지를 파견 할 수 있도록해야하는 경우 다음 한 방법이 클래스를 변경해야합니까?

감사합니다.

+0

이 클라이언트입니까, 아니면 서버입니까? – danben

+0

이것은 클라이언트입니다. –

답변

2

Java NIO를 기반으로 한 확장 가능한 시스템 설계에 대해서는 this Doug Lee presentation을 정말 좋아합니다.

기본적으로 설계는 Reactor pattern을 기반으로하므로 단일 I/O 스레드가 여러 클라이언트 연결에서 라운드 로빈됩니다. I/O 스레드가 포화 된 경우 마스터 리액터에서 하나 이상의 하위 리액터로의 연결을 중단하는 것을 고려할 수 있습니다. 각 반응기는 자체 스레드를 포함합니다.

또 다른 중요한 점은 당신의 디자인을 참고로는 I/O 스레드 는 I/O을 수행해야하며, 일반적으로 실제 작업을 수행 할 별도의 스레드 (예를 들어, ExecutorService)에 인바운드 메시지를 파견해야한다는 것입니다. 이렇게하면 주어진 메시지가 처리되는 동안 다른 연결이 I/O 부족으로되지 않게됩니다.

+0

Adamski와 같은 좋은 프레젠테이션과 지식을 공유해 주셔서 감사합니다 ... –

1

TcpLink 클래스 목록을 관리하는 래퍼 클래스를 작성하는 것이 좋습니다. 래퍼 클래스의 역할은 들어오는 메시지를 받고 대기/몇 TcpLink 인스턴스에 할당하므로 처리량/TPS를 계산하고 필요할 때마다 새 인스턴스를 만들 수 있습니다. 지금은 그 중 하나만 만들어서 거기에 단 하나뿐입니다.

+0

답변을 많이 주셔서 감사합니다. Teja ... 어떤 종류의 풀링 풀링이라고 생각합니까? 따라서 ExecutorService 또는 다른 종류의 기능을 사용하여이를 달성 할 수 있습니다. –

관련 문제