[์‹๊ตฌํ•˜์ž_MSA] ๐Ÿš€ ์ฑ„ํŒ…, ์•Œ๋ฆผ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๊ธฐ์ˆ  ์„ ํƒ: STOMP, Kafka, MongoDB, SSE - 1ํŽธ

์ด๋ฏผ์šฐยท2024๋…„ 2์›” 13์ผ
2

๐Ÿ€ ์‹๊ตฌํ•˜์ž_MSA

๋ชฉ๋ก ๋ณด๊ธฐ
4/21

์ง€๋‚œ ํฌ์ŠคํŒ…(Spring Cloud Eureka, Gateway๋ฅผ ํ†ตํ•œ ์ธ์ฆ/์ธ๊ฐ€ ์ฒ˜๋ฆฌ)์— ์ด์–ด ๋“œ๋””์–ด ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์ค‘ ํ•˜๋‚˜์ธ ์ฑ„ํŒ… ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ์— ์•ž์„œ ์„ ํƒํ•œ ๊ธฐ์ˆ ๋“ค์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์•Œ์•„๋ณด๊ณ , ์™œ ์ด๋Ÿฐ ์„ ํƒ์„ ํ–ˆ๋Š”์ง€ ํ•จ๊ป˜ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. (์ €๋Š” Spring Cloud Eureka, Gateway๋ฅผ ํ†ตํ•œ ์ธ์ฆ/์ธ๊ฐ€ ์ฒ˜๋ฆฌ ์ดํ›„ Spring Cloud BUS๋ฅผ ์ด์šฉํ•œ ์„ค์ • ์ •๋ณด ์„œ๋ฒ„ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ, ์ œ๊ฐ€ ์ด์ „์— ์ž‘์„ฑํ•œ ํฌ์ŠคํŒ…์ด ์žˆ์–ด ๋”ฐ๋กœ ํ•ด๋‹น ๊ณผ์ •์€ ํฌ์ŠคํŒ…ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋งํฌ ์ฐธ์กฐํ•ด์ฃผ์„ธ์š”!)

๐Ÿ‘‰๐Ÿ‘‰ Spring Cloud (Cloud bus,RabbitMQ ์ด์šฉํ•œ Config ์ •๋ณด ๋ฐ˜์˜)

๐Ÿ“š ๋ชฉ์ฐจ

  1. STOMP๋ž€?
  2. WebSocket๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•œ ์ด์œ 
  3. STOMP ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์˜ ํ•„์š”์„ฑ
  4. Kafka vs RabbitMQ: ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ์„ ํƒ
  5. ์ฑ„ํŒ… ๋ฐ์ดํ„ฐ ์ €์žฅ: MongoDB vs MySQL
  6. SSE(Server-Sent Events)๋ž€?
  7. ์•Œ๋ฆผ ๊ธฐ๋Šฅ์— SSE๋ฅผ ์„ ํƒํ•œ ์ด์œ 

1. STOMP๋ž€?

STOMP(Simple Text Oriented Messaging Protocol)๋Š” ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•œ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง• ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. ๐ŸŒˆ

STOMP์˜ ์ฃผ์š” ํŠน์ง•:

  • ๊ฐ„๋‹จํ•œ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ช…๋ น์–ด: CONNECT, SUBSCRIBE, SEND ๋“ฑ
  • ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ์‚ฌ์šฉ: ํšจ์œจ์ ์ธ ๋ฉ”์‹œ์ง€ ๋ผ์šฐํŒ…
  • ํ”„๋ ˆ์ž„ ๊ตฌ์กฐ: ๋ช…ํ™•ํ•œ ๋ช…๋ น๊ณผ ๋ฐ์ดํ„ฐ ๊ตฌ๋ถ„
  • ๋ฐœํ–‰/๊ตฌ๋… ๋ชจ๋ธ ์ง€์›: ์œ ์—ฐํ•œ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๊ตฌ์กฐ

๐Ÿ’ก ์™œ STOMP๋ฅผ ์„ ํƒํ–ˆ๋‚˜์š”?

  1. ์™ธ๋ถ€ ๋ธŒ๋กœ์ปค ํ™œ์šฉ: ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ๊ฐ„ ํšจ์œจ์ ์ธ ๋ฉ”์‹œ์ง€ ๊ด€๋ฆฌ
  2. ๊ฐ„ํŽธํ•œ ๋ผ์šฐํŒ…: @Controller์™€ @MessageMapping์„ ์ด์šฉํ•œ ์‰ฌ์šด ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ
  3. ํ‘œ์ค€ํ™”๋œ ํ”„๋กœํ† ์ฝœ: ๋‹ค์–‘ํ•œ ์–ธ์–ด์™€ ํ”Œ๋žซํผ ๊ฐ„ ํ˜ธํ™˜์„ฑ

