Netty

2022. 5. 26. 00:25Java/일반

Netty란

기존의 소켓 프로그래밍은 클라이언트가 접속하게 되면 스레드를 할당해야하는데, 많은 클라이언트가 접속을 하게 될 경우 그 숫자만큼 스레드를 생성해야해서 리소스가 낭비되고 문맥 교환이나 입출력 데이터에 관련한 무한 대기 현상이 발생하는 문제가 있었습니다. 이러한 네트워크 문제를 해결하기 위해 만들어진 방법이 NIO(Non-Blocking Input Output)입니다. 그리고 이러한 NIO 방식으로 동작하는 네트워크 프레임워크가 바로 Netty입니다.

Selector는 시스템 이벤트 통지 API를 사용하여 하나의 스레드로 동시에 많은 IO를 담당할 수 있습니다. 즉, 적은 수의 스레드로 더 많은 Connection을 취할 수 있어서 메모리 관리에 이점이 생기고 컨텍스트 스위치에 대한 오버헤드가 줄어들게 됩니다.

시스템 이벤트 통지 API란 Linux의 Select와 Epoll과 같이 다중 I/O를 처리하는 멀티플렉싱 방식의 API를 말합니다.
소켓을 열면 파일 디스크립터라는 소켓 ID가 부여되는데 Select는 루프를 돌면서 파일 디스크립터의 변화를 감시하는 방식이고 Epoll은 콜백 형식으로 관리합니다. 참고로 Netty가 리눅스 위에서 동작할 경우, Epoll을 사용하게 됩니다.

Netty의 구성 요소

Channel

Channel은 자바 NIO의 기본 구조입니다. Netty에서는 데이터의 운송 수단으로 사용되고 Netty가 자동으로 Channel을 열거나 닫아주기 때문에 직접 구현할 필요는 없습니다.

CallBack

우리가 일반적으로 알고 있는 CallBack 함수와 같습니다. Netty가 이벤트를 처리할 때 내부적으로 CallBack을 트리거하는데 CallBack이 발생하면 내부에서는 ChannelHandler 인터페이스를 구현함으로써 이벤트를 처리할 수 있습니다.

Future

Future는 작업이 완료되면 Application에 알리는 방법 중 하나입니다. 이 객체는 비동기 작업의 결과를 담는 역할을 합니다. 기존 JDK에 Future 인트페이스가 있지만 수동으로 작업 여부를 확인하거나 완료 전까지 블로킹하는 기능만 있습니다. 그래서 Netty는 CahnnelFuture를 사용하여 비동기 작업을 자동으로 완료되도록 구현하였습니다.

728x90

'Java > 일반' 카테고리의 다른 글

Java Serialize  (0) 2022.11.27
String Pool  (0) 2022.07.22
JIT Compiler  (0) 2021.10.08
Java Heap 메모리 구조  (0) 2021.08.23
Reactive Stream  (0) 2020.09.09