# Данные в режиме, близком к реальному времени, в dbt

По своей архитектуре dbt ориентирован на пакетную обработку: у заданий есть определённое время начала и завершения. Но знаете ли вы, что dbt также позволяет получать данные в режиме, близком к реальному времени, если сочетать непрерывную загрузку в хранилище данных с частыми преобразованиями в dbt?

В этом руководстве рассматриваются несколько подходов к обеспечению актуальности данных в режиме, близком к реальному времени, с помощью dbt:

1. [Инкрементальные подходы](https://docs.getdbt.tech/best-practices/how-we-handle-real-time-data/2-incremental-patterns.md) — стратегии `merge`, отслеживание изменений данных (Change Data Capture, CDC) и микропакетная обработка
2. [Встроенные возможности хранилища](https://docs.getdbt.tech/best-practices/how-we-handle-real-time-data/3-warehouse-native-features.md) — когда использовать динамические таблицы и материализованные представления
3. [Подход с лямбда-представлениями](https://docs.getdbt.tech/best-practices/how-we-handle-real-time-data/4-lambda-views.md) — объединение пакетных данных и данных реального времени в одном представлении
4. [Подход только с представлениями](https://docs.getdbt.tech/best-practices/how-we-handle-real-time-data/5-views-only-pattern.md) - максимальная актуальность для простых преобразований
5. [Эксплуатационные аспекты](https://docs.getdbt.tech/best-practices/how-we-handle-real-time-data/6-operational-considerations.md) — сложности, риски и управление затратами

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

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

Эта серия посвящена актуальности данных (задержки в минутах, а не часах). Рекомендации по выбору между инкрементальными моделями и снимками для хранения истории изменений см. в разделе [CDC в dbt](https://docs.getdbt.tech/best-practices/how-we-handle-cdc/1-intro.md).

## Какую роль играет dbt?

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

* Режим, близкий к реальному времени (5–15 минут) — dbt отлично справляется с этой задачей и хорошо подходит для большинства операционных дашбордов.
* Настоящий режим реального времени (задержка менее секунды) — для этого нужны специализированные потоковые базы данных (ClickHouse, Materialize, Rockset и другие), работающие перед dbt или параллельно с ним; dbt по-прежнему отвечает за «аналитические» таблицы и историю, но не за чтение данных со сверхнизкой задержкой.

## Как dbt обеспечивает обработку данных в режиме, близком к реальному времени

Чтобы получать данные в реальном времени с помощью dbt, мы рекомендуем использовать двухуровневую архитектуру:

#### Уровень загрузки

Непрерывное поступление данных с использованием возможностей потоковой загрузки вашего хранилища данных.

Для этого хорошо подходят такие возможности потоковой загрузки, как [потоковые таблицы](https://docs.databricks.com/en/sql/load-data-streaming-table.html), [Snowpipe](https://docs.snowflake.com/en/user-guide/snowpipe-streaming/data-load-snowpipe-streaming-overview) или [Storage Write API](https://docs.cloud.google.com/bigquery/docs/write-api-streaming). Чтобы найти возможности потоковой загрузки для вашего хранилища, обратитесь к разделу [дополнительных ресурсов](https://docs.getdbt.tech/best-practices/how-we-handle-real-time-data/3-warehouse-native-features.md#resources-by-warehouse).

#### Уровень преобразований dbt

Запускайте dbt каждые несколько минут для преобразования данных, а для отчётности с минимальной задержкой используйте материализованные представления или динамические таблицы.

Конкретные подходы к преобразованию включают:

* [Инкрементальные модели](https://docs.getdbt.tech/docs/build/incremental-models-overview.md) со стратегиями merge или append
* [Микропакетную инкрементальную стратегию](https://docs.getdbt.tech/docs/build/incremental-microbatch.md) для больших таблиц временных рядов
* Задания с очень частым запуском по расписанию (например, каждые 5 минут)
* [Динамические таблицы](https://docs.getdbt.tech/reference/resource-configs/snowflake-configs.md#dynamic-tables) или [материализованные представления](https://docs.getdbt.tech/docs/build/materializations.md#materialized-view) с короткими интервалами обновления

## Основные рекомендации

Ниже приведены основные рекомендации, которые помогут вам обеспечить актуальность данных в режиме, близком к реальному времени, с помощью dbt:

* Загружайте данные непрерывно: используйте встроенные возможности потоковой или микропакетной загрузки вашего хранилища, чтобы сохранять исходные данные сразу по мере их поступления.
* Часто выполняйте преобразования с помощью dbt по расписанию: настройте запуск заданий dbt с частотой, соответствующей потребностям вашего бизнеса (например, каждые 1–15 минут). Соблюдайте баланс между актуальностью данных, затратами и ограничениями ресурсов.
* Материализованные представления и динамические таблицы: для отчётности с минимальной задержкой используйте материализованные представления или динамические таблицы. Их можно обновлять каждую минуту.
* Инкрементальные модели и микропакетная обработка: используйте инкрементальные модели dbt для обработки только новых или изменённых данных, чтобы преобразования оставались эффективными и масштабируемыми.
* Разделяйте загрузку и преобразование: поддерживайте раздельные потоки получения и преобразования данных. Это позволит оптимизировать каждый из них независимо.
* Отслеживайте и проверяйте актуальность данных: внедрите проверки качества данных и мониторинг их актуальности, чтобы ваши конвейеры обработки в режиме, близком к реальному времени, выдавали точные и актуальные результаты.
* Учитывайте затраты и сложность: более частый запуск заданий dbt увеличивает затраты на вычисления и усложняет эксплуатацию. Всегда сопоставляйте пользу для бизнеса с этими издержками.
