Reactor Stream Scheduler

리액티브 스트림 스케줄러

리액티브 스트림은 비동기로 이벤트 스트림을 처리하기 위한 특수한 스트림이지만 따로 설정을 하지 않는다면 동기적으로 수행된다. 때문에 자신의 목적에 맞는 적정한 스케줄러(스레드)를 스트림에게 알려주어야 한다.

스케줄러는 리액티브 스트림의 이벤트 생성과 처리를 위한 Publisher와 Subscriber마다 따로 설정할 수 있다. 이를 위해 publishOn()subscribeOn() 메서드를 제공하는데, publishOn() 메서드는 Subscriber가 이벤트를 처리할 때 사용할 스레드를, subscribeOn() 메서드는 Publisher가 이벤트를 생성할 때 사용할 스레드를 설정한다.

메서드의 이름이 반대로 된 것같아 보일 수도 있지만 이벤트의 입장에서 생각해보면, Pulisher가 이벤트를 생성publish하여 보내는 곳의 스케줄러를 지정한다는 의미에서 ‘Producer publish events on ~ thread’의 뜻으로 해석한다면 이해하기 쉽다.

리액터는 다음 스케줄러들를 기본 제공한다.

  • Schedulers.immediate() : 현재 쓰레드에서 실행한다.
  • Schedulers.single() : 쓰레드가 한 개인 쓰레드 풀을 이용해서 실행한다. 즉 한 쓰레드를 공유한다.
  • Schedulers.elastic() : 쓰레드 풀을 이용해서 실행한다. 블로킹 IO를 리액터로 처리할 때 적합하다. 쓰레드가 필요하면 새로 생성하고 일정 시간(기본 60초) 이상 유휴 상태인 쓰레드는 제거한다. 데몬 쓰레드를 생성한다.
  • Schedulers.parallel() : 고정 크기 쓰레드 풀을 이용해서 실행한다. 병렬 작업에 적합하다.

커스텀 스케줄러

immediate()를 제외한 나머지 스케줄러들은 인스턴스로 만들어 관리 할 수 있다. 각 스케줄러 타입에 따라 위에서 설명한 특성을 갖으며, 커스텀한 이름과 설정을 할 수 있다.

elastic의 경우 유휴 상태가 되었을 때 제거되기 까지의 시간을, parallel의 경우 스레드 풀의 크기를 지정할 수 있다. elastic, parallel 그리고 single 스케줄러 모두 스레드의 이름과 데몬 쓰레드로서 동작할 것인지 지정할 수 있다.