๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Kafka

[๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค] ๋‚˜๋งŒ ๋ชจ๋ฅด๋Š” ์ค„ ์•Œ์•˜๋˜ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค..

by carrot0911 2025. 5. 30.

๐Ÿ“จ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋ž€ ๋ฌด์—‡์ผ๊นŒ..?

์„œ๋กœ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์ด๋‚˜ ํ”„๋กœ๊ทธ๋žจ๋ผ๋ฆฌ "๋ฉ”์‹œ์ง€(๋ฐ์ดํ„ฐ)"๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์ค‘๊ฐ„์—์„œ ์ „๋‹ฌํ•ด ์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ด๋‹ค.
์‰ฝ๊ฒŒ ๋งํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ์‹ถ์€ ์‹œ์Šคํ…œ๊ณผ ์ˆ˜์‹ ํ•  ์‹œ์Šคํ…œ ์‚ฌ์ด์— ์ค‘๊ฐ„ ์ „๋‹ฌ์ž ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

 

๐Ÿ“จ ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๊ฐ€ ์™œ ํ•„์š”ํ• ๊นŒ??

โŒ ๊ธฐ์กด ๋ฐฉ์‹ : A ํ”„๋กœ๊ทธ๋žจ → ์ง์ ‘ B ํ”„๋กœ๊ทธ๋žจ ํ˜ธ์ถœ

๐Ÿ‘‰ A์™€ B๊ฐ€ ์„œ๋กœ ๊ฐ•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋œ๋‹ค. (Coupling)
๐Ÿ‘‰ B๊ฐ€ ๋А๋ฆฌ๊ฑฐ๋‚˜ ์žฅ์• ๊ฐ€ ๋‚˜๋ฉด A๋„ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.
๐Ÿ‘‰ ๋น„๋™๊ธฐ ๋ถˆ๊ฐ€๋Šฅ → ํ™•์žฅ์„ฑ/์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต๋‹ค.

โœ… ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ์‚ฌ์šฉ : A ํ”„๋กœ๊ทธ๋žจ → ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค → B ํ”„๋กœ๊ทธ๋žจ

๐Ÿ‘‰ A๋Š” ๋ฉ”์‹œ์ง€๋งŒ ๋ณด๋‚ด๋ฉด ๋์ด๋‹ค. (B๊ฐ€ ์ฃฝ์–ด ์žˆ์–ด๋„ ๊ดœ์ฐฎ๋‹ค.)
๐Ÿ‘‰ A์™€ B๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. (๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.)
๐Ÿ‘‰ ์‹œ์Šคํ…œ ๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์ง€๊ณ  ๋น„๋™๊ธฐ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

โœจ ๋น„์œ 

ํƒ๋ฐฐ ํšŒ์‚ฌ์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค.
๋‚ด๊ฐ€ ์นœ๊ตฌ์—๊ฒŒ ๋ฌผ๊ฑด์„ ๋ณด๋‚ด๊ณ  ์‹ถ์€๋ฐ, ์ง์ ‘ ๊ฐ€์„œ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹  ํƒ๋ฐฐ ๊ธฐ์‚ฌ๋‹˜(๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค)์ด ๋Œ€์‹  ์ „๋‹ฌํ•ด ์ค€๋‹ค.
์นœ๊ตฌ๊ฐ€ ์ง‘์— ์—†์–ด๋„ ์ƒ๊ด€์—†๋‹ค! ๋งก๊ธฐ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

 

 

๐Ÿ“จ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๊ฐ€ ํ•˜๋Š” ์ผ์€ ๋ญ๊ฐ€ ์žˆ์ง€?

๐Ÿ‘‰ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ : ๋ณด๋‚ด๋Š” ์‹œ์Šคํ…œ → ๋ฐ›๋Š” ์‹œ์Šคํ…œ์œผ๋กœ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌํ•œ๋‹ค.
๐Ÿ‘‰ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ง€์› : ๋ณด๋‚ด๋Š” ์ชฝ์€ "์ „์†ก๋งŒ" ํ•˜๊ณ  ๋ฐ”๋กœ ๋‹ค์Œ ์ผ ์ง„ํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

