Scaling real-time — via Redis adapter, not in-memory
Use a Redis adapter so WebSocket and SSE events reach clients on any app instance.
nestjs-realtime-transport-redis-adapter-scaling
Why it matters
| Stake | If ignored |
|---|---|
| Can't scale |
|
How to fix
The moment you have more than one server instance, you can't keep connections in process memory. Redis (or similar) is the broker that fans events between instances. After wiring, server.to(roomId).emit(...) reaches every instance and every user in the room.
For SSE resumable streams, the same Redis (or similar) broker lets instance B serve a GET .../stream resume when instance A handled the original POST /stream. That satisfies this rule for cross-instance relay — it does not require keeping the LLM alive after disconnect. Relay + abort-on-idle is valid.
Examples
ts
const ioAdapter = new IoAdapter(app);
app.useWebSocketAdapter(ioAdapter);ts
// apps/api/src/main.ts
import { IoAdapter } from '@nestjs/platform-socket.io';
import { createAdapter } from '@socket.io/redis-adapter';
const app = await NestFactory.create(AppModule);
const pubClient = new Redis(config.REDIS_URL);
const subClient = pubClient.duplicate();
const ioAdapter = new IoAdapter(app);
(ioAdapter as any).createIOServer = (port: number, options: any) => {
const server = new Server(port, options);
server.adapter(createAdapter(pubClient, subClient));
return server;
};
app.useWebSocketAdapter(ioAdapter);