message-queue

1 개의 포스트

디스코드가 수조 개의 (새 탭에서 열림)

디스코드(Discord)는 수십억 개의 메시지를 효율적으로 검색하기 위해 엘라스틱서치(Elasticsearch)를 기반으로 한 고성능 검색 인프라를 구축했습니다. 초기 설계는 길드(서버)나 DM 단위로 데이터를 샤딩하여 쿼리 속도를 높이고 운영 관리를 용이하게 하는 데 집중했으며, 리소스를 절약하기 위해 지연 인덱싱(Lazy Indexing) 방식을 채택했습니다. 하지만 서비스가 급격히 성장함에 따라 초기 설계의 효율성보다는 대규모 확장성 측면에서 구조적인 한계가 나타나기 시작했습니다. **엘라스틱서치 기반의 샤딩 및 저장 구조** - 데이터의 논리적 네임스페이스인 인덱스를 두 개의 엘라스틱서치 클러스터에 분산 배치하여 관리했습니다. - 모든 메시지는 길드(Guild) 또는 DM ID를 기준으로 샤딩되어, 특정 그룹의 메시지가 동일한 인덱스에 저장되도록 설계했습니다. - 이러한 샤딩 전략은 관련 데이터를 한데 모아 쿼리 실행 속도를 최적화하고, 클러스터 규모를 제어 가능한 수준으로 유지하는 데 기여했습니다. **메시지 큐와 대량 인덱싱 처리** - 모든 사용자가 검색 기능을 사용하는 것이 아니라는 점에 착안하여, 메시지를 즉시 처리하지 않고 필요할 때 인덱싱하는 '지연 인덱싱' 방식을 도입했습니다. - 메시지 큐를 구축하여 워커(Worker)들이 메시지 덩어리(Chunks)를 가져와 처리할 수 있도록 시스템을 구성했습니다. - 엘라스틱서치의 벌크 인덱싱(Bulk-indexing) 기능을 활용하여 대량의 메시지를 한 번에 처리함으로써 인덱싱 효율을 극대화했습니다. 초기 설계 단계에서 데이터 응집도와 리소스 효율성을 고려한 샤딩 및 인덱싱 전략은 시스템의 성능과 비용 효율성을 잡는 데 효과적입니다. 그러나 서비스의 성장에 따라 기존 아키텍처에서 발생하는 병목 현상을 미리 예측하고, 성능 저하가 시작되는 시점에 맞추어 인프라 고도화를 준비하는 과정이 필수적입니다.