Hello, Freakin world!

[채팅앱][서버] non-blocking IO 다중 연결 서버 아키텍처 본문

Toy Project/채팅 앱 만들기

[채팅앱][서버] non-blocking IO 다중 연결 서버 아키텍처

johnna_endure 2020. 2. 21. 17:52

 

다중 클라이언트의 연결 요청을 처리하는 서버

Java NIO 에서 지원하는 셀렉터를 이용하면 하나의 serverSocketChannel로 다중의 클라이언트 채널에 대응할 수 있다. 

그리고 위 그림은 클라이언트의 연결 요청에 대한 처리만을 그림으로 나타낸 것이다. (채널은 기본적으로 양방향 통신이 가능한데, 나중에 차차 추가하도록 하자.)

 

셀렉터에는 각 채널의 register 메서드를 통해 selector에 등록할 수 있는데, 이벤트 주도 모델에서 이벤트를 등록하는 개념과 유사하다. 

 

위 그림에서 셀렉터는 eventLoop를 처리하는 다른 스레드에서 작동한다. 

만약 서버가 클라이언트에 대해서 이벤트를 던지기만 한다면 굳이 또 하나의 스레드를 추가해서 구현할 필요가 없다. 

하지만 이벤트의 발원지가 서버가 아닌 클라이언트인 경우, 이 이벤트를 감지하기 위해 풀링하거나 메소드를 blocking 해야만 한다. 그래서 nonblocking 을 구현하려면 반드시 이벤트를 처리하는 또 하나의 스레드가 필요하다.  

 

이제 셀렉터를 이용해 클라이언트의 다중 연결을 구현해보자.

 

 

Comments