Потоковые запросы

Потоковый запрос — это тип запроса, предназначенный для непрерывной обработки неограниченного потока данных (stream processing). В отличие от обычных запросов, потоковый запрос не завершается после получения результата, а работает постоянно, обрабатывая данные по мере их поступления.

Потоковая обработка данных — широко применяемый подход, реализованный в таких системах, как Apache Flink, Apache Kafka Streams, Amazon Kinesis Data Analytics. Типичные сценарии применения — мониторинг и алертинг, агрегация метрик по временным окнам, трансформация и фильтрация событий на лету, обогащение событий данными из справочников, поиск паттернов в последовательностях событий.

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

Отличия от обычных запросов

Обычные запросы работают с данными, которые уже сохранены в таблицах. Запрос выполняется, возвращает результат и завершается. Потоковый запрос создается и продолжает работу бесконечно до явной отмены пользователем. Данные непрерывно поступают в топик, «протекают» через запрос и записываются в приёмник — другой топик или таблицу.

Характеристика Обычные запросы Потоковые запросы
Данные Конечный набор в таблицах Бесконечный поток событий
Время жизни Завершается после обработки Работает непрерывно
Результат Доступен после завершения Обновляется по мере поступления данных
Восстановление при сбоях Перезапуск вручную Автоматическое восстановление из чекпоинта

Источники и приёмники данных

Потоковые запросы читают данные из топиков YDB и записывают результаты в топики или таблицы YDB. Данные в топик могут поступать из внешних систем (например, приложение записывает события через SDK), но сам потоковый запрос работает только с сущностями YDB. Прямое чтение из внешних систем, например из Apache Kafka, или запись в таблицы других баз данных, таких как PostgreSQL, не поддерживается.

Источники

Топики — основной источник потоковых данных. Запрос читает сообщения из одного или нескольких топиков и обрабатывает их по мере поступления. Данные в топик могут записывать:

  • Внешние приложения — через YDB SDK или Kafka API. Например, сервис отправляет события телеметрии или логи в топик YDB, а потоковый запрос обрабатывает их.
  • CDC (Change Data Capture) — потоки изменений из таблиц, реализуемые через встроенные топики. Позволяют реагировать на вставки, обновления и удаления записей в реальном времени. Подробнее: Change Data Capture (CDC).

Приёмники

Топики — для передачи результатов другим системам или следующим этапам обработки.

Таблицы — для материализации результатов. Данные сохраняются через UPSERT и доступны для обычных SQL-запросов.

Гарантии

В штатном режиме работы потоковые запросы обеспечивают гарантию доставки данных at-least-once — при сбоях запрос автоматически восстанавливается из чекпоинта и возобновляет чтение с сохранённых смещений.

При этом важно учитывать ограничения текущей реализации:

  • Сброс смещений при пересоздании запроса: изменение текста запроса через DROP + CREATE приводит к удалению чекпоинта. Новый запрос начинает чтение с конца топика, пропуская события, поступившие в интервале между удалением старой версии и стартом новой.
  • Неполнота агрегатов из-за отсутствия watermarks: из-за отсутствия механизма watermarks временные окна закрываются по системному времени (wall-clock). События, поступившие с задержкой (например, из-за медленных партиций или сетевых лагов), не попадают в агрегаты уже закрытых окон.

Подробное описание гарантий, аномалий и способов их минимизации — в разделе Гарантии доставки данных.

Примечание

Мы постоянно работаем над развитием механизмов потоковой обработки. В будущих версиях предоставляемые гарантии будут улучшены.

Ограничения

Важно

  • Запрос должен содержать хотя бы одно чтение из топика, так как потоковая обработка требует наличия непрерывного входного потока данных.
  • Не поддерживается JOIN двух потоков (временное архитектурное ограничение).
  • Не поддерживается обогащение из таблиц YDB — потоковые запросы могут использовать только внешние таблицы S3 для обогащения данными (поддержка обогащения из таблиц YDB планируется к реализации в версии 26.1).
  • Не поддерживается чтение и запись локальных топиков — для работы с ними необходимо использовать внешние источники данных, указывающие на текущую базу данных (ограничение планируется снять в версии 26.1).

Для работы с локальными топиками нужно использовать внешние источники данных:

Также не поддерживаются в текущей версии:

  • Признак важного читателя для потребителей, используемых потоковыми запросами.
  • Автопартиционирование (split/merge партиций) топиков, используемых потоковыми запросами. При увеличении числа партиций в топике, из которого читает работающий потоковый запрос, новые партиции не будут обрабатываться.
  • Изменение текста работающего запроса. Чтобы изменить запрос, его нужно пересоздать — удалить с помощью DROP STREAMING QUERY и создать заново с помощью CREATE STREAMING QUERY.

Управление

Потоковые запросы создаются, изменяются и удаляются с помощью YQL-команд:

Состояние запросов доступно в системной таблице .sys/streaming_queries.

Язык запросов

Потоковые запросы пишутся на YQL и поддерживают привычные SQL-конструкции: SELECT, WHERE, GROUP BY, JOIN. Для работы с временными окнами используется GROUP BY HOP.

См. также

Предыдущая
Следующая