거꾸로 바라본 세상
반응형

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 비활성화, 데이터 읽기, 사용자 이벤트, 오류 이벤트)

- 아웃바운드 이벤트는 미래에 한 동작을 트리거하는 작업의 결과

(원격 피어로 연결 열기 또는 닫기, 소켓으로 데이터 쓰기 또는 플러시)



반응형
profile

거꾸로 바라본 세상

@란지에。

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!