๐ŸŽ‰ berenickt ๋ธ”๋กœ๊ทธ์— ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
Back
NestJs
45-Websocket & Queue

1. Websocket ์ด๋ž€?

  • TCP ์—ฐ๊ฒฐ ํ•˜๋‚˜๋กœ ์™„์ „ํ•œ ๋ฆฌ์–ผํƒ€์ž„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค
  • ์š”์ฒญ ์‘๋‹ต๋งˆ๋‹ค ๋‹จ๋ฐœ์ ์ธ ์—ฐ๊ฒฐ์ด ์ƒ์„ฑ๋˜๋Š” HTTP์™€ ๋‹ค๋ฅด๊ฒŒ Websocket์€ ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•œ๋‹ค
  • ๋ ˆ์ดํ„ด์‹œ (Latency)๊ฐ€ ๋‚ฎ๋‹ค
  • Hand Shake ์ดํ›„ ์ตœ์†Œํ•œ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์„œ๋กœ ์ „์†กํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์ „์†ก๋Ÿ‰์„ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๊ทธ ์–ด๋””๋“  ๋จผ์ € ํ†ต์‹ ์„ ์ฃผ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค

1.1 HTTP vs Websocket

1
# HTTP
2
ํด๋ผ์ด์–ธํŠธ --- ์š”์ฒญ --> ์„œ๋ฒ„
3
<-- ์‘๋‹ต ---
4
5
# Websocket
6
ํด๋ผ์ด์–ธํŠธ --- ์š”์ฒญ/์‘๋‹ต --> ์„œ๋ฒ„
7
<-- ์š”์ฒญ/์‘๋‹ต ---

2. Socket IO

Socket IO๋Š” Websocket ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“  low-latency (๋‚ฎ์€ ์ง€์—ฐ ์‹œ๊ฐ„), bidirectional (์–‘๋ฐฉํ–ฅ ์†Œํ†ต), event based(์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜)์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ํ†ต์‹  ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค


2.1 Socket IO์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

  • ํด๋ฐฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜ : websocket์ด ์ง€์›๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด ์ƒํ™ฉ์—์„œ๋„ ํ†ต์‹ ์ด ์œ ์ง€๋˜๋„๋ก ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์„ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค
  • ์ด๋ฒคํŠธ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ : ํŠน์ • ๋ฉ”์„ธ์ง€๋ฅผ listening ํ•˜๊ณ ์žˆ๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
  • Room & Namespace : Namespace๋ฅผ ์ด์šฉํ•ด ํšจ์œจ์ ์œผ๋กœ ์—ฐ๊ฒฐ์„ ๋‚˜๋ˆ„๊ณ  Room์„ ์ด์šฉํ•ด์„œ Broadcasting์„ ์กฐ์œจํ•œ๋‹ค

2.2 SocketIO๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•œ ์˜ˆ์ œ

  • ์ฑ„ํŒ… ์•ฑ : ์•ฑ์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์„œ๋กœ ์ฑ„ํŒ… ์„ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ธฐ๋Šฅ
  • ๋ผ์ด๋ธŒ ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜ : ์Šคํฌ์ธ  ์ ์ˆ˜ ํ˜„ํ™ฉ, ๋‰ด์Šค ์•Œ๋ฆผ, ์ฃผ์‹์‹œ ์žฅ ์‹ค์‹œ๊ฐ„ ์ •๋ณด ๊ธฐ๋Šฅ๋“ฑ
  • ํ˜‘์—… ํˆด : ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๋“ค์ด ๋™์‹œ์— ํ•˜๋‚˜์˜ ๋ฌธ์„œ ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ธฐ๋Šฅ
  • ์˜จ๋ผ์ธ ๊ฒŒ์ž„ : ๋™์‹œ์— ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๋“ค์ด ์ƒํ˜ธ์ž‘์šฉ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒŒ์ž„

2.3 Namespace & Room

namespace-room-1_1

  • Namespace : Socket IO์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • REST API URL์ฒ˜๋Ÿผ ์ •์˜ํ•˜๋ฉฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์ด๋ฒคํŠธ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค
  • Room : Namespace์—์„œ ํ•œ๋ฒˆ ๋” ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
    • ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ Room ์— ๋™์‹œ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ Broadcasting์— ์œ ์šฉํ•˜๋‹ค
1
// Namespace
2
const to = require('socket.io')(3000)
3
4
const chatNamespace = io.of('/chat')
5
chatNamespace.on('connection', (socket) => {
6
console.log('User connected to chat namespace')
7
socket.on('message', (msg) => {
8
console.log(;'Chat message:', msg)
9
})
10
})
11
12
const newsNamespace = io.of('/news')
13
newsNamespace.on('connection', (socket) => {
14
console.log('User connected to news namespace')
15
socket.on('update', (news) => {
16
console.log('News update:', news)
17
})
18
})
1
// Room
2
const io = require('socket.io')(3000)
3
4
io.on('connection', socket => {
5
console.log('User connected')
6
7
// Room ์ž…์žฅํ•˜๊ธฐ
8
socket.join('room1')
9
10
// 'room1'์— ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…
11
socket.to('room1').emit('message', 'Hello room1')
12
13
// Room ๋‚˜์˜ค๊ธฐ
14
socket.leave('room1')
15
})

3. NestJS Queue

nestjs-queue_1-1

3.1 Queue์˜ ์žฅ์ 

  • ์„œ๋ฒ„ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ๋”ฐ๋กœ Worker Node์—๊ฒŒ ์ „๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์Šค์ผ€์ผ๋ง์ด ์ž์œ ๋กญ๋‹ค
    • Worker Node๋งŒ ๋”ฐ๋กœ ์Šค์ผ€์ผ๋ง ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ์—ฌ๋Ÿฌ๊ฐœ์˜ Worker Node๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋™์‹œ์— ์ž‘์—…์„ ํ”„๋กœ์„ธ์‹ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ž‘์—…์ด ์œ ์‹ค๋  ํ™•๋ฅ ์ด ์ ๋‹ค
    • ์‹คํŒจํ•œ ์ž‘์—… ์žฌ์‹œ๋„
    • ์‹คํŒจํ•œ ์ž‘์—… ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์œ ์ง€
  • ์šฐ์„ ์ˆœ์œ„ ์ง€์ • ๊ฐ€๋Šฅ
    • ์ค‘์š”ํ•œ ์ž‘์—…์„ ์šฐ์„  ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Request -> Response ๋ผ์ดํ”„์‚ฌ์ดํด์— ๋”œ๋ ˆ์ด๋ฅผ ์ค„์—ฌ ์ค„ ์ˆ˜ ์žˆ๋‹ค.