Discord, 수조 개 메시지 인덱싱 아키텍처 혁신: 셀 기반 Elasticsearch와 Pub/Sub 시스템 도입
🤖 AI 추천
Discord의 대규모 메시지 시스템 아키텍처 개선 경험은 메시지 처리량, 안정성, 확장성을 고민하는 백엔드 개발자, 데이터 엔지니어, DevOps 엔지니어에게 실질적인 인사이트를 제공합니다. 특히 Elasticsearch를 활용한 분산 시스템 설계, Kafka와 유사한 Pub/Sub 시스템의 메시지 유실 방지 기법, 쿠버네티스를 활용한 인프라 관리 자동화 등에 관심 있는 개발자라면 큰 도움을 받을 수 있습니다.
🔖 주요 키워드

핵심 기술
Discord는 수조 개의 메시지를 효율적으로 저장하고 검색하기 위해 기존의 단일 대규모 Elasticsearch 클러스터 아키텍처에서 발생하는 문제점(메시지 유실, 노드 장애 취약성, 관리 부담, Lucene 문서 제한)을 극복하고자 셀(Cell) 기반의 다중 Elasticsearch 클러스터 아키텍처와 Pub/Sub 시스템을 도입했습니다. 이는 시스템의 확장성, 안정성, 관리 용이성을 크게 향상시켰습니다.
기술적 세부사항
- 기존 아키텍처의 문제점: Redis 기반 메시지 큐 과부하로 인한 메시지 유실, Elasticsearch 노드 장애 시 높은 작업 실패율(약 40%), 대규모 클러스터(200+ 노드) 관리 복잡성, 롤링 재시작/업그레이드 어려움, Lucene의 20억 문서 제한 도달.
- 새로운 아키텍처 구성:
- Pub/Sub 시스템: Redis 큐를 대체하여 보장된 메시지 전달, 대규모 백로그 처리 능력 향상, 장애 복원력 증대.
- 메시지 라우터: Pub/Sub에서 스트리밍되는 메시지를 목적지별(Guild, DM, BFG)로 그룹화하고, Rust의
tokio
와 채널을 사용하여 병렬 처리 및 배치 인덱싱으로 성능 향상. - 셀(Cell) 아키텍처: 여러 개의 작은 Elasticsearch 클러스터를 논리적으로 그룹화.
- Guild 셀: 서버별 메시지 저장/검색, Guild ID 기준 샤딩, 단일 샤드 인덱스 사용.
- DM 셀: 개인 메시지 저장/검색, 사용자 ID 기준 샤딩, 이중 인덱싱(양쪽 사용자 저장).
- BFG 셀: 초대형 서버 메시지 처리, 다중 샤드 인덱스 사용 (Lucene 제한 극복).
- 쿠버네티스 기반 운영:
- ECK(Elasticsearch Kubernetes Operator)를 통한 클러스터 관리 자동화 (선언적 구성, 자동 업그레이드).
- Horizontal Pod Autoscaler(HPA) 및 클러스터 Autoscaler를 활용한 자동 확장/축소.
- 노드 장애 감지 시 Pod 재스케줄링 및 데이터 복구를 통한 자동 복구 및 무중단 업데이트.
- Elasticsearch 분산 기능 활용:
- 샤딩: 데이터를 수평적으로 분할 (일반 서버: 단일 샤드, BFG: 다중 샤드).
- 복제: 데이터 안정성 및 가용성을 위한 복제본 전략 (영역별 가용성 고려).
- 동시성 제어: 낙관적 동시성 제어(버전 관리)를 통해 동시 작업 처리.
개발 임팩트
- 성능 향상: 메시지 인덱싱 처리량 2배 증가, 평균 쿼리 응답 시간 500ms에서 100ms 미만으로 감소, P99 응답 시간 1초에서 500ms 미만으로 감소.
- 확장성: 수조 개 메시지 인덱싱 및 40+ Elasticsearch 클러스터, 수천 개의 인덱스 운영 가능.
- 안정성: 노드 장애 시 작업 실패율 최소화, 무중단 업그레이드.
- 관리 효율성: 쿠버네티스를 통한 인프라 관리 자동화.
- BFG 지원 개선: 대규모 서버의 메시지 제한 문제 해결.
핵심 교훈
- 대규모 단일 클러스터보다 여러 개의 작은 클러스터(셀)가 더 안정적입니다.
- Pub/Sub 시스템은 메시지 유실 방지에 필수적입니다.
- 목적별 데이터 분리(셀 아키텍처)는 특화된 최적화를 가능하게 합니다.
- 쿠버네티스를 통한 인프라 자동화는 대규모 시스템 관리를 단순화합니다.
- Elasticsearch의 분산 기능을 활용하면 거의 무제한의 확장성을 얻을 수 있습니다.
📚 관련 자료
elasticsearch/elasticsearch
Elasticsearch의 핵심 저장소로, 분산 시스템으로서의 샤딩, 복제, 노드 관리, 인덱싱 및 검색 기능 구현에 대한 깊이 있는 이해를 제공합니다. Discord 아키텍처의 근간이 되는 기술입니다.
관련도: 95%
kubernetes/community
Kubernetes 커뮤니티의 다양한 프로젝트 및 표준을 다루는 저장소입니다. 특히 ECK (Elasticsearch Kubernetes Operator)와 같은 커스텀 리소스 및 운영 관리에 대한 접근 방식을 이해하는 데 도움이 됩니다.
관련도: 70%
tokio-rs/tokio
Rust의 비동기 런타임 라이브러리로, Discord의 메시지 라우터에서 병렬 처리와 효율적인 비동기 I/O를 구현하는 데 사용된 핵심 기술입니다. Rust 기반의 고성능 분산 시스템 개발에 대한 이해를 높여줍니다.
관련도: 80%