Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- dp
- Gradle
- 트리
- ZuulFilter
- 이분 매칭
- Java
- 스택
- 도커
- 주울
- Zuul
- BFS
- 메모이제이션
- 스프링 시큐리티
- Spring Cloud Config
- 비트마스킹
- Logback
- docker-compose
- 달팽이
- 유레카
- 게이트웨이
- 다익스트라
- 백트래킹
- 완전 탐색
- 구현
- spring boot
- spring cloud
- 플로이드 와샬
- 이분 탐색
- 구간 트리
- 서비스 디스커버리
Archives
- Today
- Total
Hello, Freakin world!
[채팅앱][서버] non-blocking IO 다중 연결 서버 아키텍처 본문
Java NIO 에서 지원하는 셀렉터를 이용하면 하나의 serverSocketChannel로 다중의 클라이언트 채널에 대응할 수 있다.
그리고 위 그림은 클라이언트의 연결 요청에 대한 처리만을 그림으로 나타낸 것이다. (채널은 기본적으로 양방향 통신이 가능한데, 나중에 차차 추가하도록 하자.)
셀렉터에는 각 채널의 register 메서드를 통해 selector에 등록할 수 있는데, 이벤트 주도 모델에서 이벤트를 등록하는 개념과 유사하다.
위 그림에서 셀렉터는 eventLoop를 처리하는 다른 스레드에서 작동한다.
만약 서버가 클라이언트에 대해서 이벤트를 던지기만 한다면 굳이 또 하나의 스레드를 추가해서 구현할 필요가 없다.
하지만 이벤트의 발원지가 서버가 아닌 클라이언트인 경우, 이 이벤트를 감지하기 위해 풀링하거나 메소드를 blocking 해야만 한다. 그래서 nonblocking 을 구현하려면 반드시 이벤트를 처리하는 또 하나의 스레드가 필요하다.
이제 셀렉터를 이용해 클라이언트의 다중 연결을 구현해보자.
'Toy Project > 채팅 앱 만들기' 카테고리의 다른 글
[채팅앱][클라이언트] ClientChannelManager 단위 테스트 작성하기 (0) | 2020.02.26 |
---|---|
[채팅앱][클라이언트] IO 단위 테스트 어떻게 할 것인가? (0) | 2020.02.21 |
[채팅앱][서버] EventLoop 스레드 설계 (0) | 2020.02.21 |
[채팅앱][클라이언트] 시작하기 - 서버와 연결하기 (0) | 2020.02.21 |
채팅 앱 초기 설계 (0) | 2020.01.17 |
Comments