โœจ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ (Asynchronous Communication)

๋™๊ธฐ(Synchronous) : ์š”์ฒญํ•œ ์ชฝ์ด ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ ค์•ผ ๋‹ค์Œ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋น„๋™๊ธฐ(Asynchronous) : ์š”์ฒญํ•œ ์ชฝ์ด ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋‹ค์Œ ์ผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ‘‰ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณด๋‚ธ ์ชฝ์€ "๋ฉ”์‹œ์ง€๋งŒ ๋˜์ง€๊ณ " ๋ฐ”๋กœ ๋‹ค์Œ ์ผ์„ ํ•œ๋‹ค. ๋ฐ›๋Š” ์ชฝ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋“  ๋ง๋“  ์•Œ์•„์„œ ๋‚˜์ค‘์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
๐Ÿ‘‰ "์ „ํ™” ํ†ตํ™”"๋Š” ๋™๊ธฐ, "๋ฌธ์ž ๋ฉ”์‹œ์ง€"๋Š” ๋น„๋™๊ธฐ

๐Ÿ‘‰ ๋ฒ„ํผ๋ง : ๋ฐ›๋Š” ์ชฝ์ด ๋ฐ”๋น ๋„ ์ค‘๊ฐ„์— ์ €์žฅํ•ด ๋‘์—ˆ๋‹ค๊ฐ€ ๋‚˜์ค‘์— ์ „๋‹ฌํ•œ๋‹ค.

โœจ ๋ฒ„ํผ๋ง (Buffering)

๋ฒ„ํผ (Buffer) : ๋ฐ์ดํ„ฐ๋ฅผ ์ž ๊น ์ €์žฅํ•ด ๋‘๋Š” ์ž„์‹œ ๊ณต๊ฐ„
๋ฒ„ํผ๋ง (Buffering) : ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ๋ชปํ•  ๋•Œ, ๋ฒ„ํผ์— ์Œ“์•„๋‘์—ˆ๋‹ค๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ

๐Ÿ‘‰ ๋ฐ›๋Š” ์ชฝ(B)์ด ๋ฐ”์˜๊ฑฐ๋‚˜ ์ฃฝ์–ด ์žˆ์–ด๋„, ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋Š” "๋ฒ„ํผ"์— ์Œ“์•„ ๋†“๊ณ  ๊ธฐ๋‹ค๋ ค์ค€๋‹ค. ๊ทธ ๋•๋ถ„์— ์ „๋‹ฌ ์‹คํŒจ ์—†์ด ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
๐Ÿ‘‰ "๊ณ ๊ฐ์„ผํ„ฐ ๋Œ€๊ธฐ ์ „ํ™”"๋Š” ๋ฐ”๋กœ ์‘๋‹ต ๋ชปํ•ด๋„ "๋Œ€๊ธฐ์—ด(๋ฒ„ํผ)"์— ์Œ“์—ฌ์„œ ์ˆœ์„œ๋Œ€๋กœ ์—ฐ๊ฒฐ

๐Ÿ‘‰ ์‹ ๋ขฐ์„ฑ ๋ณด์žฅ : ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋‚˜ ์„œ๋ฒ„ ์žฅ์• ๊ฐ€ ๋‚˜๋„ ๋ฉ”์‹œ์ง€๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ ๋ขฐ์„ฑ ๋ณด์žฅ (Reliability)

์‹ ๋ขฐ์„ฑ (Reliability) : ์‹œ์Šคํ…œ ์žฅ์• ๋‚˜ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ์—๋„ ๋ฉ”์‹œ์ง€๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฌ์ง€ ์•Š๋Š” ๊ฒƒ

๐Ÿ‘‰ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•˜๊ฑฐ๋‚˜, ๋ณต์ œํ•˜๊ฑฐ๋‚˜, ์ „์†ก ์‹คํŒจ ์‹œ ์žฌ์‹œ๋„ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹ ๋ขฐ์„ฑ์„ ํ™•๋ณดํ•œ๋‹ค.
๐Ÿ‘‰ ํƒ๋ฐฐ ํšŒ์‚ฌ๊ฐ€ ๋ฌผ๊ฑด์„ ๋ถ„์‹คํ•˜์ง€ ์•Š๊ณ , ๋ฌธ์ œ ์ƒ๊ฒจ๋„ "๋ณด์ƒ"ํ•ด์ฃผ๊ฑฐ๋‚˜ "๋‹ค์‹œ ๋ณด๋‚ด์ฃผ๋Š”" ๊ฒƒ

 

 

