멀티 유저 채팅방 구현
websocket(필수): 실시간 양방향 통신 필요
보조 도구 필요성 (다중 서버일 경우를 전재)
스케일링: 단일 소켓서버에 많은 채팅 참여가 연결 시 리소스 부족해짐
메시지 동기화: 여러 웹 소켓 서버 존재 시 한 서버에서 발생한 메시지를 다른 서버에 연결된 클라이언트와 동기화 해야함
서버 수평 확장 시 : 2개 서버로 같은 라이브 방송 진행 시 1번 서버에 연결된 사용자와 2번 서버에 연결된 사용자를 연결
특징 | Redis Pub/Sub | Redis Streams | Kafka | RabbitMQ | Firebase Realtime Database |
실시간 메시지 전송 | 빠름 | 빠름 | 빠름 | 빠름 | 빠름 |
메시지 보존 | 없음 | 있음 (로그 형태로 저장) | 있음 (로그 기반 저장) | 있음 (큐에 저장) | 있음 (클라우드에 저장) |
확장성 | 클러스터로 확장 가능 | 클러스터로 확장 가능 | 매우 뛰어남 (분산 환경에 최적화) | 큐 분할 및 클러스터 확장 가능 | 서버리스로 확장 가능 처리량 |
처리량 | 고성능 (메모리 기반) | 고성능 (메모리 기반) | 초대규모 처리 가능 | 높은 처리량 | 상대적으로 낮음 (중소규모 적합) |
복잡도 | 단순 (쉬운 설정) | 비교적 단순 | 복잡 (운영 및 설정이 까다로움) | 중간 (큐와 라우팅 설정 필요) | 매우 단순 (서버리스) |
영구 저장 필요 여부 | 별도의 저장소 필요 | 기본 제공 | 기본 제공 | 기본 제공 | 클라우드 저장 |
사용 사례 | 중소규모 실시간 채팅 (메시지 유실 가능성 때문, 대규모 사용자들의 연결상태를 유지하지 못하면 메시지가 유실된다함) |
중소규모 실시간 채팅 + 메시지 기록 필요 | 대규모 스트리밍 데이터 | 안정성과 메시지 전달이 중요한 환경 | 소규모/중소규모 실시간 애플리케이션 |
가용 사용자 수 | 수천~수만 | 수천~수만 | 수십만 | 수십만 | 수백 |
채팅 내역을 저장하는 경우)(유튜브, 트위치)
- 법적, 규제적인 이유로 채팅 내역을 일정기간 보관함
- 사용자 제제를 위해 저장 필요
채팅 내역을 저장하지 않는 경우(인스타 라방)
- 프라이버시와 기술적 단순성 강조, 비용 절감
단일 인스턴스로 배포한 서버에서 라이브 채팅방 구현 시: 웹 소켓으로 충분
사용자수 증가로 인한 로드밸런싱 고려시: 웹 소켓 +redis pubsub 고려