Netty란?
기존의 소켓 프로그래밍은 클라이언트가 접속하게 되면 스레드를 할당해야 하는데(1:1관계), 정말 많은 클라이언트가 접속을 하게 될 경우 그 숫자만큼 스레드를 생성해야 해서 리소스의 낭비로 이루어지고, 문맥 교환과 관련된 문제와 입력이나 출력 데이터에 관련한 무한 대기 현상이 발생하는 문제가 있었습니다.
이러한 네트워크 문제 때문에 개발된 방법이 자바의 NIO 방식(Non-Blocking Input Ouput)입니다.
핵심으로는 네트워크 리소스 사용률을 세부적으로 제어하는 Non-Blocking 호출이 포함되어 있는 것으로, 내부적으로 시스템의 이벤트 통지 API를 이용해 논 블록킹 소켓을 등록하면 해당 소켓의 정보를 확인할 수 있습니다. 즉 무한 대기 현상을 회피할 수 있게 되는 것이지요.
기존의 소켓 통신 프로그래밍이 동기적인 네트워크 통신이었다면, NIO는 비동기적인 네트워크 통신이라고 보시면 됩니다.
위의 java.nio.channels.Selector에서 입출력을 하고 있는 Socket의 집합 상태를 확인하기 위해 이벤트 통지 API를 사용하기 때문에 클라이언트 당 스레드를 생성하지 않고, 필요할 때마다 스레드에게 통지를 하기 때문에 비동기적인 통신 구조를 갖출 수 있게 됩니다.
즉, 적은 수의 스레드로 더 많은 Connection을 취할 수 있어서 메모리 관리에 이점이 생기고 컨텍스트 스위치에 대한 오버헤드가 줄어들게 됩니다.
또한 최소화 된 스레드 생성으로 여유가 생긴 잉여 스레드를 다른 작업에 할당할 수 있게 됩니다.
하지만 위의 순수 자바 라이브러리를 이용해서 커넥션을 통한 네트워크를 구축하는 것은 굉장히 어렵습니다.
때문에 내부 로직이 이미 구현이 된 Netty 프레임워크를 사용하는 것으로 개발자는 비즈니스 로직에만 집중하여 효율적인 프로그래밍을 할 수 있게 됩니다.
Netty 공식 홈페이지 설명
Netty는 프로토콜 서버 및 클라이언트와 같은 네트워크 응용 프로그램을 빠르고 쉽게 개발할 수있는 NIO 클라이언트 서버 프레임 워크입니다. TCP 및 UDP 소켓 서버와 같은 네트워크 프로그래밍을 크게 단순화하고 간소화합니다.
'빠르고 쉽다'는 것은 결과 애플리케이션이 유지 보수성이나 성능 문제를 겪는다는 것을 의미하지 않습니다. Netty는 FTP, SMTP, HTTP, 다양한 바이너리 및 텍스트 기반 레거시 프로토콜과 같은 많은 프로토콜을 구현하여 얻은 경험을 바탕으로 신중하게 설계되었습니다. 결과적으로 Netty는 타협없이 개발의 용이성, 성능, 안정성 및 유연성을 달성 할 수있는 방법을 찾는 데 성공했습니다.
기능
Design
다양한 전송 유형을위한 통합 API-차단 및 비 차단 소켓
문제를 명확하게 구분할 수있는 유연하고 확장 가능한 이벤트 모델을 기반으로합니다.
고도로 사용자 정의 가능한 스레드 모델-단일 스레드, SEDA와 같은 하나 이상의 스레드 풀
진정한 비 연결형 데이터 그램 소켓 지원 (3.1 이후)
Ease of use
잘 문서화 된 Javadoc, 사용자 가이드 및 예제
추가 종속성 없음, JDK 5 (Netty 3.x) 또는 6 (Netty 4.x)이면 충분합니다.
Performance
더 나은 처리량, 더 짧은 대기 시간
적은 자원 소비
불필요한 메모리 복사 최소화
Security
완전한 SSL / TLS 및 StartTLS 지원
출처 :: https://netty.io/
Netty 컴포넌트
이러한 NIO 네트워크 기반 Netty 프레임워크는 비동기식 이벤트 기반 네트워킹을 지원합니다.
Tomcat서버가 10,000건의 커넥션을 처리한다면, netty는 100,000건에서 1,000,000건의 커넥션을 처리할 수 있는 장점이 있습니다.
핵심 컴포넌트로는 Channel, CallBack, Future, 이벤트와 핸들러, Event Loop와 PipeLine이 있습니다.
Channel : 하나 이상의 입출력 작업을 수행할 수 있는 하드웨어 장치, 파일, 네트워크 소켓이나 프로그램 컴포넌트와 같은 Open된 Connection 을 의미합니다.
CallBack : 다른 메서드로 자신에 대한 참조를 제공하는 메서드입니다. 이벤트를 처리할 때 Netty 내부적으로 콜백을 이용하는데, 이때 ChannelHandler 인터페이스를 통해 이벤트를 처리합니다.
Future : 작업이 완료가 될 경우 애플리케이션에 알립니다. Future 객체는 비동기 작업의 결과를 담는 Plachloder의 역할을 합니다. 이때 ChannelFuture 인터페이스를 이용해 결과값을 활용합니다.
Event와 Handler : Netty는 작업 상태의 변화를 알리기 위해 이벤트를 이용하고, 발생한 이벤트를 기준으로 Handler를 통해 트리거합니다.
Event Loop
유저가 입출력을 요구할 경우의 흐름
PipeLine
이벤트 루프에서 이벤트를 받아 핸들러에 전달하는 역할
핵심 플로우
참고 사이트
https://skibis.tistory.com/304
'프로토콜 > Netty' 카테고리의 다른 글
[Java] Netty Client (0) | 2020.09.07 |
---|---|
[Java] Netty Server (0) | 2020.09.04 |
Netty 파이프라인 (0) | 2020.09.04 |