Elasticsearch · Elasticsearch 8.19
Discord ищет по сообщениям в Elasticsearch. Сообщения сервера шардируются по guild_id: все сообщения сервера лежат в одном шарде, и поиск внутри сервера читает один шард.
Нужен ещё поиск сразу по всем личным сообщениям пользователя. Если раскладывать ЛС по каналу, переписки одного человека окажутся во всех шардах. Отдельная беда — самые большие серверы: у них в одном шарде копятся миллиарды сообщений.
В работе: Проектирование индексов и маршрутизации для поиска по сообщениям мессенджера.
Как проверяем
Движка Elasticsearch в браузере пока нет, поэтому здесь не запрос, а выбор решения. Выберите один вариант. После ответа — почему каждый вариант верный или нет. Ответ один на подход: после него показываем разбор.
Источник: Discord Engineering: как Discord индексирует триллионы сообщений, 2025. Условие пересказано своими словами.
Давали на собеседовании?
Как разложить документы, чтобы и поиск по серверу, и поиск по всем ЛС пользователя читали один шард?
- Сообщения серверов — в индексах с routing=guild_id; ЛС — в отдельных индексах с routing=user_id, каждое ЛС индексируется по разу на каждого участника
- Один индекс, routing по умолчанию (по _id сообщения)
- ЛС оставить в общем индексе с routing=channel_id, а поиск по всем ЛС делать без routing
- Большой сервер оставить в одном шарде и просто дать ему отдельный мощный узел