Discord раскрыл секрет индексации триллионов сообщений на платформе — Tproger

0
16

Discord раскрыл, как масштабировал поиск на триллионы сообщений: отказ от монолита, новые кластеры, PubSub и 5-кратное снижение задержек

Discord поделился историей масштабного обновления своей системы поиска, которая теперь справляется с триллионами сообщений.

Компания рассказала, как отказалась от монолитных Elasticsearch-кластеров, переписала архитектуру индексации и смогла не только удвоить пропускную способность, но и снизить задержки запросов в пять раз.

Как все ломалось

Изначально поиск в Discord строился на двух Elasticsearch-кластерах, где сообщения шардировались по серверам (гильдиям) и личным сообщениям. Работало неплохо, пока объем данных не стал рушить все вокруг.

Redis-очередь теряла сообщения при сбоях, кластер из 200+ узлов сыпался от малейшего отказа, а обновление ПО превращалось в квест с полной остановкой сервиса.

Особые проблемы были с большими серверами: Lucene не умеет обрабатывать более 2 млрд документов на один индекс и единственным «решением» было… удалять спам-гильдии.

Новый подход: кластеры в «ячейках»

Discord ушел от гигантских кластеров в сторону так называемых «ячеек» — наборов небольших Elasticsearch-кластеров, управляемых через Kubernetes.

Какие есть паттерны в React и для чего они нужны: часть 2tproger.ru

Читать также:
В сеть утекло фото коробки NVIDIA RTX 5080. Что известно о модели за пару недель до анонса? — Tproger

Каждая ячейка обслуживает определенную категорию данных: отдельные кластеры теперь хранят только сообщения из ЛС, другие — сообщения по серверам.

Это позволило безопасно делать rolling-restart, обновлять Elasticsearch, масштабировать нагрузку и сохранять отказоустойчивость даже при падении отдельных узлов.

Для больших гильдий (внутри Discord их зовут BFG — Big Freaking Guilds) выделяются отдельные индексы с несколькими шардами для повышения производительности.

Очередь PubSub и умная маршрутизация

Redis-очередь заменила PubSub — теперь ни одно сообщение не теряется. Для индексации сообщений Discord внедрил свой роутер, который собирает батчи сообщений, сгруппированных по конечному кластеру и индексу. Так массовые операции больше не рассыпаются из-за падения одного из узлов.

Результат: всё быстрее, стабильнее и масштабируемо

После внедрения новой архитектуры:

  • индексируются триллионы сообщений в 2 раза быстрее прежнего;
  • задержка поиска снизилась с 500 до <100 мс (p50) и с 1 с до <500 мс (p99);
  • работают 40 кластеров с тысячами индексов;
  • все обновления проходят без остановки сервиса.

И главное — теперь можно искать сообщения в личке сразу по всем чатам, а не только по отдельным диалогам.