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๊ฐ„์˜ ์„œ๋กœ ์˜์กดํ•˜๋Š” ์ƒํ™ฉ
    • ๋‹ค์–‘ํ•œ ํ† ํ”ฝ๋“ค์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ณ„๋„๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ

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

Reference