2. WebSocket๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•œ ์ด์œ 

WebSocket์€ ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€๋งŒ, ์ฑ„ํŒ… ์„œ๋น„์Šค์—๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ๋ฉ”์‹œ์ง€ ํ˜•์‹ ์ •์˜ ๋ถ€์žฌ: WebSocket์€ ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š์•„ ์ถ”๊ฐ€ ์ž‘์—… ํ•„์š”
  2. ๋ณต์žกํ•œ ๋ผ์šฐํŒ…: ๊ฐ ์—ฐ๊ฒฐ๋งˆ๋‹ค ๊ฐœ๋ณ„์ ์ธ ํ•ธ๋“ค๋Ÿฌ ๊ด€๋ฆฌ ํ•„์š”
  3. ์„ธ์…˜ ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€: ์ฑ„ํŒ…๋ฐฉ๋ณ„ ์ ‘์†์ž ์ •๋ณด๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•จ

STOMP๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉฐ, ๋” ๊ตฌ์กฐํ™”๋œ ์ฑ„ํŒ… ์‹œ์Šคํ…œ ๊ตฌํ˜„์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ› ๏ธ

3. STOMP ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์˜ ํ•„์š”์„ฑ

STOMP์˜ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋Š” ์ฑ„ํŒ… ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ์—ญํ• ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค:

  • ํšจ์œจ์ ์ธ ๋ฉ”์‹œ์ง€ ๋ผ์šฐํŒ…: ๊ตฌ๋…์ž์—๊ฒŒ ์ •ํ™•ํ•˜๊ฒŒ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ
  • ์ฑ„ํŒ…๋ฐฉ ๊ด€๋ฆฌ ๊ฐ„์†Œํ™”: ๊ตฌ๋… ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ
  • ํ™•์žฅ์„ฑ ํ–ฅ์ƒ: ๋‹ค์ˆ˜์˜ ํด๋ผ์ด์–ธํŠธ ์ฒ˜๋ฆฌ ์šฉ์ด

๊ทธ๋Ÿฌ๋‚˜ STOMP ๋‚ด์žฅ ๋ธŒ๋กœ์ปค๋งŒ์œผ๋กœ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์–ด, ์ถ”๊ฐ€์ ์ธ ์†”๋ฃจ์…˜์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค”

4. Kafka vs RabbitMQ: ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ์„ ํƒ

Kafka๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค! ๊ทธ ์ด์œ ๋Š”:

  1. ๋†’์€ ํ™•์žฅ์„ฑ:
    • ์‰ฌ์šด ๋ธŒ๋กœ์ปค ์ถ”๊ฐ€
    • ํŒŒํ‹ฐ์…”๋‹์„ ํ†ตํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
  2. ๋ฐ์ดํ„ฐ ์•ˆ์ •์„ฑ:
    • ๋””์Šคํฌ์— ์ง€์†์  ๋ฉ”์‹œ์ง€ ์ €์žฅ
    • ๋ฐ์ดํ„ฐ ๋ณต์ œ๋กœ ์œ ์‹ค ์œ„ํ—˜ ์ตœ์†Œํ™”
  3. ๋Œ€์šฉ๋Ÿ‰ ์ฒ˜๋ฆฌ: ๋Œ€๊ทœ๋ชจ ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง•์— ์ตœ์ ํ™”

RabbitMQ๋„ ์ข‹์€ ์„ ํƒ์ด์ง€๋งŒ, ์‹๊ตฌํ•˜์ž ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ์™€ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•  ๋•Œ Kafka๊ฐ€ ๋” ์ ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿš€

5. ์ฑ„ํŒ… ๋ฐ์ดํ„ฐ ์ €์žฅ: MongoDB vs MySQL

์ฑ„ํŒ… ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋กœ MongoDB๋ฅผ ์„ ํƒํ•œ ์ด์œ :

  1. ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ: ์ฑ„ํŒ… ๋‚ด์šฉ์˜ ๋‹ค์–‘ํ•œ ํ˜•์‹ ์ˆ˜์šฉ(ex) ์ด๋ชจํ‹ฐ์ฝ˜)
  2. ๋น ๋ฅธ ์ฝ๊ธฐ/์“ฐ๊ธฐ: ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…์— ํ•„์ˆ˜์ ์ธ ๊ณ ์„ฑ๋Šฅ
  3. ํ™•์žฅ์„ฑ: ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ์œ ๋ฆฌ
  4. ์œ ์—ฐํ•œ ์Šคํ‚ค๋งˆ: ์ฑ„ํŒ… ๊ธฐ๋Šฅ ํ™•์žฅ ์‹œ ์šฉ์ด(ex) ์ƒค๋”ฉ)

