Scaling WebSocket
Single server handles ~10K-100K WebSocket connections. Butuh lebih? Scale horizontally — multiple server instances dengan shared state.
Challenges
- Sticky sessions — WebSocket harus connect ke server yang sama selama sesi
- Cross-server messaging — User di server A harus bisa kirim ke user di server B
- Shared state — Online users, room membership harus consistent
Load Balancer Configuration
# Nginx: WebSocket upgrade + sticky sessions
upstream websocket {
ip_hash; # sticky sessions
server ws1:3000;
server ws2:3000;
server ws3:3000;
}
server {
location /socket.io/ {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
Redis Adapter (Socket.IO)
// Setiap server instance connect ke Redis
// io.emit() otomatis broadcast ke semua instances via Redis
import { createAdapter } from "@socket.io/redis-adapter";
io.adapter(createAdapter(pubClient, subClient));
// Architecture:
// LB → Server 1 (10K connections) → Redis ↔ Server 2 (10K connections)
// ↔ Server 3 (10K connections)
Connection Limits
# OS level: increase file descriptor limit
ulimit -n 100000
# Node.js: monitor connections
setInterval(() => {
const count = io.engine.clientsCount;
console.log(`Active connections: ${count}`);
metrics.gauge("websocket.connections", count);
}, 10000);
Scaling Strategies
- Vertical — Bigger server (quick fix, has ceiling)
- Horizontal + Redis — Multiple instances, Redis for coordination
- Sharding — Route by channel/room to specific server
- Edge deployment — WebSocket servers in multiple regions (Cloudflare Durable Objects)