Bigtable имеет возможность Increment
значений.Более подробную информацию вы можете найти в документации protobuf .
Идемпотентность играет важную роль в понимании счетчиков в Bigtable.В Bigtable Put
обычно являются идемпотентными, что означает, что вы можете запускать их несколько раз и всегда получать один и тот же результат (a=2
будет давать один и тот же результат независимо от того, сколько раз вы его запускаете).Increment
s не являются идемпотентами, поскольку их многократный запуск приведет к разным результатам (a++
, a++
имеет результат, отличный от a++
, a++
, a++
).
TransientСбои могут или не может выполнить Increment
.Со стороны клиента никогда не ясно, будет ли Increment
успешным во время этих временных ошибок.
Эта функция Increment
сложна для построения в потоке данных из-за этой идемпотентности.У потока данных есть понятие «связки», которое представляет собой набор действий, которые действуют как единица работы.Эти пакеты повторяются для временных сбоев (вы можете узнать больше о повторных попытках сбоя потока данных здесь ).Поток данных обрабатывает этот «пакет» как единое целое, ошибка Cloud Bigtable должна обрабатывать каждый отдельный элемент «пакета» как отдельную транзакцию, поскольку Cloud Bigtable не поддерживает многострочные транзакции.
Учитывая несоответствие вОжидаемое поведение «комплектов», Cloud Bigtable не позволит вам запускать Increment
s через поток данных.
Опции, которые вы имеете, заслуживают большего количества документации, чем я могу предоставить здесь, но я могу предоставить некоторые варианты навысокий уровень:
Всегда используйте Put
для любого нового события, которое вы найдете, и суммируйте значения в чтениях.Вы также можете написать другое задание, которое выполняет периодическую очистку строк, создав «транзакцию», которая удаляет все текущие значения и записывает новую ячейку с суммой
Использование ОблакоФункции , которые прослушивают события Pub / Sub и выполняют Increment
s.Вот пример Cloud Bigtable с использованием облачных функций .Вы также можете выполнить Get
, выполнить сложение и CheckAndMutate
с помощью алгоритма, который вы описали в своем посте (я лично выбрал бы CheckAndMutate
для согласованности, если бы я выбрал этот вариант).
Используйте AbstractCloudBigtableTableDoFn
, чтобы написать свой DoFn
, который выполняет Increment
с или CheckAndMutate
, но с пониманием, что это может вызвать проблемы с целостностью данных.
Если система достаточно велика, вариант № 1 является наиболее надежным вариантом, но за счет сложности системы.Если вам не нужна такая сложность, вариант №2 - это ваша следующая лучшая ставка (хотя я бы выбрал CheckAndMutate
).Если вам не нужна целостность данных и вам нужна высокая пропускная способность (например, «подсчет страниц» или другая телеметрия, где допустимо ошибаться небольшую часть времени), тогда вариант № 3 будет вашим лучшим выбором.