Change Data Capture (CDC) обеспечивает захват изменений строк таблицы YDB, формирует из них поток изменений (changefeed), записывает в распределенное хранилище и предоставляет доступ к этим записям для дальнейшей обработки. В качестве распределенного хранилища используется топик, который позволяет эффективно хранить лог изменений таблицы.
Когда в таблице добавляется, обновляется или удаляется строка, CDC формирует запись о произошедшем изменении с указанием первичного ключа строки и пишет ее в соответствующую данному ключу партицию топика.
Гарантии
Записи об изменении шардированы между партициями топика по первичному ключу.
Каждое изменение доставляется ровно один раз (exactly-once семантика).
Изменения по одному и тому же первичному ключу доставляются в том же порядке, в котором они происходили в таблице в одну и ту же партицию топика.
Ограничения
Количество партиций топика фиксируется на момент создания потока изменений и остается неизменным (топики, в отличие от таблиц, не являются эластичными).
В потоке изменений поддерживаются записи о следующих видах операций:
обновление;
удаление.
Таким образом, добавление строки является частным случаем обновления, и в потоке изменений запись о добавлении строки будет выглядеть аналогично записи об обновлении.
Виртуальные метки времени
Все изменения в таблицах YDB упорядочены в соответствии с порядком выполнения транзакций. Каждое изменение маркируется виртуальной меткой времени, являющейся кортежем из двух элементов:
Глобального времени координатора.
Уникального идентификатора транзакции.
Используя эти метки, можно упорядочить записи из разных партиций топика относительного друг друга или использовать их для фильтрации (например, чтобы исключить записи о старых изменениях).
Примечание
По умолчанию виртуальные метки времени не выгружаются в поток изменений. Для их включения используйте соответствующий параметр при создании потока.
Структура записи
В зависимости от параметров потока структура записи может отличаться.
key — массив значений компонент первичного ключа. Присутствует всегда.
update — признак обновления. Присутствует, если запись соответствует операции обновления. В режиме UPDATES так же содержит названия и значения изменившихся столбцов.
erase — признак удаления. Присутствует, если запись соответствует операции удаления.
newImage — снимок состояния строки, получившегося в результате изменения. Присутствует в режимах NEW_IMAGE и NEW_AND_OLD_IMAGES. Содержит названия и значения столбцов.
oldImage — снимок состояния строки, предшествовавшего изменению. Присутствует в режимах OLD_IMAGE и NEW_AND_OLD_IMAGES. Содержит названия и значения столбцов.
ts — виртуальная метка времени. Присутствует, если включена настройка VIRTUAL_TIMESTAMPS. Содержит значение глобального времени координатора (step) и уникальный идентификатор транзакции (txId).
Одна и та же запись не может содержать поля update и erase одновременно, так как эти поля являются признаками операции (невозможно одновременно обновить и удалить строку таблицы). Но каждая запись содержит одно из этих полей (любая операция является обновлением или удалением).
В режиме UPDATES для операций обновления поле update выполняет роль не только признака операции (обновление), но и содержит названия и значения изменившихся столбцов.
Поля JSON-объекта, содержащие названия и значения столбцов (newImage, oldImage и update в режиме UPDATES), не включают в себя столбцы, являющиеся компонентами первичного ключа.
Если в записи присутствует поле erase (то есть запись соответствует операции удаления), то это всегда пустой JSON-объект ({}).
Время хранения записей
По умолчанию записи хранятся в потоке изменений в течение 24 часов с момента отправки. В зависимости от сценариев использования время хранения можно уменьшить или увеличить до 30 дней.
Важно
Записи, время хранения которых истекло, удаляются вне зависимости от того, успели их обработать (прочитать) или нет.
Удаление записей до их обработки клиентом приводит к возникновению пропусков офсетов, то есть офсеты последней прочитанной из партиции записи и самой ранней из доступных будут отличаться более, чем на единицу.
Для настройки времени хранения записей укажите параметр RETENTION_PERIOD при создании потока изменений.
Создание и удаление потока изменений
Поток изменений может быть добавлен к существующей таблице или удален директивами ADD CHANGEFEED и DROP CHANGEFEED операции YQL ALTER TABLE. При удалении таблицы добавленный к ней поток изменений также будет удален.
Назначение и применение CDC
Об использовании CDC при разработке приложений смотрите в рекомендациях.