Потоковые запросы
Потоковый запрос — это тип запроса, предназначенный для непрерывной обработки неограниченного потока данных (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).
Для работы с локальными топиками нужно использовать внешние источники данных:
- Создайте внешний источник данных, указывающий на ту же или другую базу данных YDB, и обращайтесь к топикам через них.
Также не поддерживаются в текущей версии:
- Признак важного читателя для потребителей, используемых потоковыми запросами.
- Автопартиционирование (split/merge партиций) топиков, используемых потоковыми запросами. При увеличении числа партиций в топике, из которого читает работающий потоковый запрос, новые партиции не будут обрабатываться.
- Изменение текста работающего запроса. Чтобы изменить запрос, его нужно пересоздать — удалить с помощью DROP STREAMING QUERY и создать заново с помощью CREATE STREAMING QUERY.
Управление
Потоковые запросы создаются, изменяются и удаляются с помощью YQL-команд:
- CREATE STREAMING QUERY — создание;
- ALTER STREAMING QUERY — изменение и управление состоянием;
- DROP STREAMING QUERY — удаление.
Состояние запросов доступно в системной таблице .sys/streaming_queries.
Язык запросов
Потоковые запросы пишутся на YQL и поддерживают привычные SQL-конструкции: SELECT, WHERE, GROUP BY, JOIN. Для работы с временными окнами используется GROUP BY HOP.
См. также
- Гарантии доставки данных — гарантии, аномалии при оконной агрегации и рекомендации;
- Быстрый старт: чтение и запись в топики — пошаговое руководство;
- Форматы данных при чтении/записи из топиков — форматы данных.