Высокопроизводительные счетчики в Cloud Spanner - PullRequest
2 голосов
/ 19 марта 2019

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

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

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

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

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

2 голосов
/ 19 марта 2019

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

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

  1. Пакетных обновлений вместе.
  2. Быстрое чтение / счет.

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

...