Netty 이벤트 모델
- 네티는 event loop 기반 프레임워크
- single thread event loop 기반 프레임워크 : node.js
- multi thread event loop 기반 프레임워크 : Netty, Vert.x
이벤트 루프
이벤트 처리 방식
- Event listener + Event handle thread
- UI 처리 프레임워크에서 보통 사용
- Event queue + Event loop
- 프레임워크의 구현 복잡해짐
- Event queue는 다수의 thread에서 공유됨
- Thread 종류에 따라 multi thread event loop, single thread event loop로 나누어짐
- 결과를 돌려주는 방식에 따라 Callback 패턴과 Future 패턴으로 나누어짐
Single Thread Event Loop vs Multi Thread Event Loop
Single Thread Event Loop
- event handle thread가 1개
- event loop 구현 간단. 예측 가능한 동작 수행
- event 발생 순서에 따라 처리
- 작업 수행 시간이 길어질 수 있음
Multi Thread Event Loop
- event handle thread 여러 개
- event 발생 순서와 작업 수행 순서가 일치하지 않음
- multi core CPU 효율적으로 사용
- 작업 수행 시간이 상대적으로 짧아짐
- Thread 갯수가 지나치게 많아지면 문제 발생
- OOM 에러 발생
- 과도한 GC 유발
- Context switching 비용
- 하나의 core는 한번에 한 thread만 실행 가능
- Thread의 상태 Run, Waiting, Ready, Sleep, Blocked 중 Waiting, Sleep, Blocked 상태인 Thread를 골라 실행하는데 이 때, thread가 가지고 있는 stack 정보를 core의 register로 복사하는 비용 발생
- thread 경합
- 여러 thread 간 공유되는 자원이 있을 때, 단일 접근 권한을 얻기 위해서 thread 끼리 경쟁이 일어나며 여기에 CPU 자원 사용
네티의 이벤트 루프
특징
- 네티의 이벤트는 채널에서 발생
- 이벤트 루프 객체는 각각 이벤트 큐를 가짐
- 네티의 채널은 하나의 이벤트 루프에 등록됨
- => 이벤트 발생 순서와 수행 순서의 불일치에서 오는 부작용 경감
- 이벤트 처리를 위해 SingleThreadEventExecutor 사용
네티의 비동기 I/O 처리
Future 패턴
- Pure Java의 Future에 Listener을 등록할 수 있는 기능이 추가된 netty의
ChannelFuture
인터페이스 사용 - ChannelFutureListener 구현하여 이벤트 핸들링 가능
- 기본 ChannelFutureListener 제공
- ChannelFutureListener.CLOSE
- ChannelFutureListener.CLOSE_ON_FAILURE
- ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE