Чекпоинты

Чекпоинт — это сохранённое состояние работающего потокового запроса, необходимое для восстановления после сбоев обработки. YDB периодически сохраняет чекпоинты всех запущенных потоковых запросов.

Содержимое чекпоинта

Чекпоинт содержит:

  • смещения во входных топиках — позиции, до которых события были прочитаны и обработаны;
  • состояния агрегаций — промежуточные результаты операций, например накопленные значения в GROUP BY HOP.

YDB хранит смещения чтения в собственных чекпоинтах, а не полагается на смещения потребителя (consumer) во внешней системе. Это означает, что при удалении запроса (DROP STREAMING QUERY) смещения удаляются вместе с чекпоинтом — внешняя система не знает, до какого места запрос дочитал топик.

Восстановление после сбоя

При сбое обработки (перезапуск вычислительного узла, сетевой разрыв, таймаут) запрос автоматически перезапускается и восстанавливает состояние из последнего чекпоинта: возобновляет чтение с сохранённых смещений и восстанавливает состояния агрегаций.

События, поступившие между последним чекпоинтом и моментом сбоя, будут обработаны повторно. Это обеспечивает гарантию at-least-once — каждое событие будет обработано минимум один раз.

Сохранение и выбор чекпоинта для восстановления происходит автоматически. Старые чекпоинты удаляются после успешного сохранения нового.

Удаление чекпоинта при пересоздании запроса

При удалении запроса (DROP STREAMING QUERY) чекпоинт удаляется вместе с ним. Поскольку смещения хранятся только в чекпоинте, новый запрос (CREATE STREAMING QUERY) не имеет сохранённой позиции и начинает чтение с конца топика. Все события, поступившие в топик между удалением старого запроса и стартом нового, не будут прочитаны.

Аналогичная ситуация возникает, если данные, на которые указывает смещение в чекпоинте, уже удалены из топика по TTL.

Подробнее о влиянии этого поведения на гарантии доставки — в разделе Потеря событий при пересоздании запроса.

Отключение чекпоинтов

Для снижения накладных расходов можно отключить сохранение чекпоинтов с помощью прагмы ydb.DisableCheckpoints.

Важно

При отключении чекпоинтов отсутствуют гарантии консистентности данных при пользовательских или внутренних перезапусках запроса. Используйте исключительно для отладки.

CREATE STREAMING QUERY query_without_checkpoints AS
DO BEGIN

PRAGMA ydb.DisableCheckpoints = "TRUE";

INSERT INTO
    ydb_source.output_topic
SELECT
    *
FROM
    ydb_source.input_topic;

END DO

См. также