Высокопроизводительные счетчики в Cloud Spanner

#google-cloud-bigtable #google-cloud-spanner

#google-облако-bigtable #google-облако-spanner

Вопрос:

Я хочу продолжать подсчитывать некоторые элементы, такие как лайки и комментарии к публикации. Скорость записи может быть высокой, например, 1 Тыс. лайков в секунду.

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

Я подумываю об использовании подхода с разделенными счетчиками, при котором конкретный счетчик (лайки за данный пост) состоит из N сегментов / строк. Увеличение счетчика увеличит значение столбца в одной строке сегмента, в то время как считывание счетчика будет считывать все строки сегмента и суммировать значения подсчета. Будут ли какие-либо проблемы при таком подходе с Spanner?

Я понимаю, что в Bigtable многократные обновления одной и той же строки приведут к созданию новых версий ячеек в строке, и в результате вы можете привести к превышению предельного размера строки. Поэтому использование строк в качестве разделенных счетчиков в Bigtable кажется плохой идеей. Есть ли у Spanner какие-либо подобные проблемы?

Комментарии:

1. Что касается большой таблицы, то у вас, вероятно, не возникнет проблем с размером строки, если у вас есть разумные политики GC , и вы можете обеспечить атомарную запись с помощью операций ReadModifyWrite Increment .

Ответ №1:

Я понимаю, что в Bigtable многократные обновления одной и той же строки приведут к созданию новых версий ячеек в строке, и в результате вы можете привести к превышению предельного размера строки. Поэтому использование строк в качестве разделенных счетчиков в Bigtable кажется плохой идеей. Есть ли у Spanner какие-либо подобные проблемы?

Как отмечалось в комментариях, вы могли бы использовать API приращения ReadModifyWrite с оговоркой, что операции со строковыми транзакциями, такие как ReadModifyWrite в Bigtable, выполняются медленнее.

Однако использование нескольких строк для представления одного счетчика, а затем совместное чтение строк с использованием сканирования префикса должно быть в порядке.

Ключевым моментом было бы использовать произвольные префиксы в ключе строки для распределения операций записи по узлам в вашем кластере и избежать «горячих точек».

Ответ №2:

Разделение счетчиков для улучшения параллелизма кажется хорошей идеей. Cloud Spanner управляет старыми версиями данных по-другому, чем BigTable, поэтому вы можете не придерживаться тех же ограничений. Spanner хранит старые версии в течение 1 часа. Однако вы можете захотеть позаботиться о разработке своей схемы, чтобы избежать горячих точек.

Однако я бы рекомендовал вам попробовать реализовать слой кэширования памяти поверх Spanner. Это может быть использовано для:

  1. Пакетируйте несколько обновлений вместе.
  2. Выполняйте быстрые чтения / подсчеты.

Возможны некоторые компромиссы в возможной потере некоторых обновлений, если кэш исчезнет, но это может быть приемлемо, если речь идет просто о кэшировании лайков / подсчетов.

Комментарии:

1. Спасибо! Да, мы планируем использовать уровень кэширования Redis для обеспечения быстрого чтения / подсчета. Мы также рассматривали возможность пакетной записи, хотя для нас это скорее продуктовое решение.