IT/Spring WebFlux

Event-Driven & WebFlux

밝은내일 2020. 11. 10. 00:33
반응형

Event-Driven Programming

Event-Driven Programming은 기존의 절차적 실행흐름이 아니라 이벤트에 의해 실행흐름이 정해지는 프로그래밍 방법입니다. GUI(Graphical User Interface)가 발전하면서 Event-Driven 방식도 발전해왔습니다.

Event-Driven Architecture

위 그림은 Event-Driven Programming 방식을 지원하는 Event-Driven Architecture의 간단한 모식도입니다. 주요 컴포넌트와 그 역할은 아래와 같습니다.

  • Event Loop
    • Event를 적재하거나 Event의 상태를 관찰합니다.
    • Event의 상태 또는 특정 조건에 따라 Event Handler에게 Event 처리 작업을 위임합니다.
    • 상황에 따라 여유 공간이 있는 다른 Event Loop에 Event를 전달하기도 합니다.
  • Event Handler
    • 위임된 Event에 적합한 실제 행동을 수행합니다.
    • Event Handler에 적합한 행동을 등록해주면 Event를 간단히 제어할 수 있게 됩니다. 개발자는 Event Handing에 집중할 수 있습니다.
  • Exception Handler
    • Exception Handler는 Event Handle 작업에서 예외가 발생했을때 처리하는 역할을 합니다.

 

Event-Driven Architecture를 따르는 프로그램은 각 컴포넌트의 작업을 언어 레벨에서 알아서 처리해줍니다. (Event Loop를 돌면서 Event 발생을 감지하고 적합한 Handler에 위임해주는 부분)
사실 Event-Driven 방식은 효율적인 서버 모델로 활용되고 있습니다. 서버의 관점에서는 Event가 일종의 사용자의 요청과 다를바가 없기 때문입니다. 실례로, Node.js, Spring WebFlux는 Event-Driven Architecture를 따릅니다.

WebFlux Flow

 위 그림은 Spring WebFlux의 전반적인 실행 흐름을 나타냅니다. WebFlux에서 모든 요청은 Event와 Callback 정보를 가진채로 Event Loop에 들어옵니다.

 그림에는 없지만 Event Loop에는 Event를 받는 역할만을 전담하는 Request Thread가 하나 있습니다. 이 Request Thread는 들어온 요청을 다시 한 Thread Pool에 위임하는데, 이 Pool은 고정 되거나 적은 수의 Thread를 가집니다. (Fixed/Small Number of Threads) 사실 Event Loop의 주요 역할을 이 Thread Pool에서 관리하는 Thread들에서 처리하게 됩니다. Event Loop의 주요 역할은 아래와 같습니다.

  1. 적합한 Event Hanlder로 Event 처리를 위임하고, 즉시 Request Thread로 부터 들어온 다른 Event를 처리합니다.
  2. Event Handler로 부터 Event 처리 작업이 완료되면, 그 결과 Event를 받아 초기에 Callback 정보로 Callback 실행을 위임합니다. 

WebFlux는 Event-Driven 방식으로 적은 수의 쓰레드를 사용하기 때문에 자연스럽게 적은 메모리를 사용하고 쓰레드간의 context switching도 적기 때문에 성능이 좋아집니다.

반응형

'IT > Spring WebFlux' 카테고리의 다른 글

Reactor Core - Mono & Flux  (0) 2020.12.14
Project Reactor  (0) 2020.12.13
Back Pressure  (0) 2020.11.07
Non-Blocking  (0) 2020.11.07
Spring WebFlux  (1) 2020.11.06