Learning Platform
Глоссарий Troubleshooting
Урок 04.07 · 25 мин
Продвинутый
StreamingSchema RegistryKafkaStreaming LineageCDC

Streaming Data Governance

Введение

В пакетном мире метаданные обновляются ежедневно. В streaming мире — ежесекундно.

Сценарий: FinSecure Bank (ФинСекьюр Банк)

FinSecure обрабатывает платежи через 200+ Kafka-топиков. 50+ consumer groups потребляют данные в реальном времени. На прошлой неделе producer-команда платежного шлюза изменила схему payment_events: поле amount стало строкой вместо числа. 12 consumer-сервисов упали с ошибками десериализации. Причина: никто не управлял совместимостью схем.

Streaming governance — это governance метаданных, качества и доступа в потоковых системах. В отличие от batch-governance, здесь всё происходит в реальном времени: схемы эволюционируют при каждом деплое, потребители подключаются динамически, lineage охватывает десятки микросервисов.

В этом уроке мы рассмотрим governance schema registry, streaming quality enforcement, topic governance, streaming lineage и CDC governance. Предварительно рекомендуем повторить урок 04 (Data Lineage) этого модуля.

Schema Registry Governance

Apache Kafka Schema Registryv7.x2026-03

Модель владения схемами

Schema Registry (реестр схем) — централизованное хранилище Avro/Protobuf/JSON Schema для Kafka-топиков. Каждая схема определяет структуру событий: какие поля, какие типы, какие значения допустимы.

Governance начинается с владения: один топик — одна команда-владелец. Владелец schema отвечает за:

  • Определение и публикацию схемы
  • Review запросов на изменение от других команд
  • Управление совместимостью и deprecation

Правила эволюции схем

Schema Registry поддерживает четыре уровня совместимости:

УровеньОписаниеПримерРиск
BACKWARDНовая схема читает данные старойДобавление поля с defaultНизкий
FORWARDСтарые потребители читают новые данныеУдаление optional поляСредний
FULLBACKWARD + FORWARD одновременноТолько добавление optional полейМинимальный
NONEНикаких проверокЛюбое изменениеМаксимальный

Рекомендация для governance: FULL для production-топиков, BACKWARD для development.

Workflow изменения схемы

Producer хочет изменить схему
  -> Pull Request в schema-repo
    -> Automated compatibility check (CI)
      -> Review: Schema Owner + affected consumers
        -> Merge -> Schema Registry update
          -> Consumer teams notified

Deprecation процесс

Схема не удаляется сразу — устаревание через 3 фазы:

  1. DEPRECATED: схема помечена, новые потребители предупреждены
  2. SUNSET (90 дней): все потребители должны мигрировать
  3. REMOVED: схема удалена, топик может быть удалён

Сценарий: FinSecure

Producer-команда платежного шлюза изменила поле amount с integer на string. При BACKWARD compatibility Schema Registry отклонил бы это изменение: string не совместим с integer. Но compatibility был установлен в NONE. 12 consumer-сервисов десериализовали "1500.00" как число и получили исключения. Решение: (1) установить FULL compatibility для payment_events, (2) добавить CI-проверку совместимости в pipeline PR, (3) создать consumer registry для нотификации.

Stream Quality Enforcement

В batch-системе качество проверяется после загрузки (dbt tests, Great Expectations). В streaming-системе качество должно проверяться на входе — до того, как невалидное событие попадёт в топик.

Три уровня валидации

# Трёхуровневая валидация streaming-событий
VALIDATION_LEVELS = {
    "schema": {
        "check": "Schema Registry валидация",
        "action": "Reject событие",
        "example": "Поле 'amount' отсутствует или неверный тип"
    },
    "business_rules": {
        "check": "Бизнес-правила на producer",
        "action": "Route в Dead Letter Queue (DLQ)",
        "example": "amount < 0, customer_id не найден в справочнике"
    },
    "statistical": {
        "check": "Anomaly detection на consumer",
        "action": "Алерт + logging",
        "example": "Среднее значение amount за 5 мин отклонилось на 3 sigma"
    }
}

Dead Letter Queue (DLQ) для quality failures

DLQ — специальный Kafka-топик для событий, не прошедших валидацию:

