[Concurrency] ์ฑ„๋„๊ณผ Pipeline Pattern

Pipeline Pattern์€ ์ฑ„๋„์„ ํ†ต์‹  ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ, ์ผ์ข…์˜ produce - consume ๊ตฌ์กฐ๋ฅผ ์ž์•„๋‚ด๋Š” ์ž์ž˜ํ•œ ๊ตฌํ˜„ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, Item์ด ์—ฌ๋Ÿฌ๊ฐœ ์žˆ๊ณ , ๊ฐ Item์—๋Š” ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ 3๊ฐ€์ง€ ์žˆ๋‹ค๊ณ  ํ•ด๋ณด๊ฒ ๋‹ค.

์ด ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋“ค์€ ์‹ค์ œ ์™ธ๋ถ€ ์„œ๋น„์Šค์— API๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋ณดํ†ต์€ ์ฝ”๋“œ๋ฅผ ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹ ์ž์ฒด์— ๋ญ”๊ฐ€ ๋Œ€๋‹จํ•œ ๊ฒฐ์ ์ด ์žˆ๊ฑฐ๋‚˜ ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
๋งŒ์•ฝ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š”๋‹ค๋ฉด, item ๋ฃจํ”„์˜ ๊ฐ ๋ฐ˜๋ณต์„ ์Šค๋ ˆ๋“œ๋กœ ๋„์šธ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ฑ„๋„์„ ์‚ฌ์šฉํ•ด์„œ ํ’€์–ด๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค.
์ด ๊ฒฝ์šฐ์—๋Š” items๊ฐ€ ์ด๋ฏธ ์ญ‰ ์ •ํ•ด์ ธ์žˆ์œผ๋‚˜, ๋ฐ์ดํ„ฐ ์†Œ์Šค๊ฐ€ ์ง€์†์ ์œผ๋กœ ์œ ์ž…๋  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ์ฑ„๋„์„ ํ†ตํ•œ ์ง€์†์ ์ธ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ, ์ธ์ž๋ฅผ ์ง์ ‘ ์ „๋‹ฌ๋ฐ›๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ฑ„๋„์„ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›๊ณ , ๋ฆฌํ„ด๊ฐ’๋„ ๋ฐ”๋กœ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ฑ„๋„์„ ํ†ตํ•ด ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


ํ˜ธ์ถœํ•  ๋•Œ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒด์ด๋‹ ํ˜•ํƒœ๋กœ, ์ฑ„๋„์„ ๋ฐ›๊ณ  ์ฑ„๋„์„ ๋ฆฌํ„ดํ•˜๋Š” ์‹์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.


๊ฐ ํŒŒ์ดํ”„๋ผ์ธ๋ณ„๋กœ, ์ฑ„๋„ consumer ํ•จ์ˆ˜๋“ค์ด ๋˜๋Š”๋Œ€๋กœ ์ ๋‹นํžˆ ์ฒ˜๋ฆฌ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿผ ์ด ๊ตฌํ˜„ ํŒจํ„ด์ด ๋ฌด์Šจ ์˜๋ฏธ๊ฐ€ ์žˆ์„๊นŒ?

๋‚ด๊ฐ€ ๋А๋ผ๊ธฐ์— ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜๋Š”, ์ฑ„๋„์„ ํ†ตํ•ด Backpressure๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์ฑ„๋„์— ๋ฒ„ํผ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ฑธ๋ฉด, ๋ฒ„ํผ๊ฐ€ ๊ฝ‰ ์ฐฐ ๊ฒฝ์šฐ์—๋Š” ๋” ์ด์ƒ send๋ฅผ ๋ฐ›์ง€ ์•Š๊ณ  ๋Œ€๊ธฐํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿผ ํŠน์ • ์ฑ„๋„ pipe ์ง€์ ์— ๋ณ‘๋ชฉ์ด ์กด์žฌํ•  ๊ฒฝ์šฐ๋ฅผ ์กฐ๊ธˆ ๋” ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ตœ์ดˆ ๋ฐ์ดํ„ฐ source๋ฅผ ์ฑ„๋„์„ ํ†ตํ•ด ๊ณ„์† ๊ตฌ๊ฒจ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ํŠน์ง•์ด๋‹ค.

๊ทผ๋ฐ ๊ทธ ์ด์™ธ์—๋Š” ํฐ ์žฅ์ ๊นŒ์ง€๋Š” ๋ณ„๋กœ ์—†๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
๊ฐ€๋…์„ฑ๋„ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ˜„ ํ˜•์‹๋ณด๋‹ค ๋–จ์–ด์ง€๊ณ , ์ฝ”๋“œ๊ฐ€ ์žฅํ™ฉํ•ด์ง€๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค.
์‚ฌ์‹ค ๋‚ด๊ฐ€ ๋ณผ๋•Œ async-await์ด๋‚˜ async stream ํŒจํ„ด์ด ์ง€์›๋˜๋Š” ์–ธ์–ด์—์„œ๋Š” ํฌ๊ฒŒ ํ•„์š”ํ•˜์ง„ ์•Š๋‹ค.

await flow์„ ๊ตฌํ˜„ํ•˜๊ธฐ ๋ฒˆ๊ฑฐ๋กœ์šด Go ๊ฐ™์€ ์–ธ์–ด์—์„œ ์ข€ ์“ธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.