Apache Cassandra · Apache Cassandra 5.0
В Одноклассниках сообщения лежат в Cassandra: ключ партиции — chatId, ключ кластеризации — id сообщения. По данным команды ОК, это около 600 млрд сообщений в 5 млрд чатов, 100 ТБ без учёта реплик, 120 тыс. чтений и 8 тыс. записей в секунду.
Большинство чатов — переписка двух-трёх человек. Но в 2026 году продукт запустил чаты сообществ на десятки тысяч участников. Один такой чат из Казани набирает 40 тыс. сообщений в день по 1 КБ, через полгода партиция весит около 7 ГБ, компакция узла не успевает, чтение ленты чата тормозит.
Как изменить первичный ключ, чтобы партиции оставались умеренными, а чтение «последние 50 сообщений» по-прежнему шло в одну-две партиции?
В работе: Проектирование ключа для чатов и лент, где распределение размеров групп с длинным хвостом.
Источник: Блог ОК на Хабре: 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)