1. 네티 : 비동기식 이벤트 기반 네트워크 프레임 워크
Netty : 유지 관리가 용이한 고성능 프로토콜 서버와 클라이언트를 신속하게 개발하기 위한 비동기식 이벤트 기반 네트워크 애플리케이션 프레임워크
IF 최대 15만 동시 사용자가 성능 저하 없이 지원하려면?
(1) 블로킹 입출력 다중연결
- 각각 새로운 클라이언트 소켓마다 새로운 스레드를 할당해야함
- 여러 스레드가 입출력 데이터가 들어오기를 기다리며 무한정 대기 상태로 유지될 수 있다.(리소스낭비)
- 스레드가 스택 메모리를 할당해야 하는데, 운영체제마다 다르지만 스텍의 기본 크기는 64KB에서 1MB 까지 차지할 수 있다.
- JVM이 물리적으로 많은 수의 스레드를 지원할 수 있지만, 동시 접속이 한계에 이르기 훨씬 전부터 컨텍스트 전환에 따른 오버헤드가 심각한 문제가 될 수 있다.
(2) 자바 NIO
자바는 블로킹 시스템 호출 방식 외에도 네이티브 소켓 라이브러리에는 오래전 부터 네트워크 리소스 사용률을 세부적으로 제어할 수 있는 논블로킹 호출이 포함돼 있다.
(!) 셀렉터
- 한 스레드로 여러 소켓을 동시에 연결 처리 할 수 있다.
- 이 모델은 블로킹 입출력 모델에 비해 전체적으로 훨씬 개선도니 리소스 관리 효율을 보여준다.
- 적은 수의 스레드로 더 많은 연결을 처리할 수 있으므로, 메모리 관리와 컨텍스트 전환에 따르는 오버헤드가 감소
- 입출력을 처리하지 않을 때는 스레드를 다른 작업에 활용 가능.
Socket Socket Socket
| | |
R/W R/W R/W
| | |
| | |
----- Selector ---
|
|
Thread
1.1 네티의 특징
설계
- 단일 API로 블로킹과 논 블로킹 박식의 여러 전송 유형을 지원
- 단순하지만 강력한 스레딩 모델
- 진정한 비연결 데이터그램 소켓 지원
- 재사용 지원을 위한 논리 컴포넌트 연결
이용 편의성
- 자세한 JavaDoc와 광범위한 예제,
- JDK 1.6+을 제외한 추가 의존성 없음(일부 옵션은 1.7+/추가 의존성 필요)
성능
- 코어 자바 API보다 높은 처리량과 짧은 지연시간
- 폴링과 재사용을 통한 리소스 소비 감소
- 메모리 복사 최소화
견고성
- 저속, 고속 또는 과부하 연결로 인한 OutOfMemoryError가 발생하지 않는다.
- 고속 네트워크 상의 NIO 애플리케이션에서 일반적인 읽기/쓰기 비율 불균형이 발생하지 않음
보안
- 완벽한 SSL/TLS 및 StartTLS 지원
- 애플릿이나 OSGI 같은 제한된 환경에서도 이용가능
커뮤니티 주도 개발
- 자주 릴리즈 됨
1.2.2 비동기식 이벤트 기반 네트워킹
- 비동기(Asynchronous), 즉 동기화 되지 않은 이벤트
- 논블로킹 네트워크 연결은 작업 완료를 기다릴 필요가 없게 해줌
- 완전 비동기 입출력은 이 특징을 바탕으로 한단계 더 나아감
- 비동기 메서드는 즉시 반환하며 작업이 완료되면 직접 또는 나중에 이를 통지
- 셀렉터는 적은 수의 스레드로 여러 연결에서 이벤트를 모니터링할 수 있게 해줌
1.3 네티의 핵심 컴포넌트
- Channel
- 콜백
- Future
- event and handler
1.3.1 channel
- 하나 이상의 입출력작업을 수행할 수 있는 하드웨어, 장치, 파일, 네트워크 소켓, 프로그램컴포넌트와 같은 엔티티에 대한 열린 연결
- channel은 들어오는(인바운드)데이터와 나가는(아웃바운드) 데이터를 위한 운송수단이다.
- channel은 열거나 닫고, 연결하거나 연결을 끊을 수 있다.
1.3.2 콜백
- 콜백(callback)은 다른 메서드로 자신에 대한 참조를 제공할 수 있는 메서드
- 다른 메서드에서 이 참조가 가리키는 메서드를 필요할 때 호출할 수 있음
- 네티에서는 이벤트를 처리할 때 내부적으로 콜백을 이용
- 콜백이 트리거되면 ChannelHandler 인터페이스의 구현을 통해 이벤트를 처리할 수 있다.
1.3.3 future
- 작업이 완료되면 이를 애플리케이션에 알리는 방법
- 비동기 작업의 결과를 담는 placeholder 역할을 함
- 미래의 어떤 시점에서 작업이 완료되면 그 결과를 접근할 수 있게 해줌
1.3.4. event and handler
- 네티는 작업의 상태 변화를 알리기 위해 고유한 이벤트를 이용
- 발생한 이벤트를 기준으로 적절한 동작을 트리거 할 수 있다.
(로깅, 데이터변환, 흐름제어, 어플리케이션 논리)
- 인바운드 데이터나 연관된 상태 변화로 트리거되는 이벤트
(연결 활성화 or 비활성화, 데이터 읽기, 사용자 이벤트, 오류 이벤트)
- 아웃바운드 이벤트는 미래에 한 동작을 트리거하는 작업의 결과
(원격 피어로 연결 열기 또는 닫기, 소켓으로 데이터 쓰기 또는 플러시)
'Back-End > Netty' 카테고리의 다른 글
[Netty]네티서버에 필요한 요소 (0) | 2017.04.14 |
---|---|
[Netty] @Sharable (0) | 2017.04.13 |
[Netty] Netty에서 Object객체 전송 및 ByteBuf로 변환하여 전송하기 (0) | 2016.06.01 |
[Netty] 네티 ServerBootstrap 만들기 (0) | 2016.04.06 |