Language/Java

Netty 특징과 아키텍처

park_juyoung 2018. 12. 16. 13:08

Netty

네티는 유지 관리가 용이한 고성능 프로토콜 서버와 클라이언트를 신속하게 개발하기 위한 비동기식 이벤트 기반 네트워크 애플리케이션 프레임워크이다.


자바의 네트워킹

최초의 자바 API(java.net)은 블로킹 함수(accept())만 지원했다. 따라서 다수의 클라이언트를 관리하려면 새로운 클라이언트 Socket마다 새로운 Thread를 할당해야 한다.

여러 스레드가 입,출력을 기다리며 무한정 대기 상태가 되는 경우 리소스 낭비가 될 수 있다. 또한 각 스레드가 스택 메모리를 할당해야하는데 스택 메모리를 차지하며, JVM의 컨텍스트 전환에 따른 오버헤드 문제가 생길 수 있다.

10만명 이상의 동시 연결을 지원해야할 때는 이런 방식으로는 불가능 하다.


Java NIO

블로킹 시스템 호출 방식 외에 네이티브 소켓 라이브러리에는 논블로킹(non-blocking) 호출이 포함되 있다.


  • setsocket()을 이용하면 데이터가 없을 때 읽기/쓰기 호출이 즉시 반환된다.
  • 시스템 이벤트 통지 API를 이용해 논블로킹 소켓을 등록하면 읽기/쓰기할 데이터가 준비됐는지 여부를 알 수 있다. 

  • 직접 Java NIO API를 통해 제작하는 애플리케이션이 많지만 부하가 높은 상황에서 안정적으로 하기는 어렵다.
    따라서 Netty와 같은 프레임 워크를 이용하는 것이 좋다.


Netty의 비동기성과 확장성

  • 논 블로킹 네트워크 연결은 작업 완료를 기다릴 필요가 없다. 완전 비동기 입출력은 이 특징에 하나 더 추가되는데, 비동기 메소드는 즉시 반환하며 작업이 완료되면 직접 또는 나중에 이를 통지한다.
  • 셀렉터는 적은 수의 스레드로 여러 연결에서 이벤트를 모니터링 할 수 있게 해준다.


Netty의 핵심 컴포넌트

Channel

하나 이상의 입출력 작업을 수행할 수 있는 HW 장치, 파일, Socket 등에 대한 열린 연결을 의미


CallBack

네티는 이벤트를 처리할 때 내부적으로 콜백을 이용한다. 콜백이 트리거 되면 ChannelHanlder인터페이스의 구현을 통해 이벤트를 처리한다.


Future

작업이 완료되면 애플리케이션에 알린다. Future 객체는 비동기 작업의 결과를 담는 자리표시자(placeholder)의 역할을 하고, 미래의 어떤 시점에 작업이 완료되면 그 결과에 접근할 수 있게 해준다.

JDK가 java.util.concurrent.Future 인터페이스를 제공하지만 수동으로 작업을 해야했다. 그래서 Netty는 자체 구현 ChannelFuture를 제공한다.


Event & Handler

Netty는 작업의 상태 변화를 알리기 위해 고유한 이벤트를 이용하고, 발생한 이벤트를 기준으로 적절한 동작을 트리거한다.

  • 로깅
  • 데이터 변환
  • 흐름 제어
  • 애플리케이션 논리

    • 인바운드 이벤트

      • 연결 활성화 또는 비활성화
      • 데이터 읽기
      • 사용자 이벤트
      • 오류 이벤트
    • 아웃바운드 트리거 이벤트

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

각 채널의 EventLoop

  • 관심 이벤트 등록
  • 이벤트를 ChannelHanlder로 발송
  • 추가 동작 스케쥴링


'Language > Java' 카테고리의 다른 글

JDBC- MariaDB와 Java연동  (0) 2019.01.02
Netty 프로젝트 시작하기-server  (0) 2018.12.16
Netty Codec Framework  (0) 2018.12.15
TCP/IP 소켓 통신이란?  (3) 2018.12.15
HashMap과 HashTable 차이  (0) 2018.12.14