Войти Регистрация
Data base

165. Ключ для 600 млрд сообщений: что делать с огромными чатами

Средняя

Apache Cassandra · Apache Cassandra 5.0

В Одноклассниках сообщения лежат в Cassandra: ключ партиции — chatId, ключ кластеризации — id сообщения. По данным команды ОК, это около 600 млрд сообщений в 5 млрд чатов, 100 ТБ без учёта реплик, 120 тыс. чтений и 8 тыс. записей в секунду.

Большинство чатов — переписка двух-трёх человек. Но в 2026 году продукт запустил чаты сообществ на десятки тысяч участников. Один такой чат из Казани набирает 40 тыс. сообщений в день по 1 КБ, через полгода партиция весит около 7 ГБ, компакция узла не успевает, чтение ленты чата тормозит.

Как изменить первичный ключ, чтобы партиции оставались умеренными, а чтение «последние 50 сообщений» по-прежнему шло в одну-две партиции?

В работе: Проектирование ключа для чатов и лент, где распределение размеров групп с длинным хвостом.

Как проверяем Движка Apache Cassandra в браузере пока нет, поэтому здесь не запрос, а выбор решения. Выберите один вариант. После ответа — почему каждый вариант верный или нет. Ответ один на подход: после него показываем разбор.
ключ партициибольшие партициибакеты по времени

Источник: Блог ОК на Хабре: stateful-микросервисы и сообщения на Cassandra, 2020. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.

Какой первичный ключ выбрать для таблицы сообщений?

  • PRIMARY KEY ((chat_id, bucket), msg_id), где bucket — номер недели или месяца из времени сообщения
  • PRIMARY KEY (msg_id) — каждое сообщение в своей партиции
  • Оставить PRIMARY KEY (chat_id, msg_id) и поставить вторичный индекс на chat_id
  • PRIMARY KEY ((chat_id, author), msg_id)