상태 없는 HTTP 는 서버만 더하면 되지만 WebSocket 은 달라
HTTP API 는 동일한 서버를 라운드 로빈 부하 분산기 뒤에 더해 확장할 수 있어. 요청 하나가 처리기 안에서 완결되기 때문이야. WebSocket 연결은 오래 유지되므로 서버를 더하면 새 연결 용량은 늘지만 서로 다른 서버의 연결 사이에 메시지를 전달해 주지는 않아. 서버 사이 전체 전송에는 메시지 버스가 필요해.
표준 해법은 Redis Pub/Sub 이야
트랙 4 에서 배운 방식이지. 운영에서는 모든 WebSocket 서버가 나가는 메시지를 Redis 에 발행하고 구독해 받은 뒤 자기 로컬 연결에 펼쳐. 서버를 자유롭게 더하면 Redis 자체가 병목이 될 때까지 용량이 선형으로 늘어나. 아주 큰 규모에서는 Redis Cluster 나 Kafka 를 고려해.
Socket.IO 에는 어댑터가 들어 있어
Socket.IO 를 쓴다면 client_manager=socketio.AsyncRedisManager(...) 한 줄로 확장할 수 있어. 모든 sio.emit() 이 자동으로 서버 사이를 건너가므로 따로 작성할 Pub/Sub 코드는 0줄이야.