Reactor에서 Scheduler를 이용하여 멀티 쓰레딩을 설정할 수 있음
Scheduler는 Worker를 포함하고 있고 Worker는 사실 상 Thread에 해당함
전형적인 사용 방법은 다음과 같이 Schedulers 팩토리를 이용함
Schedulers.immediate()
Schedulers.single()
Schedulers.parallel()
Schedulers.elastic()
Schedulers.boundedElastic()
- immediate는 스케쥴러가 필요하지만 쓰레드를 변경하고 싶지 않을 때
- single은 일회성으로 사용하려고 쓰레드풀을 만들 때
- parallel은 병렬로 여러 태스크를 처리할 때(cpu에 의존하지만 짧은 태스크 처리용), 쓰레드풀 크기는 고정됨
- elastic은 긴 태스크에 대해 IO blocking이 발생할 때
- boundedElastic은 elastic과 비슷하지만 쓰레드풀의 크기를 제한함. 입출력 작업에 적합함 - 추천
Thread pool에 비유하자면,
- immediate는 쓰레드 풀을 아예 만들지 않는 것
- single은 1개짜리 쓰레드 풀을 만든 것
- parallel과 elastic은 무제한으로 쓰레드를 만들 수 있는 쓰레드 풀을 만든 것(보통 이런 걸 쓰레드 풀이라고 하진 않음)
- parallel은 짧게 사용하는 쓰레드 풀
- elastic은 길게 사용하는 쓰레드 풀
- boundedElastic은 길게 사용하는 쓰레드 풀인데 갯수 제한이 있는 것(진정한 의미의 쓰레드 풀에 해당함)
이라고 할 수 있음
새롭게 스케쥴러를 만드는 방법도 있음
Schedulers.newParallel("스케쥴러이름", 10)
new를 접두사로 사용해서 위 팩토리 패턴의 다양한 용법을 새로운 스케쥴러로 정의할 수 있음
Scheduler s = Schedulers.newElastic("subscriber1");
Flux.range(1, 10)
.subscribeOn(s)
.map( ... )
...