Apache Cassandra · Cassandra 5.0.9
Discord хранит сообщения в партициях (channel_id, bucket): бакет — окно примерно в 10 дней, чтобы партиция оставалась меньше 100 МБ. Внутри партиции строки отсортированы по message_id по убыванию, а message_id — Snowflake, он растёт со временем.
Пользователь открыл канал 1007, бакет 412, и прокрутил ленту вверх. Самое старое сообщение на экране — 9005. Клиент просит ещё три сообщения, которые старше него, от новых к старым: message_id, author_id, content.
Какой запрос это делает и читает ровно одну партицию?
В работе: Бесконечная прокрутка истории в чате: каждый запрос — одна партиция и срез по ключу кластеризации.
Источник: Discord Engineering: как Discord хранит миллиарды сообщений, 2017. Условие пересказано своими словами.
Какой запрос вернёт три сообщения старше 9005 в канале 1007, бакет 412, от новых к старым?
- Строгий срез по ключу кластеризации в одной партиции
- Срез с <= — чтобы точно ничего не потерять
- Явно отсортировать по возрастанию и взять три
- Не указывать бакет: пусть Cassandra сама найдёт по каналу