웹소켓은 클라이언트와 서버 간에 지속 연결 상태를 유지하므로, 수평 확장 시 각 서버에 클라이언트 연결이 분산됩니다. 이를 해결하기 위해 서버 간 상태를 동기화하거나 클라이언트가 특정 서버에 고정되도록 설정해야 합니다.
수평 확장을 위해 로드 밸런서를 설정합니다.
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;
}
}
}
웹소켓 서버는 클라이언트 상태를 메모리에 저장하는 경우가 많습니다. 이를 확장하려면 상태를 공유하는 방법이 필요합니다.
예: Redis Pub/Sub 활용
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);
}