๐ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ๋ฉ์์ง์ ํต์ฌ: 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 ํต์ฌ ๊ตฌ์ฑ ์์
- ์คํธ๋ฆผ (Stream): ์์์ ์ธ ๋ฉ์์ง ์ ์ฅ์๋ก, ํน์ NATS ์ฃผ์ ํจํด์ ๋ฉ์์ง๋ฅผ ์บก์ฒํ์ฌ ๋ณด๊ดํฉ๋๋ค.
- ์ปจ์๋จธ (Consumer): ์คํธ๋ฆผ์ ์ ์ฅ๋ ๋ฉ์์ง๋ฅผ ์๋นํ๋ ์ฃผ์ฒด์ ๋๋ค. Pull ๋ฐฉ์(๋ฅ๋์ ์์ฒญ) ๋๋ Push ๋ฐฉ์(์๋์ ์์ )์ผ๋ก ๋ฉ์์ง๋ฅผ ๊ฐ์ ธ๊ฐ๋ฉฐ, ๋ฐ๋์ **ํ์ธ ์๋ต(ACK)**์ ํตํด ์ ๋ฌ ๋ณด์ฅ์ ํ๋ณดํฉ๋๋ค.
3. ํ์ฅ ๊ฐ๋ฅํ ์ฑํ ์๋ฒ ์ํคํ ์ฒ ์์
NATS์ JetStream์ ๊ฒฐํฉํ๋ฉด ๊ณ ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ๋ชจ๋ ๊ฐ์ถ ํ์ฅ ๊ฐ๋ฅํ ์ฑํ ์๋ฒ๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ํคํ ์ฒ ๊ฐ์
- ์ค์๊ฐ ํต์ : Core NATS์ Pub/Sub ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ chat.room.<room_id> ์ฃผ์ ๋ก ๋ฉ์์ง๋ฅผ ์ด๊ณ ์์ผ๋ก ๋ฐํ ๋ฐ ๊ตฌ๋ ํฉ๋๋ค.
- ์ด๋ ฅ ๋ฐ ์คํ๋ผ์ธ ๋ฉ์์ง: JetStream์ CHAT_HISTORY ์คํธ๋ฆผ์ ๋ชจ๋ ์ฑํ ๋ฉ์์ง๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ก๊ทธ์ธ ์, ์ปจ์๋จธ๋ฅผ ํตํด ์คํ๋ผ์ธ ๋์ ์์ธ ๋ฉ์์ง๋ฅผ ์ ํํ ๋ก๋ฉํฉ๋๋ค.
- ์ํ ํ์ฅ: ์ฑํ ์๋ฒ ์ธ์คํด์ค(NATS ํด๋ผ์ด์ธํธ)๋ฅผ ๋ฌด์ ํ์ผ๋ก ๋๋ ค WebSocket ์ฐ๊ฒฐ ๋ถํ๋ฅผ ๋ถ์ฐํฉ๋๋ค.
๊ณ ๊ฐ์ฉ์ฑ ํ๋ณด: ํ ๋ฉ์ ํด๋ฌ์คํฐ
NATS ์๋ฒ๋ **ํ ๋ฉ์ ํด๋ฌ์คํฐ(Full Mesh Cluster)**๋ก ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
- ์ ์: ํด๋ฌ์คํฐ ๋ด ๋ชจ๋ ์๋ฒ๊ฐ ์๋ก ์ง์ ์ฐ๊ฒฐ๋ ๊ตฌ์กฐ์ ๋๋ค.
- ์ด์ : ํด๋ผ์ด์ธํธ๋ ํด๋ฌ์คํฐ ๋ด ์ด๋ ์๋ฒ์ ์ฐ๊ฒฐํด๋ ๋ชจ๋ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ผ๋ฉฐ, ์๋ฒ ์ฅ์ ์ ์๋์ผ๋ก ๋ค๋ฅธ ์๋ฒ๋ก ์ฐ๊ฒฐ์ ์ ํํ์ฌ ์๋น์ค ์ค๋จ ์๋ ๊ณ ๊ฐ์ฉ์ฑ์ ํ๋ณดํฉ๋๋ค.
- ๊ถ์ฅ ๊ตฌ์ฑ: JetStream์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ํด NATS ์๋ฒ๋ **3๋ ์ด์ (ํ์)**์ผ๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค.
4. ์ด์์ ์ฅ์ : ๊ตฌํ ์๋ ๋ฐฑ๋ณธ
NATS ์์คํ ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ NATS ์๋ฒ ์์ฒด๋ ์ค์ ํ์ผ(.conf)๋ง์ผ๋ก ์ด์์ด ๊ฐ๋ฅํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ๋ณต์กํ ๋ฉ์์ง ๋ก์ง์ ์ง์ ๊ตฌํํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค.
๊ฐ๋ฐํ์ NATS ์๋ฒ๋ผ๋ ๊ฐ๋ ฅํ ๋ฐฑ๋ณธ ์์ ์ฑํ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง ๊ตฌํ์๋ง ์ง์คํ ์ ์์ด ๊ฐ๋ฐ ์๋์ ํจ์จ์ฑ์ ๊ทน๋ํํ ์ ์์ต๋๋ค.