Reactor
- ๐Reactor
- ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ ํ์ค ์ฌ์์ ๊ตฌํํ ๊ตฌํ์ฒด ์ค ํ๋
- Spring 5 ๋ฒ์ ๋ถํฐ ์ง์ํ๋ ๋ฆฌ์กํฐ๋ธ ์คํ์ ํฌํจ
- ๋ฆฌ์กํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ๋์์ ์์ด ํต์ฌ์ ์ญํ ์ ํ๋ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Reactor ํน์ง
- Reactor๋ Reactive Streams๋ฅผ ๊ตฌํํ ๋ฆฌ์กํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ </br>
- Non-Blocking์ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ์ ํน์ง
- Reactor๋ ์์ ํ Non-Blocking ํต์ ์ง์
- Non-Blocking : ์์ฒญ ์ฐ๋ ๋๊ฐ ์ฐจ๋จ๋์ง ์์ </br>
- Reactor๋ Publicher ํ์
- Reactor ์ ๊ณต Publisher
Mono[0 1] : 0๊ฑด ๋๋ 1๊ฑด์ ๋ฐ์ดํฐ๋ฅผ emit ๊ฐ๋ฅ - Flux[N] : ์ฌ๋ฌ ๊ฑด์ ๋ฐ์ดํฐ๋ฅผ emit ๊ฐ๋ฅ </br>
- Non-Blocking ํต์ ์ ์ง์ํ๋ Reactor๋ MSA ๊ตฌ์กฐ์ ์ ํฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- MSA(Microservice Architecture) ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
๋ค์ Blocking ํต์ ์ ์ฌ์ฉํ๊ธฐ์๋ ๋ฌด๋ฆฌ
- ์๋น์ค๋ค๊ฐ์ ํต์ ์ด ์ฆ์ผ๋ฏ๋ก ์์ฒญ ์ฐ๋ ๋๊ฐ ์ฐจ๋จ๋๋ฉด ์๋จ </br>
- MSA(Microservice Architecture) ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
๋ค์ Blocking ํต์ ์ ์ฌ์ฉํ๊ธฐ์๋ ๋ฌด๋ฆฌ
- Reactor๋ Backpressure ์ ๋ต์ ์ ์ง์ํด์ค
Subscriber์ ์ฒ๋ฆฌ ์๋๊ฐ Publihser์ emit ์๋๋ฅผ ๋ฐ๋ผ๊ฐ์ง ๋ชปํ ๋ ์ ์ ํ๊ฒ ์ ์ดํ๋ ์ ๋ต
- ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ๋์์์ด ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํด์ผํจ
- Publisher์์ ๋ค์ด์ค๋ ๋ฐ์ดํฐ emit์ ๋นํด Subscriber์ ์ฒ๋ฆฌ์๋๊ฐ ๋๋ฆฌ๋ฉด ์ฒ๋ฆฌ๋์ง ์์ ๋๊ธฐ ๋ฐ์ดํฐ๊ฐ ์ง์์ ์ผ๋ก ์์ด๊ฒ๋จ
- ์ฒ๋ฆฌ๋์ง ์์ ๋๊ธฐ ๋ฐ์ดํฐ๊ฐ ์์ด๋ ๊ฒ์ ๋ฐฉ์นํ๊ฒ๋๋ฉด ์ค๋ฒํ๋ก์ฐ ๋ฐ์
- ์์คํ ๋ค์ด ๊ฐ๋ฅ์ฑ๋ ์กด์ฌ
Marble Diagram
Marble Diagram
- ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ๋ณํํ๋ ๋ฐ์ดํฐ์ ํ๋ฆ์ ํํํ ๋ค์ด์ด๊ทธ๋จ
- ๊ตฌ์ฌ๋ชจ์์ ์๋ก๋ฌ๋กํ ๋๊ทธ๋ผ๋ฏธ๋ ํ๋์ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธ
- Reactor ์ ๊ณต Operator์ ๋ด๋ถ๋์์ ์ดํดํ๋๋ฐ์ ๋์
- Operator๋ฅผ ์ ์ ํ๊ฒ ์ฌ์ฉํ๋๋ฐ์ ๋์
- ๐Marble Diagram
Scheduler
- ๐Scheduler
- Thread๋ฅผ ๊ด๋ฆฌํ๋ ๊ด๋ฆฌ์ ์ญํ
- Reactor์ Scheduler๋ ๋ณต์กํ ๋ฉํฐ์ฐ๋ ๋ฉ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํ๊ฒ ํด์ค
- Reactor Sequence ์์์ ์ฒ๋ฆฌ๋๋ ๋์๋ค์ ํ๋ ์ด์์ ์ฐ๋ ๋์์ ๋์ํ๋๋ก ๋ณ๋์ ์ฐ๋ ๋๋ฅผ ์ ๊ณตํด์ค
- Non-Blocking ํต์ ์ ์ํด ์ฌ๋ฌ ์ฐ๋ ๋๋ฅผ ์์ฝ๊ฒ ๊ด๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ Reactor์์ ๊ต์ฅํ ์ค์ํจ
Scheduler ์ ์ฉ Operator
subscribeON()
- ๋ฐ์ดํฐ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ emitํ๋ ์๋ณธ Publisher์ ์คํ ์ฐ๋ ๋๋ฅผ ์ง์ ํ๋ ์ญํ
- ๊ตฌ๋ ์ง ํ ์คํ๋๋ Operator ์ฒด์ธ์ ์คํ ์ฐ๋ ๋๋ฅผ ์ง์ ํ ์ฐ๋ ๋๋ก ๋ณ๊ฒฝ
- ex) subscribeOn(Schedulers.boundedElastic())
- ์ค์ ๋ก Schedulers.boundedElastic()๋ฅผ ์์ฃผ ์ฌ์ฉํจ
- ์ฌ๋ฌ๋ฒ ์ถ๊ฐํด๋ ํ๋ฒ๋ง ์์ฑ
doOnSubscribe()
- ๊ตฌ๋ ๋ฐ์ ์ง ํ์ ํธ๋ฆฌ๊ฑฐ ๋๋ Operator
- ๊ตฌ๋ ์ง ํ ์ํํ๊ณ ์ถ์ ๋์ ์์ฑ
publichOn()
- ์ ๋ฌ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณต ์ฒ๋ฆฌํ๋ Operator ์์ ์ถ๊ฐํด์ ์คํ ์ฐ๋ ๋๋ฅผ ๋ณ๋๋ก ์ถ๊ฐํ๋ ์ญํ
- ์ถ๊ฐํ ๋ ๋ง๋ค ์ถ๊ฐํ publishOn()์ ๊ธฐ์ค์ผ๋ก Downstream์ชฝ ์ฐ๋ ๋๊ฐ ์ง์ ํ ์ฐ๋ ๋๋ก ๋ณ๊ฒฝ
- ex) publishOn(Schedulers.parallel())
doOnNext()
- ๋ฐ๋ก ์์ ์์นํ Operator๊ฐ ์คํ๋ ๋ ํธ๋ฆฌ๊ฑฐ ๋๋ Operator
- ๊ตฌ๋
์ง ํ์ ์คํ ์ฐ๋ ๋์ Operator ์ฒด์ธ๋ง๋ค ์คํ ์ฐ๋ ๋๋ฅผ ๊ตฌ๋ถํ ์ด์
- Spring WebFlux ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ ์์ ์ฐ๋ ๋๋ก ๋๋์ ์์ฒญ์ Non-Blocking ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๊ตฌ์กฐ
- ์ฐ๋ ๋๊ฐ ์ง์ ๋ณต์กํ ๊ณ์ฐ์ ์ํํ ๊ฒฝ์ฐ์๋ ์๋ต ์ฒ๋ฆฌ ์๊ฐ์ด ๋ฆ์ด์ง
- ๋ณต์กํ ๊ณ์ฐ์ด ํ์ํ ์์ ์ ๊ฒฝ์ฐ ์๋ฒ ์์ง์์ ์์ฑํ๋ ์์ฒญ ์ฒ๋ฆฌ ์ฐ๋ ๋๊ฐ ์๋ต ์ง์ฐ์ด ๋ฐ์ํ์ง ์๋๋ก ๋ณ๋์ ์ฐ๋ ๋๊ฐ ํ์
- Scheduler๋ฅผ ํตํด ๋ณ๋์ ์ฐ๋ ๋๋ฅผ ์์ฑํ ํ, ๋ณต์กํ ๊ณ์ฐ์ ์ํ์์ผ์ ์๋ต ์ง์ฐ์ด ๋ฐ์ํ์ง ์๋๋ก ํจ
- ๐Scheduler ์ง์ ์ฐ๋ ๋ ์ ํ