본문 바로가기
Spring Boot(JAVA)

3. Reactive - Netty

by #Glacier 2024. 4. 4.
반응형

Netty

 

1. 비동기 이벤트 기반의 네트워크 어플리케이션 프레임워크

2. Http 등 다양한 프로토콜 지원

3. Java IO, NIO, selector 기반의 저 리소스 고 성능 보장

4. 불필요한 메모리 copy를 최소한으로, 유연하며 확장 가능한 이벤트 모델 기반이다.

5. 서버 및 클라이언트 모두 지원된다.

 

NIOEventLoop

- EventExecutor, TaskQueue, Selector를 포함한다

- EventExecutor : task를 실행하는 쓰레드풀

- TaskQueue : task를 저장하는 queue

                        eventExecutor가 즉시 task를 수행하지 않고 taskQueue에 넣은 후, 나중에 꺼내서 처리 가능

- Selector : I/O Multiplexing을 지원

 

NIOEventLoop task

- I/O task와 Non I/O task로 구분

- I/O task : register를 통해서 내부의 selector에 channel을 등록, I/O 준비 완료 이벤트가 발생 시 channel의 pipeline 실행

- Non I/O task : task queue에서 Runnable 등 실행 가능한 모든 종류의 task를 꺼내서 실행

- iorRatio를 설정하여 각각 task 수행에 얼마나 시간을 쓸지 설정 가능하며 기본값은 50이다.

- 50인 경우 I/O, Non I/O task에 동일한 시간을 소모, 100이면 시간을 측정하지 않고 task 수행

 

NIOEventLoop I/O Task

- NIOEventLoopGroup을 사용, NIO를 수행하는 ServerSocketChannel을 생성, accept network I/O 이벤트를 eventLoop에 등록

- 하나의 eventLoopGroup에 여러 개의 channel 등록 가능

- I/O 이벤트 완료 시 channel의 pipeline 실행

 

NIOEventLoop Non I/O Task

- Executor처럼 Non I/O task 수행

- 하나의 쓰레드에서 수행하여 순서 보장

EventLoopGroup

- EventLoop를 포함하는 group, 생성자를 통해 내부에 몇 개의 EventLoop를 포함할 지 설정 가능

- 각각의 eventLoop에 순차적으로 task가 추가, 순서가 보장되지 않지만

   eventExecutor 기준으로 보았을 때 순서가 보장

ChannelFuture

- Channel I/O 작업이 완료되면 isDone이 true가 되는 Future

- futureListener 등록/삭제를 지원함 (addListener, removeListener) 따라서 Future의 .get()으로 접근하지 않아 비동기 가능

1) addListener : Channel I/O 작업이 완료되면 수행할 futureListener

2) removeListener : 등록된 futureListener 제거용

3) sync : 작업이 완료될때까지 blocking 역할

 

NioServerSocketChannel

- Netty에서는 java nio channel을 사용하지 않고 자체 구현함

- AbstractChannel은 pipieline을 갖고, AbstractNioChannel은 SelectableChannel을 갖는다.

 

반응형