ProducerПлатёжный шлюз FinSecure: 10,000 events/sec
ValidatorПроверка: schema compliance, бизнес-правила, формат
payments_topicТолько события, прошедшие валидацию, попадают в основной топик
ValidatorСобытия, не прошедшие валидацию
payments_dlqНевалидные события: null customer_id, отрицательный amount, неизвестный currency
DLQ MonitorМониторинг DLQ rate: >1% от общего потока -- P2 incident

Сценарий: DataTech Solutions (ДатаТех Солюшенз)

DataTech планирует streaming-архитектуру для e-commerce событий. Команда задаёт вопрос: как строить quality с нуля? Ответ: (1) Schema Registry с FULL compatibility, (2) Producer-side validation для бизнес-правил, (3) DLQ для quality failures с мониторингом, (4) Consumer-side statistical anomaly detection. Quality-first architecture дешевле, чем ретроактивное исправление.

Проверка знанийKnowledge check
FinSecure producer отправляет события с null customer_id в payments topic. Quality enforcement перенаправляет их в DLQ. Корректное ли это поведение?
ОтветAnswer
Да, это корректное поведение. customer_id -- обязательное поле для платёжных транзакций (связь с клиентом, compliance, audit trail). Событие без customer_id не должно попадать в основной топик, где его обработают downstream-сервисы. DLQ сохраняет событие для анализа: возможно, producer-сервис имеет баг (null вместо customer_id), или upstream-система вернула incomplete данные. Governance-процесс: DLQ-алерт -> producer-команда расследует -> fix -> reprocess из DLQ.

Kafka Topic Governance

Naming Convention

Без naming convention 200 топиков превращаются в неуправляемый хаос. Governance-стандарт для Kafka-топиков:

{domain}.{entity}.{event_type}

Примеры:
  payments.transaction.created      -- новая транзакция
  payments.transaction.completed    -- завершённая транзакция
  customers.profile.updated         -- обновление профиля
  risk.scoring.calculated           -- расчёт скоринга
  audit.access.logged               -- запись audit log

Почему domain-based, а не team-based:

Критерийteam.topicdomain.entity.event
РеорганизацияПереименование при смене командСтабильно
Поиск в каталогеПо команде (кто?)По домену (что?)
Access policiesPer-team ACLPer-domain ACL
МасштабированиеКонфликты при росте командДомены стабильны
Kafka Topic Governance Policy

Partition Strategy Governance

Partition key определяет распределение данных по партициям. Неправильный ключ создаёт hotspots (одна партиция перегружена):

  • customer_id — равномерно для FinSecure (1M+ клиентов)
  • country_code — hotspot (90% трафика — Россия)
  • timestamp — один partition получает весь текущий трафик

Governance-решение: Data Owner утверждает partition key при создании топика.

Topic ACL Governance

FinSecure: Kafka Topic ACL Matrix
payments.transaction.*risk.scoring.*audit.access.*customers.profile.*
Payment Gateway
Allow
Deny
Deny
Deny
Risk Engine
Deny
Allow
Deny
Deny
Fraud Detection
Allow
Allow
Deny
Deny
Analytics
Allow
Allow
Allow
Deny
Audit Service
Allow
Allow
Allow
Allow

Принцип: produce — only owner, consume — by approval. Payment Gateway производит в payments.transaction.*, но не может читать risk.scoring.*. Audit Service читает всё (audit mandate).

Streaming Lineage

Отличие от Batch Lineage

Batch lineage — это снимок (snapshot): таблица A -> dbt model -> таблица B. Streaming lineage — это непрерывный поток с динамическими участниками:

ХарактеристикаBatch LineageStreaming Lineage
ОбновлениеПосле каждого batch runНепрерывно
ПотребителиФиксированные (dbt models)Динамические (consumer groups)
GranularityTable/columnTopic/schema/field
Discovererdbt DAG, SQL parsingConsumer Group API, Schema Registry
СложностьОдин путь (pipeline)Множество путей (fan-out через topics)

Streaming Lineage Graph

PostgreSQL (CDC)Debezium CDC connector: каждый INSERT/UPDATE -> Kafka event
cdc.transactionsRaw CDC events: schema из Schema Registry, AVRO format
Enrichment ServiceОбогащение: join с customer data, risk scoring, currency conversion
payments.enrichedEnriched events: transaction + customer + risk score
payments.enrichedFan-out: 4 consumer groups читают этот топик
Analytics (consumer-group-1)Загрузка в ClickHouse для дашбордов
payments.enrichedFan-out: consumer group 2
Fraud Detection (consumer-group-2)Real-time fraud scoring: если score > 0.8 -- блокировка