๐Ÿ“จ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์˜ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

Queue ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ (Point-to-Point)

๐Ÿ‘‰ ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ•˜๋‚˜์˜ ์†Œ๋น„์ž๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
๐Ÿ‘‰ ์ฃผ๋กœ ์ž‘์—… ๋ถ„์‚ฐ(Load Balancing)์— ํ™œ์šฉ๋œ๋‹ค.

Pub/Sub ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ (Publish/Subscribe)

๐Ÿ‘‰ ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์—ฌ๋Ÿฌ ์†Œ๋น„์ž์—๊ฒŒ ๋™์‹œ์— ์ „๋‹ฌํ•œ๋‹ค.
๐Ÿ‘‰ ์ด๋ฒคํŠธ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ์— ์ ํ•ฉํ•˜๋‹ค. (Kafka์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ์‹)

 

 

๐Ÿ“จ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์˜ ๋‹จ์ ์€?

๐Ÿ‘‰ ์šด์˜ ๋ณต์žก์„ฑ : Kafka ๋“ฑ์€ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๋งŽ๊ณ  ์„ค์ •์ด ๋ณต์žกํ•˜๋‹ค.
๐Ÿ‘‰ ์ง€์—ฐ ๋ฐœ์ƒ : ์‹ค์‹œ๊ฐ„ API์— ๋น„ํ•ด ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์ง€์—ฐ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
๐Ÿ‘‰ ์ค‘๋ณต/์œ ์‹ค ์ฒ˜๋ฆฌ ํ•„์š” : ์žฅ์•  ์‹œ ๋ฉ”์‹œ์ง€ ์ค‘๋ณต ๋˜๋Š” ์œ ์‹ค์ด ๊ฐ€๋Šฅํ•˜๋‹ค → idempotent ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
๐Ÿ‘‰ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ : ๋ฉ”์‹œ์ง€ ์ €์žฅ/๋ณต์ œ/์ „์†ก์— ๋””์Šคํฌ, ๋„คํŠธ์›Œํฌ ๋“ฑ ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ๊ฐ€ ์žˆ๋‹ค.

 

 

๐Ÿ“จ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ์ข…๋ฅ˜

๐Ÿ‘‰ Kafka : ๋Œ€์šฉ๋Ÿ‰ ์ฒ˜๋ฆฌ์— ๊ฐ•ํ•˜๋‹ค. (์ˆ˜๋ฐฑ๋งŒ ๋ฉ”์‹œ์ง€๋„ OK), ๋น ๋ฅด๊ณ  ํ™•์žฅ์„ฑ์ด ์ข‹๋‹ค.
๐Ÿ‘‰ RabbitMQ : ๋‹ค์–‘ํ•œ ๋ฉ”์‹œ์ง• ํŒจํ„ด์„ ์ง€์›ํ•œ๋‹ค. (ํ, ๋ผ์šฐํŒ… ๋“ฑ), ์‹ ๋ขฐ์„ฑ ์œ„์ฃผ์ด๋‹ค.
๐Ÿ‘‰ AWS SQS : ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜, ์ธํ”„๋ผ ๊ณ ๋ฏผ ์—†์ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

โœ… ์ •๋ฆฌ

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

๐Ÿ‘‰ ๋น„๋™๊ธฐ ํ†ต์‹ 
๐Ÿ‘‰ ์žฅ์•  ๋ถ„๋ฆฌ
๐Ÿ‘‰ ๋Œ€์šฉ๋Ÿ‰ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ

๊ฐ™์€ ์žฅ์ ์„ ํ†ตํ•ด ๋” ์•ˆ์ •์ ์ด๊ณ  ์œ ์—ฐํ•œ ์‹œ์Šคํ…œ ์„ค๊ณ„๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค.