๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

NATS ์‹œ์Šคํ…œ์œผ๋กœ ์ฑ„ํŒ… ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ

by smilemugi 2025. 12. 11.

๐Ÿš€ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์‹œ์ง•์˜ ํ•ต์‹ฌ: NATS ์‹œ์Šคํ…œ ์™„์ „ ๋ถ„์„

1. NATS๋ž€ ๋ฌด์—‡์ธ๊ฐ€? ๋‹จ์ˆœํ•จ ์†์˜ ์ดˆ๊ณ ์† ๋ฉ”์‹œ์ง•

NATS(Neural Autonomic Transport System)๋Š” ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์„ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ณ ์„ฑ๋Šฅ, ๊ณ ๊ฐ€์šฉ์„ฑ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ „ํ†ต์ ์ธ ๋ฉ”์‹œ์ง€ ํ ์‹œ์Šคํ…œ๊ณผ ๋‹ฌ๋ฆฌ, NATS๋Š” ๋‹จ์ˆœํ•จ๊ณผ ์†๋„๋ฅผ ์ตœ์šฐ์„ ์œผ๋กœ ํ•˜์—ฌ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜(MSA)์˜ ๋ฉ”์‹œ์ง• ๋ฐฑ๋ณธ์œผ๋กœ ๊ฐ๊ด‘๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Core NATS์˜ ํŠน์ง• (์‹ค์‹œ๊ฐ„ ํ†ต์‹ )

Core NATS๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ **"์ตœ๋Œ€ ํ•œ ๋ฒˆ(At Most Once)"**์˜ QoS(์„œ๋น„์Šค ํ’ˆ์งˆ)๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์ด๋Š” ์—„์ฒญ๋‚œ ์„ฑ๋Šฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

  • ๋ฐœํ–‰/๊ตฌ๋… (Pub/Sub): ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ชจ๋ธ๋กœ, ํ•˜๋‚˜์˜ ์ฃผ์ œ(Subject)๋กœ ๋ฐœํ–‰๋œ ๋ฉ”์‹œ์ง€๋ฅผ ํ•ด๋‹น ์ฃผ์ œ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ถ„์‚ฐ ํ (Queue Group): ๋™์ผํ•œ ํ ๊ทธ๋ฃน ์ด๋ฆ„์œผ๋กœ ๊ตฌ๋…ํ•˜๋Š” ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค ์ค‘ ์˜ค์ง ํ•˜๋‚˜์—๊ฒŒ๋งŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ž‘์—… ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•˜๊ณ  ์ค‘๋ณต ์ฒ˜๋ฆฌ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋™์  ํ™•์žฅ์„ฑ: ํ ๊ทธ๋ฃน์— ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋  ๋•Œ, NATS๊ฐ€ ์ž๋™์œผ๋กœ ๋ฉ”์‹œ์ง€ ๋ผ์šฐํŒ…์„ ์กฐ์ •ํ•˜๋Š” ๋™์  ํ™•์žฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

2. JetStream: NATS์— ์˜์†์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ๋”ํ•˜๋‹ค

Core NATS๋Š” ๋น ๋ฅด์ง€๋งŒ ๋ฉ”์‹œ์ง€ ์˜์†์„ฑ์ด๋‚˜ ์ „๋‹ฌ ๋ณด์žฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ JetStream์ž…๋‹ˆ๋‹ค. JetStream์€ NATS ์„œ๋ฒ„์— ๋‚ด์žฅ๋œ ์˜์†์„ฑ ์—”์ง„์œผ๋กœ, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ๋ฉ”์‹œ์ง• ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

JetStream์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

๊ธฐ๋Šฅ ์„ค๋ช… Core NATS์™€์˜ ์ฐจ์ด์ 
์˜์†์„ฑ ๋ฉ”์‹œ์ง€๋ฅผ ๋””์Šคํฌ ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜์—ฌ ์„œ๋ฒ„ ์žฅ์• ๋‚˜ ๊ตฌ๋…์ž ์˜คํ”„๋ผ์ธ ์‹œ์—๋„ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ์œ ์‹ค๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ „๋‹ฌ ๋ณด์žฅ ์ตœ์†Œ ํ•œ ๋ฒˆ (At-Least-Once) ๋˜๋Š” ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ (Exactly-Once) ์ „๋‹ฌ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „๋‹ฌ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด๋ ฅ ๊ด€๋ฆฌ ์ €์žฅ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์ŠคํŠธ๋ฆผ(Stream) ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ, ํ•„์š” ์‹œ ๊ณผ๊ฑฐ ์ด๋ ฅ์„ ๋‹ค์‹œ ์†Œ๋น„(Replay)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  

JetStream ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ

  1. ์ŠคํŠธ๋ฆผ (Stream): ์˜์†์ ์ธ ๋ฉ”์‹œ์ง€ ์ €์žฅ์†Œ๋กœ, ํŠน์ • NATS ์ฃผ์ œ ํŒจํ„ด์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์บก์ฒ˜ํ•˜์—ฌ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ปจ์Šˆ๋จธ (Consumer): ์ŠคํŠธ๋ฆผ์— ์ €์žฅ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์†Œ๋น„ํ•˜๋Š” ์ฃผ์ฒด์ž…๋‹ˆ๋‹ค. Pull ๋ฐฉ์‹(๋Šฅ๋™์  ์š”์ฒญ) ๋˜๋Š” Push ๋ฐฉ์‹(์ˆ˜๋™์  ์ˆ˜์‹ )์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ๊ฐ€๋ฉฐ, ๋ฐ˜๋“œ์‹œ **ํ™•์ธ ์‘๋‹ต(ACK)**์„ ํ†ตํ•ด ์ „๋‹ฌ ๋ณด์žฅ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

3. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ฑ„ํŒ… ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ ์˜ˆ์‹œ

NATS์™€ JetStream์„ ๊ฒฐํ•ฉํ•˜๋ฉด ๊ณ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์„ ๋ชจ๋‘ ๊ฐ–์ถ˜ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ฑ„ํŒ… ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”

  1. ์‹ค์‹œ๊ฐ„ ํ†ต์‹ : Core NATS์˜ Pub/Sub ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ chat.room.<room_id> ์ฃผ์ œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ดˆ๊ณ ์†์œผ๋กœ ๋ฐœํ–‰ ๋ฐ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ด๋ ฅ ๋ฐ ์˜คํ”„๋ผ์ธ ๋ฉ”์‹œ์ง€: JetStream์˜ CHAT_HISTORY ์ŠคํŠธ๋ฆผ์— ๋ชจ๋“  ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ ์‹œ, ์ปจ์Šˆ๋จธ๋ฅผ ํ†ตํ•ด ์˜คํ”„๋ผ์ธ ๋™์•ˆ ์Œ“์ธ ๋ฉ”์‹œ์ง€๋ฅผ ์ •ํ™•ํžˆ ๋กœ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  3. ์ˆ˜ํ‰ ํ™•์žฅ: ์ฑ„ํŒ… ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค(NATS ํด๋ผ์ด์–ธํŠธ)๋ฅผ ๋ฌด์ œํ•œ์œผ๋กœ ๋Š˜๋ ค WebSocket ์—ฐ๊ฒฐ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๊ฐ€์šฉ์„ฑ ํ™•๋ณด: ํ’€ ๋ฉ”์‹œ ํด๋Ÿฌ์Šคํ„ฐ

NATS ์„œ๋ฒ„๋Š” **ํ’€ ๋ฉ”์‹œ ํด๋Ÿฌ์Šคํ„ฐ(Full Mesh Cluster)**๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ •์˜: ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋ชจ๋“  ์„œ๋ฒ„๊ฐ€ ์„œ๋กœ ์ง์ ‘ ์—ฐ๊ฒฐ๋œ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
  • ์ด์ : ํด๋ผ์ด์–ธํŠธ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์–ด๋А ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•ด๋„ ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„œ๋ฒ„ ์žฅ์•  ์‹œ ์ž๋™์œผ๋กœ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ์—ฐ๊ฒฐ์„ ์ „ํ™˜ํ•˜์—ฌ ์„œ๋น„์Šค ์ค‘๋‹จ ์—†๋Š” ๊ณ ๊ฐ€์šฉ์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.
  • ๊ถŒ์žฅ ๊ตฌ์„ฑ: JetStream์˜ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด NATS ์„œ๋ฒ„๋Š” **3๋Œ€ ์ด์ƒ (ํ™€์ˆ˜)**์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

4. ์šด์˜์˜ ์žฅ์ : ๊ตฌํ˜„ ์—†๋Š” ๋ฐฑ๋ณธ

NATS ์‹œ์Šคํ…œ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ NATS ์„œ๋ฒ„ ์ž์ฒด๋Š” ์„ค์ • ํŒŒ์ผ(.conf)๋งŒ์œผ๋กœ ์šด์˜์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณต์žกํ•œ ๋ฉ”์‹œ์ง• ๋กœ์ง์„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœํŒ€์€ NATS ์„œ๋ฒ„๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ๋ฐฑ๋ณธ ์œ„์— ์ฑ„ํŒ… ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ์†๋„์™€ ํšจ์œจ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.