1. 문제 정의

웹소켓은 클라이언트와 서버 간에 지속 연결 상태를 유지하므로, 수평 확장 시 각 서버에 클라이언트 연결이 분산됩니다. 이를 해결하기 위해 서버 간 상태를 동기화하거나 클라이언트가 특정 서버에 고정되도록 설정해야 합니다.


2. 로드 밸런싱

수평 확장을 위해 로드 밸런서를 설정합니다.

1) 로드 밸런서 설정

2) NGINX 설정 예제

NGINX를 사용한 WebSocket 프록시:

http {
  upstream websocket_servers {
    ip_hash; # Sticky session
    server ws-server1:3000;
    server ws-server2:3000;
  }

  server {
    listen 80;
    location / {
      proxy_pass http://websocket_servers;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
    }
  }
}

3. 서버 간 상태 동기화

웹소켓 서버는 클라이언트 상태를 메모리에 저장하는 경우가 많습니다. 이를 확장하려면 상태를 공유하는 방법이 필요합니다.

1) 공유 상태 저장소

예: Redis Pub/Sub 활용

  1. 서버 간 메시지 브로드캐스트:
import { createClient } from 'redis';

const redis = createClient();
redis.connect();

const CHANNEL = 'broadcast';

redis.on('message', (channel, message) => {
  if (channel === CHANNEL) {
    console.log(`Received: ${message}`);
    // 브로드캐스트된 메시지 처리
  }
});

function broadcastMessage(message: string) {
  redis.publish(CHANNEL, message);
}