Reactive Stream
Reactive Streams is a standard for asynchronous data processing in a streaming fashion with non-blocking back pressure.
- ๋ ผ๋ธ๋กํน(Non-blocking) ๋ฐฑ ํ๋ ์ (back pressure)๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ํ์ค
์ Reactive Stream์ด ํ์ํ๊ฒ ๋์์๊น?
- ๊ธฐ์กด์๋ Thread Pool์ ํ์ฉํด์ ์ผ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค.
- I/O ์์ ์ด ๋ง์ ์ผ์ ํ๊ฒ ๋๋ Thread ๊ฒฝ์ฐ ๋๋ถ๋ถ ๊ธฐ๋ค๋ฆฌ๋ ์ํฉ์ด ๋ฒ์ด์ง๋ค.
- ๋ฌผ๋ก ๋ค๋ฅธ Thread๋ก ์ ์ด๊ถ์ด ๋์ด๊ฐ ์ผ์ ํ์ง๋ง Thread Pool์ ํฌ๊ธฐ๋ ์ ํด์ ธ ์๋ค๋ณด๋ ์ฑ๋ฅ์ ํ๊ณ๊ฐ ์ฐพ์์จ๋ค.
- Thread Pool Size๋ณด๋ค ๋ ๋ง์ ์ฌ์ฉ์์ ์์ฒญ์ด ์จ๋ค๋ฉด Thread Pool Hell์ธ ์ํฉ
- ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Thread Pool ๋์ ๋น๋๊ธฐ & non-blocking ๋ชจ๋ธ์ ์ฌ์ฉํด์ ๋ฉ์์ง ์ปค๋ฎค๋์ผ์ด์
์ผ๋ก ์ ํํ๊ฒ ๋๋ค.
- ์ด๋ฅผ Reactive Stream์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Reactive Stream์ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด ์์๊น?
- I/O๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ธฐ ์ํด ์ ์ฉํ Observer pattern์ผ๋ก ์์๋๋ค.
- ์ด๋ฅผ ํตํด Thread๋ค์ ์ญํ ๋ณ๋ก ๋ถ๋ฆฌํ ์ ์๋ค.
- Observer Pattern์ ๋จ์ ์ ์์๊น?
- Observer - Subject๊ฐ์ ์๋ก ์์กดํ๋ ์ํฉ
- ๋ค์ํ ํ ํฝ๋ค์ ์ฌ์ฉํ๋ ค๋ฉด ๋ณ๋๋ก ์์ฑํด์ผ ํ๋ ์ํฉ
-
์๋ก ์์กดํ์ง ์๊ธฐ ์ํด ์ค๊ฐ์ Message Broker๋ฅผ ์ถ๊ฐํ์ฌ Pub-sub Pattern์ด ๋ฑ์ฅํ๊ฒ ๋๋ค.
- Pub, Sub ์๋ก ์์กดํ์ง ์์๋ ๋๋ ์ํฉ
- ์ด๋ฅผ ํตํด Topic based๋ก ๊ฐ์ ๋์ด ๋ค์ํ ํ ํฝ๋ค์ ๋ค์ํ ๊ตฌ๋ ์๋ค์๊ฒ ์ ๋ฌํ ์ ์๊ฒ ๋๋ค.
-
Reactive Stream ๋ช ์ธ์ ๋ฐ๋ฅด๋ฉด ์ด 4๊ฐ์ง ์ธํฐํ์ด์ค๋ก ๊ตฌ์ฑ๋์ด์๋ค.
- Publisher
- Subscriber
- Subscription
- Processor
Flow Control Problem(back pressure)
- Push ๋ฐฉ์(๋น ๋ฅธ Publisher & ๋๋ฆฐ Subscriber)
- Publisher๊ฐ ์ด๋น 100๊ฐ์ ๋ฉ์์ง๋ฅผ ์์ฐํด Subscriber์๊ฒ ๋ณด๋ธ๋ค.
- Subscriber์ ์ด๋น 10๊ฐ๋ฐ์ ์๋น๋ฅผ ํ์ง ๋ชปํ๋ค.
- ๊ทธ๋ผ ๋๋จธ์ง ์ด๋น 90๊ฐ๋ ์ด๋์ ์์๋์ด์ผ ํ ๊น?
- ๊ณ ์ ๋ ๋ฒํผ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด? โ ๋ฒํผ ํฌ๊ธฐ๋ฅผ ๋์ด์๋ฉด ๋ฒ๋ฆฌ๊ฑฐ๋ OOM ๋ฐ์ํ๊ฑฐ๋..
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Dynamic Pull ๋ฐฉ์์ผ๋ก ๋ฐ๊พผ๋ค.
- Subscriber์ ์์ ์ด ์๋นํ ์ ์๋ ํฌ๊ธฐ๋งํผ Publisher์๊ฒ ์์ฒญํ๋ค.
- Publisher๋ ์์ฒญ๋ฐ์ ๋ฉ์์ง ํฌ๊ธฐ๋งํผ Subscriber์๊ฒ ์ ๋ฌํ๋ค.
- Subscriber๋ ์์ ์ด ์ํํ ์ ์๋ ๋งํผ ๋ฉ์์ง๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์ ์ฒ๋ฆฌํ๋๋ฐ ๋ฌธ์ ๊ฐ ์๋ค.
- ๋จ์ ๊ถ๊ธ์ฆ?
- ๊ทธ๋ผ Publisher๊ฐ ๋์น๋ ์ํฉ์ ์ด๋ป๊ฒ ํธ๋ค๋งํ๋๊ฐ?
- ๊ฐ์ Topic์ ๋ค๋ฅธ Subscriber์ ์๋น์๋๊ฐ ๋ค๋ฅด๋ฉด ์ด๋ฅผ ์ด๋ป๊ฒ ํธ๋ค๋งํ ๊น?
Reactive Stream์ Spec ์ด๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ค
- RxJava, Reactor Core, Akka Streams
- ReactiveMongo, Slick
- Armeria, Vert.x, Play Framework, Spring WebFlux