Streaming lineage показывает: PostgreSQL -> Debezium CDC -> Kafka topic -> Enrichment -> Kafka topic -> 4 consumer groups. Изменение schema в cdc.transactions требует impact analysis на все downstream топики и consumer groups.

Для подробного разбора batch lineage и impact analysis повторите урок 04 этого модуля (Data Lineage и Impact Analysis).

Event-Driven Governance

Governance Events

Вместо периодического аудита (“раз в квартал проверяем соответствие”) — governance реагирует на события в реальном времени:

# Governance events и автоматические реакции
GOVERNANCE_EVENTS = {
    "topic_created": {
        "check": "Naming convention compliance",
        "action": "Block if non-compliant, alert Governance team"
    },
    "schema_changed": {
        "check": "Compatibility validation",
        "action": "Block if incompatible, notify consumer teams"
    },
    "consumer_added": {
        "check": "ACL verification",
        "action": "Verify consumer has approved access, audit log"
    },
    "dlq_threshold_exceeded": {
        "check": "DLQ rate > 1% of total",
        "action": "P2 incident, notify producer team"
    },
    "retention_expired": {
        "check": "Data past retention policy",
        "action": "Archive or dispose per policy"
    }
}

От периодического аудита к Real-Time Governance

АспектПериодический аудитEvent-Driven Governance
ЧастотаКвартальноНепрерывно
РеакцияНеделиСекунды
CoverageВыборочный100% событий
СтоимостьВысокая (ручной труд)Низкая (автоматизация)
БлокировкаНевозможна (постфактум)Возможна (превентивно)
Проверка знанийKnowledge check
DataTech создаёт новый Kafka topic без проверки naming convention. Какой event-driven governance механизм предотвратит это?
ОтветAnswer
Topic creation webhook: при вызове AdminClient.createTopics() автоматически срабатывает governance-проверка naming convention ({domain}.{entity}.{event_type}). Если имя не соответствует паттерну -- creation блокируется, алертится Governance team. Реализация: (1) Custom authorizer в Kafka (AclAuthorizer + naming check), или (2) GitOps-подход: топики создаются только через PR в topic-registry repo с CI-проверкой naming. Ручное создание через CLI запрещено RBAC-политикой.

CDC Governance

Debeziumv2.x2026-03

Debezium Connector Governance

Debezium превращает базу данных в event stream: каждый INSERT, UPDATE, DELETE в PostgreSQL/Oracle становится Kafka-событием. Это создаёт уникальные governance-требования:

Connector Configuration Ownership:

  • Каждый connector имеет владельца (обычно — Data Engineering team)
  • Конфигурация хранится в Git (Infrastructure as Code)
  • Изменения — через PR с review

Change Event Schema Management:

  • Debezium автоматически генерирует schema из DDL таблицы
  • ALTER TABLE -> новая schema version в Schema Registry
  • Governance: уведомление consumer teams при schema изменении

Consistency Guarantees:

  • Debezium обеспечивает at-least-once delivery (дубликаты возможны)
  • Consumer teams должны реализовать идемпотентность
  • Governance-решение: документировать guarantees в Data Contract

Подробнее о CDC-паттернах и Debezium connector architecture: Debezium ETL/ELT Patterns

Итоги

  • Schema Registry Governance: ownership (одна команда на схему), compatibility levels (FULL для production), deprecation process (90-day sunset)
  • Stream Quality Enforcement: трёхуровневая валидация (schema, business rules, statistical), DLQ для quality failures
  • Kafka Topic Governance: naming convention (domain.entity.event), partition strategy, ACL matrix
  • Streaming Lineage: непрерывный (не snapshot), динамические потребители, schema-level tracking
  • Event-Driven Governance: от периодического аудита к real-time реакции на governance events
  • CDC Governance (Debezium): connector ownership, change event schema management, at-least-once delivery

Это завершает модуль M03: Метаданные и Каталоги Данных. Вы изучили: типы метаданных, бизнес-глоссарий, архитектуру каталога, Data Lineage, стандарты метаданных, автоматическую классификацию и streaming governance. В следующем модуле мы перейдём к M04: Качество Данных и Observability.

Проверьте понимание

Результат: 0 из 0
Аналитический
Вопрос 1 из 5. FinSecure использует BACKWARD compatibility на payments topic. Producer хочет переименовать поле `amount` в `transaction_amount`. Это breaking change. Каков правильный путь миграции?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 7