Spring Webflux - Netty 기본 개념

박다현·2022년 3월 15일
1
post-thumbnail

Spring Webflux 를 사용하면서 확실히 Reactive Programing 이 어렵기도 어렵고, 고려할 사항도 많고, 레퍼런스도 많지 않은 걸 느낀다. Graceful Shutdown 구현을 알아보는 중에, Tomcat 에서의 구현은 레퍼런스가 많았지만 Netty 에서의 구현을 찾아보던 중 Netty 개념을 좀 알고 있어야할 것 같아 간단하게라도 정리하고자 하였다

Netty

알아보기 앞서 기본적인 내용을 먼저 알아보자.
Netty 는 비동기 네트워크 프레임워크다. Netty 는 Channel에서 발생하는 이벤트들을 EventLoop가 처리하는 구조를 가진다.

  • Channel
    • 기본 입출력 작업(bind, connect, read, write)은 네트워크 전송에서 제공하는 기본형을 이용
    • 자바 기반 네트워크 기본 구조는 Socket 클래스
    • Netty 의 Channel 인터페이스는 Socket으로 직접 작업할 때의 복잡성을 완화하는 API 제공
  • EventLoop
    • 이벤트를 실행하기 위한 무한루프 스레드
    • 객체 (Channel) 에서 발생한 이벤트는 이벤트 큐에 입력된다
    • 이벤트 루프는 이벤트 큐에 입력된 이벤트가 있을 떄 해당 이벤트를 꺼내서 이벤트를 실행
    • 지원하는 스레드 종류에 따라 단일 스레드 이벤트 루프와 다중 스레드 이벤트 루프로 나뉨
    • 이벤트 루프가 처리한 이벤트의 결과를 돌려주는 방식에 따라 콜백 패턴과 퓨처 패턴으로 나뉨
이벤트 루프가 이벤트를 처리하는 방식
  • EventLoopGroup

    • 기본적으로 TCP 클라이언트는 이벤트 루프 그룹을 사용
    • 워커 스레드는 초기화 시점 런타임에 사용할 수 있는 프로세서 수로 세팅
    • 다른 설정이 필요하면 LoopResource create() 메소드 중 하나 사용
    • 여러개의 EventLoop 을 갖고 있는 풀
  • Selector

    • 요청에 대한 이벤트를 select 하게 해준다
  • ChannelHandler

    • I/O 이벤트나 Operation을 handle 하는 핸들러
    • 실제 요청에 대한 핸들을 하기 위한 인터페이스
  • ChannelPipeline

    • 입력으로 출력을 전달할 수 있도록 파이프라이닝을 함
    • 이벤트 핸들러를 단일 처리기로 계속 연결하는 대신, 입력으로 출력을 전달할 수 있도록 파이프라인 개념을 통해 전체 처리에 대한 sequence 르 연결
    • Intercepting Filter Pattern
  • BootStrap

    • 프로세스를 지정된 포트로 바인딩하거나 프로세스를 지정된 호스트의 지정된 포트에서 실행중인 다른 호스트로 연결하는 등의 일을 하는 Application의 네트워크 레이어를 구성하는 컨테이너를 제공
  • Netty Resources

    • Contracts for managing connections via ConnectionProvide
      • Channel 에 대한 Context 정보를 가진 Connection 을 관리하는 Contract
    • LoopResources
      • EventLoop Resource
      • EventLoopGroup selector with associated Channel factories
      • EventLoopGroup 과 Channel 사이의 EventLoop 에서 사용하는 자원으로 보인다.. (공부가 더 필요)
  • Disposable

    • 람다 기반 subscribe() 메소드는 모드 Disposable 타입을 리턴
    • Disposable 인터페이스는 dispose() 메소드 호출로 구독을 취소할 수 있음을 의미
    • Flux, Mono 관점에서 취소는 소스가 데이터 생산을 중단해야 하는 신호 (단, 즉각적인 중단을 보장하지 않고, 데이터 소스가 취소 명령을 받기 전에 데이터를 생산하고 완료처리할 수 있다)

Reference

https://effectivesquid.tistory.com/entry/Netty%EC%9D%98-%EA%B8%B0%EB%B3%B8-Component-%EB%B0%8F-Architecture
https://effectivesquid.tistory.com/65
https://jess-m.tistory.com/23
https://projectreactor.io/docs/netty/snapshot/api/reactor/netty/resources/package-summary.html
https://godekdls.github.io/Reactor%20Netty/tcpclient/

0개의 댓글