이번에 WebFlux를 활용해서 개발을 하는 게 있어서
다 까먹어서 다시 공부하려고 합니다.
Reactor인 Netty는 사용 가능한 CPU 코어 수에 따라 이벤트 루프 그룹을 생성합니다.
기본 이벤트 루프 그룹은 NIO(Non-blocking I/O) 기반 전송을 위한 그룹입니다.
이벤트 루프는 이벤트 큐의 이벤트를 순차적으로 처리하고 플랫폼에 콜백을 등록한 후 즉시 반환합니다.
플랫폼은 데이터베이스 호출이나 외부 서비스 호출과 같은 작업의 완료를 Trigger할 수 있습니다.
이벤트 루프는 작업 완료 알림에 따라 콜백을 Trigger하여 결과를 호출자에게 전달이 가능합니다.
Event Loop 내에서 Mono, Flux가 다양한 연산뿐만 아니라 완료 신호, 데이터 전달 등등 다양한 역할을 합니다.
각 이벤트 루프에는 실행을 위해 보류 중인 작업을 저장하는 연결된 EventQueue가 있습니다.
새로운 이벤트가 만들어지면 해당 EventQueue에 대기합니다.
Netty는 스케줄링 정책을 사용하여 해당 이벤트 작업들을 관리하게 되는데
기본적으로 스케줄링 정책은 사용 가능한 이벤트 루프 중에서 라운드 로빈 방식으로 실행됩니다.
Reactor Netty의 이벤트 루프 모델은 단일 스레드이므로 각 이벤트 루프가 단일 스레드에서 작업 처리를 담당합니다.
생기걸 보면 거의 JavaScript 싱글 스레드 작동 방식과 유사하네요.
just(T data)
empty()
error(Throwable error)
defer(Supplier<? extends Mono<? extends T>> supplier)
fromCallable(Callable<? extends T> supplier) (Mono only)
fromCompletionStage(CompletionStage<? extends T> completionStage) (Mono only)
fromIterable(Iterable<? extends T> it) (flux only)
range(int start, int count) (flux only)
Mono, Flux 단순 Publisher인 것 만 알았지
Event Loop 라는 내부에서 동작하는 건지는 처음 알았습니다...
세상에나
전용 메소드는 쓰는 것만 써서 활용하는 법들을 잘 몰랐는데
좀더 다양한 케이스에 활용할 수 있을 것 같네요.
앞으로는 Operator 사용해서 파이프라인 등록할 떄면
공식 문서 마블 다이어그램좀 자주 봐야겠어요