MySQL๋„ ์ข‹์€ ์„ ํƒ์ง€์ด์ง€๋งŒ, ์ฑ„ํŒ… ์„œ๋น„์Šค์˜ ํŠน์„ฑ์ƒ MongoDB๊ฐ€ ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ“Š

6. SSE(Server-Sent-Events)

์ดํ›„์— ์ฑ„ํŒ… ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผํ•  SSE์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

SSE๋Š” ์„œ๋ฒ„์™€ ํ•œ๋ฒˆ ์—ฐ๊ฒฐ์„ ๋งบ๊ณ  ๋‚˜๋ฉด, ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์„œ๋ฒ„์—์„œ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋ฅผ ๊ตฌ๋…ํ•œ๋‹ค.(SSE Connection์„ ๋งบ๋Š”๋‹ค.)
2. ์„œ๋ฒ„๋Š” ๋ณ€๋™์‚ฌํ•ญ์ด ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ๊ตฌ๋…ํ•œ ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค.
SSE๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ์‘๋‹ต๋งˆ๋‹ค ๋‹ค์‹œ ์š”์ฒญ์„ ํ•ด์•ผ ํ•˜๋Š” Long Polling ๋ฐฉ์‹๋ณด๋‹ค ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. SSE๋Š” ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ text message๋ฅผ ๋ณด๋‚ด๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ์ˆ ์ด๋ฉฐ HTTP์˜ persistent connections์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” HTML5 ํ‘œ์ค€ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ HTTP๋ฅผ ํ†ตํ•œ SSE(HTTP/2๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ)๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‹น 6๊ฐœ์˜ ์—ฐ๊ฒฐ๋กœ ์ œํ•œ๋˜๋ฏ€๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์‚ฌ์ดํŠธ์˜ ์—ฌ๋Ÿฌ ํƒญ์„ ์—ด๋ฉด ์ฒซ 6๊ฐœ์˜ ํƒญ ์ดํ›„์—๋Š” SSE๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋‹จ์ ๋„ ์žˆ๊ธด ํ•ฉ๋‹ˆ๋‹ค. (HTTP/2์—์„œ๋Š” 100๊ฐœ๊นŒ์ง€์˜ ์ ‘์†์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.)
ํ•˜์ง€๋งŒ ์ „๋ฐ˜์ ์œผ๋กœ SSE๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์™€ ํฌ๊ฒŒ ํ†ต์‹ ํ•  ํ•„์š” ์—†์ด ๋‹จ์ง€ ์—…๋ฐ์ดํŠธ๋œ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ›์•„์•ผ ํ•˜๋Š” ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ๊ตฌํ˜„์ด ํ•„์š”ํ•  ๋•Œ๋Š” ๋งค์šฐ ํ›Œ๋ฅญํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

7. ์•Œ๋ฆผ ๊ธฐ๋Šฅ์— SSE๋ฅผ ์„ ํƒํ•œ ์ด์œ 

์•Œ๋ฆผ ๊ธฐ๋Šฅ ๊ตฌํ˜„์— SSE๋ฅผ ์„ ํƒํ•œ ์ด์œ :

  1. ๋ฆฌ์†Œ์Šค ํšจ์œจ์„ฑ: ํด๋ง ๋ฐฉ์‹๋ณด๋‹ค ์„œ๋ฒ„ ๋ถ€ํ•˜ ๊ฐ์†Œ
  2. ์‹ค์‹œ๊ฐ„์„ฑ: ์ฆ‰๊ฐ์ ์ธ ์•Œ๋ฆผ ์ „๋‹ฌ ๊ฐ€๋Šฅ
  3. ๋‹จ์ˆœ์„ฑ: WebSocket๋ณด๋‹ค ๊ตฌํ˜„๊ณผ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ด
  4. ๋ธŒ๋ผ์šฐ์ € ์ง€์›: ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›

WebSocket๋„ ๊ณ ๋ คํ–ˆ์ง€๋งŒ, ์•Œ๋ฆผ์˜ ๋‹จ๋ฐฉํ–ฅ ํŠน์„ฑ์„ ๊ณ ๋ คํ•  ๋•Œ SSE๊ฐ€ ๋” ์ ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ””


์ฐธ๊ณ 

https://velog.io/@mw310/Stomp-WebSocket-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%ACver-Spring
https://dkswnkk.tistory.com/702
https://velog.io/@ch4570/Stomp-Kafka%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%B1%84%ED%8C%85-%EA%B8%B0%EB%8A%A5-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0-with-Spring-Boot-1-Kafka%EC%99%80-Stomp%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C
https://igotanoffer.com/blogs/tech/polling-sse-websockets-system-design-interview
https://jinjinyang.tistory.com/59

profile
๋ฐฑ์—”๋“œ ๊ณต๋ถ€์ค‘์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด