Skip to content

Latest commit

ย 

History

History
45 lines (29 loc) ยท 4.57 KB

File metadata and controls

45 lines (29 loc) ยท 4.57 KB

ํ•ธ๋“œ์…ฐ์ดํฌ

๋‘ ๊ฐœ์˜ ์žฅ์น˜๊ฐ€ ๋ณธ๊ฒฉ์ ์ธ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „, ์—ฐ๊ฒฐ ์„ค์ • ๋ฐ ๋ฐ์ดํ„ฐ ๊ตํ™˜ ๊ทœ์น™(ํ†ต์‹  ์†๋„, ๋ณด์•ˆ ์„ค์ • ๋“ฑ)์„ ํ˜‘์ƒํ•˜๋Š” ์‚ฌ์ „ ๋™๊ธฐํ™” ๊ณผ์ •

์›น์†Œ์ผ“

๊ธฐ์กด์˜ HTTP๋Š” ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ์‘๋‹ต์ด ์˜ค๋Š” connectionless์™€ stateless ๋ฐฉ์‹ ์ƒˆ๋กœ์šด ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ค๋ ค๋ฉด ๋จผ์ € ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์ง€์†์ ์œผ๋กœ ๋ฐ›์•„์˜ฌ ์ƒˆ๋กœ์šด ์ •๋ณด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ณ„์† ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ ์”จ๋‚˜ ์ฐจํŠธ ๊ฐ™์€ ์‹ค์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๋ ค๋ฉด ์ฃผ๊ธฐ์ ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์›น์†Œ์ผ“์ด ํƒ„์ƒํ•ฉ๋‹ˆ๋‹ค.

์›น์†Œ์ผ“์€ Transport protocol์˜ ์ผ์ข…์œผ๋กœ ์–‘๋ฐฉํ–ฅ ์†Œํ†ต์„ ์œ„ํ•œ ๊ทœ์•ฝ์ž…๋‹ˆ๋‹ค.

์š”์ฒญ์„ ๋จผ์ € ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์—†์—ˆ๋˜ ๊ธฐ์กด์˜ ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜ ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ์†Œํ†ต์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

์ฑ„ํŒ…์ด๋‚˜ ๊ฒŒ์ž„, ์ฆ๊ถŒ๊ฑฐ๋ž˜ ๋“ฑ ์‹ค์‹œ๊ฐ„ ์„œ๋น„์Šค์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

image https://curiousjinan.tistory.com/entry/websocket-deep-dive-ep1
  1. WebSocket ์ž์ฒด (ํ”„๋กœํ† ์ฝœ ๋ ˆ๋ฒจ)
  • HTTP๋กœ ์‹œ์ž‘ํ•ด์„œ Upgrade: websocket ํ—ค๋”๋กœ ํ•œ ๋ฒˆ ํ•ธ๋“œ์…ฐ์ดํฌํ•˜๊ณ , ๊ทธ ๋’ค๋กœ๋Š” ๊ฐ™์€ TCP ์ปค๋„ฅ์…˜์„ ๊ณ„์† ์—ด์–ด๋‘” ์ฑ„ **์–‘๋ฐฉํ–ฅ(full-duplex)**์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.
  • HTTP์ฒ˜๋Ÿผ ๋งค๋ฒˆ ์š”์ฒญ-์‘๋‹ต์ด ์•„๋‹ˆ๋ผ, ์„œ๋ฒ„๊ฐ€ ๋จผ์ € ํด๋ผ์ด์–ธํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ€์–ด๋„ฃ์„ ์ˆ˜ ์žˆ์–ด์š”(new_message๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์˜ต๋‹ˆ๋‹ค). ์ด๊ฒŒ ์ฑ„ํŒ…์ด "polling ์•ˆ ํ•˜๊ณ  ์‹ค์‹œ๊ฐ„"์ธ ์ด์œ ์ž…๋‹ˆ๋‹ค.
  • ์—ฐ๊ฒฐ์ด ์ƒํƒœ๋ฅผ ๊ฐ€์ง„(stateful) ์—ฐ๊ฒฐ์ด๋ผ๋Š” ๊ฒŒ ํ•ต์‹ฌ โ€” HTTP ์š”์ฒญ์€ ๋งค๋ฒˆ ๋…๋ฆฝ์ ์ด์ง€๋งŒ, WebSocket ์—ฐ๊ฒฐ์€ "์ด ์†Œ์ผ“์ด ๊ณง ์ด ์œ ์ €"๋ผ๋Š” ๋งคํ•‘์ด ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ๊น๋‹ˆ๋‹ค. ์ด๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ ๊ณ„์† ์–˜๊ธฐํ•œ "๋…ธ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ฉด ์ด ๋งคํ•‘์ด ๋…ธ๋“œ๋งˆ๋‹ค ๋”ฐ๋กœ ๋…ผ๋‹ค"๋Š” ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์ด์—์š”.
  1. Socket.IO๊ฐ€ ๊ทธ ์œ„์— ์–น๋Š” ๊ฒƒ๋“ค WebSocket ์ž์ฒด๋Š” ์ €์ˆ˜์ค€์ด๋ผ Socket.IO๊ฐ€ ์‹ค๋ฌด์— ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ์ถ”๊ฐ€๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋™ ์žฌ์—ฐ๊ฒฐ: ์—ฐ๊ฒฐ ๋Š๊ธฐ๋ฉด ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„๋กœ ์•Œ์•„์„œ ์žฌ์‹œ๋„. ์šฐ๋ฆฌ ์„ค๊ณ„์˜ "1์ดˆโ†’2์ดˆโ†’4์ดˆ..." ์žฌ์—ฐ๊ฒฐ ๋กœ์ง์ด ์ด๊ฑธ ๊ทธ๋Œ€๋กœ ์”€.
  • Room: ์†Œ์ผ“์„ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์„œ io.to(roomName).emit()์œผ๋กœ ํ•œ ๋ฒˆ์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ. ๊ทผ๋ฐ ์ง€๋‚œ๋ฒˆ์— ํ™•์ธํ–ˆ๋“ฏ ์šฐ๋ฆฌ SRS๋Š” ์ด๊ฑธ ๋ฉ”์‹œ์ง€ ๋ฐฐ๋‹ฌ์—” ์•ˆ ์“ฐ๊ณ (์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜), ํƒ€์ดํ•‘/์ฝ์Œ์ฒ˜๋Ÿผ "์ง€๊ธˆ ๋ณด๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค๋ผ๋ฆฌ"๋งŒ ์“ฐ๋Š” ์šฉ๋„๋กœ ์ขํ˜€๋†จ์ฃ  โ€” ์ด๊ฒƒ๋„ Room์ด ๋ญ”์ง€ ์•Œ์•„์•ผ ๊ทธ ์„ค๊ณ„ ๊ฒฐ์ •์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ๋‚˜๋‰˜์—ˆ๋Š”์ง€ ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • Adapter (์šฐ๋ฆฌ๋Š” Redis/Valkey adapter): Socket.IO ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ(๋ฉ€ํ‹ฐ๋…ธ๋“œ)์ผ ๋•Œ, ๋…ธ๋“œ1์ด ๊ฐ€์ง„ ์†Œ์ผ“ ๋ชฉ๋ก์„ ๋…ธ๋“œ2๋Š” ๋ชจ๋ฆ…๋‹ˆ๋‹ค. Adapter๊ฐ€ Valkey pub/sub์œผ๋กœ "๋ˆ„๊ฐ€ ์–ด๋А room์— ์žˆ๋Š”์ง€, emit ๋ช…๋ น์„ ๋‹ค๋ฅธ ๋…ธ๋“œ์—๋„ ์ „ํŒŒ"ํ•ด์ฃผ๋Š” ์—ญํ• . ์ด๊ฒŒ ์—†์œผ๋ฉด sticky session(๊ฐ™์€ ์œ ์ €๋ฅผ ํ•ญ์ƒ ๊ฐ™์€ ๋…ธ๋“œ๋กœ) ๊ฐ•์ œํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ๋Ÿผ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์ด ๋ง๊ฐ€์ง€๊ณ  ๋…ธ๋“œ ํ•˜๋‚˜ ์ฃฝ์œผ๋ฉด ๊ทธ ๋ฐฉ ์ „์ฒด๊ฐ€ ๋Š๊น๋‹ˆ๋‹ค.
  • Heartbeat (ping/pong): TCP ์—ฐ๊ฒฐ์ด ์ฃฝ์—ˆ๋Š”์ง€ ์„œ๋ฒ„๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜. ์šฐ๋ฆฌ ์„ค๊ณ„์—์„œ "ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋”ฐ๋กœ heartbeat ์•ˆ ๋ณด๋‚ด๋„ ๋จ"์ด๋ผ๊ณ  ํ•œ ๊ฒŒ ์ด๊ฑฐ โ€” Socket.IO๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ํ•ด์ค๋‹ˆ๋‹ค.
  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค: ์šฐ๋ฆฌ๋Š” ์•ˆ ์ผ์ง€๋งŒ, ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ ์œ„์— ์—ฌ๋Ÿฌ ๋…ผ๋ฆฌ์  ์ฑ„๋„์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์žˆ์Šต๋‹ˆ๋‹ค (์ฐธ๊ณ ๋กœ๋งŒ).
  1. ์ด๊ฒŒ ์™œ ์„ค๊ณ„์— ์ง์ ‘ ์˜ํ–ฅ์„ ์คฌ๋Š”์ง€
  • room vs ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜ ๋ฐฐ๋‹ฌ: Room์ด "์ง€๊ธˆ joinํ•œ ์‚ฌ๋žŒ์—๊ฒŒ๋งŒ ๊ฐ„๋‹ค"๋Š” ๊ฑธ ์•Œ์•„์•ผ, SRS์˜ "์ฑ„ํŒ…๋ฐฉ ์ž…์žฅ ์‹œ์—๋งŒ Room Join" + "๋ฉ”์‹œ์ง€๋Š” Room ๊ธฐ๋ฐ˜ ์•„๋‹Œ ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜"์ด๋ผ๋Š” ๋ฌธ์žฅ์ด ์™œ ์ง์„ ์ด๋ฃจ๋Š”์ง€ ์ดํ•ด๋ฉ๋‹ˆ๋‹ค. Room์— ์—†๋Š” Idle ์œ ์ €๋„ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๋‹ˆ๊นŒ, ๋ฉ”์‹œ์ง€๋Š” room์œผ๋กœ ๋ชป ๋ณด๋‚ด๊ณ  ์ฐธ์—ฌ์ž ๊ฐœ๊ฐœ์ธ์˜ ์†Œ์ผ“์œผ๋กœ ์ง์ ‘ ์ด์•ผ ํ•˜๋Š” ๊ฑฐ์ฃ .
  • ๋ฉ€ํ‹ฐ๋…ธ๋“œ์—์„œ ์ƒํƒœ๋ฅผ ์–ด๋”” ๋‘˜์ง€: ์†Œ์ผ“์ด "์ด ๋…ธ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์กด์žฌ"ํ•œ๋‹ค๋Š” ๊ฑธ ์•Œ์•„์•ผ, ์™œ ์—ฐ๊ฒฐ ์ƒํƒœยท์ œ์žฌ ๋ชฉ๋กยทrate limit์„ ์ „๋ถ€ Valkey๋กœ ๋นผ์•ผ ํ•˜๋Š”์ง€๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‚˜์˜ต๋‹ˆ๋‹ค.
  • ์žฌ์—ฐ๊ฒฐ ์‹œ ์œ ์‹ค ์ฒ˜๋ฆฌ: WebSocket์ด ๋Š๊ธฐ๋ฉด ๊ทธ ์‚ฌ์ด ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€๋Š” ๊ทธ๋ƒฅ ์‚ฌ๋ผ์ง„๋‹ค๋Š” ๊ฑธ ์•Œ์•„์•ผ, "์žฌ์—ฐ๊ฒฐ ๊ฐญ ์ฑ„์šฐ๊ธฐ"(lastMessageId ๊ธฐ๋ฐ˜ ๋™๊ธฐํ™”)๊ฐ€ ์™œ ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ์ธ์ง€ ์ดํ•ด๋ฉ๋‹ˆ๋‹ค.