Перейти к содержанию

Case 06. Dynamic Airflow Data Platform

Практикум · Связанная теория · Редакционный стандарт

Тип материала — практический архитектурный кейс. HYPOTHETICAL — все численные параметры, сценарий и схемы. INFERENCE — выбор и критерии. UNKNOWN — фактическая производительность и параметры, которые предстоит согласовать.

1. Business problem

Оркестрировать независимые выгрузки с общей публикацией, повтором и изоляцией проблемного источника.

2. Functional requirements

Валидировать YAML, определить sources и cuts, выполнять mapped extraction, фиксировать результат, поддерживать selective backfill и replay.

3. Non-functional requirements

Уложиться в business close при bounded concurrency, fail isolation и reproducibility. Scheduler не хранит payloads и secrets.

4. Assumptions и вопросы заказчику

Assumption — 120 sources, по 8 chunks в daily run, 40 slots и 90 с на chunk. Спросить source connection limits, зависимые cuts, failure policy, XCom backend, SLA отдельных datasets и кто подтверждает completeness.

5. Оценка нагрузки и объёма данных

HYPOTHETICAL. Средняя скорость 350 events/s, пик 700 events/s, payload mean/p95/p99 2400/4000/8000 B. Перцентили заданы отдельно для тестового профиля, среднее используется для объёма. Суточный профиль упрощён до постоянного среднего, накладные расходы протокола, индексов и WAL исключены.

Метрика Формула и подстановка Результат
Объём событий 350 × 86 400 30240000 событий/сутки
Сырые данные 30240000 × 2400 B 72.576 GB/сутки
Retention без сжатия 72.576 GB × 7 суток 508.032 GB
Broker copies при RF=3 508.032 GB × 3 1524.096 GB, из них 1016.064 GB дополнительные копии
Producer bandwidth, среднее 350 × 2400 × 8 / 10⁶ 6.72 Mbit/s
Producer bandwidth, пик 700 × 2400 × 8 / 10⁶ 13.44 Mbit/s
Partitions при 30% headroom max(ceil(700 × 1,3 / 1 500), ceil(700 × 2400 × 1,3 / 1 800 000)) 2 partitions
Consumer parallelism ceil(700 × 1,3 / 1 500) 1 workers на группу при принятой производительности
Backfill одних суток при 3× средней capacity и живом среднем потоке (350 × 86 400) / (3 × 350 − 350) 43 200 с = 12 ч

GB и Mbit здесь десятичные. 1 500 events/s на partition/worker и 1,8 MB/s на partition — допущения теста. Для варианта без брокера строки RF/partitions относятся к альтернативному потоку или downstream outbox. RF не моделирует egress каждого consumer: добавьте по одной копии трафика на активную группу и репликационный трафик до RF−1 дополнительных копий. Пересчитайте отдельно при catch-up на пике, skew и p99 payload. Если capacity ≤ live rate, конечного времени восстановления нет.

960 tasks / 40 slots × 90 с = 2 160 с, 36 мин при равных chunks без overhead и failures. При 2× p95 длительности проверять tail отдельно. Таблица sizing относится к общему payload downstream archive; mapped concurrency определяется source quotas, а не partitions.

6. Варианты архитектуры

A — отдельный DAG на каждый источник. B — discovery плюс Dynamic Task Mapping для однородных inputs. C — внешний worker queue с Airflow на уровне manifest generations.

7. Сравнение вариантов и выбор

Выбрать B с лимитом chunk count, pools и task instance quotas. A нужен для разных owners/SLAs. C снижает нагрузку scheduler при очень мелких единицах работы, но усложняет tracking.

8. Component / data-flow

Иллюстративная схема выбранного варианта.

flowchart LR
 A["Versioned YAML"] --> B["Discovery and mapped tasks"]
 B --> C["Validated staged objects"]
 C --> D["Publication manifest"]

9. Normal processing sequence

sequenceDiagram
 participant A as Versioned YAML
 participant B as Discovery and mapped tasks
 participant C as Validated staged objects
 participant D as Publication manifest
 A->>B: Send identified input
 B->>C: Export pinned source chunk
 C-->>B: Return path checksum and row counts
 B->>D: Advance only with durable evidence

Validate и hash YAML. Discovery фиксирует список источников, run cut и chunk plans. Mapped task читает один план, пишет immutable output и передаёт через XCom только pointer, checksum и count. Reduce валидирует completeness и публикует manifest.

10. Failure / recovery sequence

sequenceDiagram
 participant B as Discovery and mapped tasks
 participant C as Validated staged objects
 participant O as Recovery owner
 B->>C: Attempt write or advance
 Note over B,C: Mapped task dies after writing one chunk
 O->>C: Reuse same cut and validate full generation
 C-->>O: Durable outcome or explicit gap

Успевшие chunks не публикуются как полный отчёт. Retry читает тот же pinned cut, переиспользует verified output либо дописывает deterministic generation. Changed source aborts. Optional source требует явно принятой degraded generation.

11. Data model и contracts

YAML contract задаёт source_id, connector_type, secret_ref, schedule, pool, schema version, required flag и cut strategy. Run manifest фиксирует config hash, chunk IDs и lineage.

12. Consistency boundaries

Task success и object durability отдельно. Consumer читает только committed manifest. Backfill прошлого периода использует archived config, schema и source cut.

13. Scaling и capacity planning

Пакетировать мелкие источники, ограничивать map size и retries. Выделить pool на source, отдельную quota на backfill, cap параллельного scatter.

14. Observability

Scheduler queue age, mapped task count, source throttling, retry storm, failed chunks и manifest completeness.

15. Data Quality и reconciliation

Сравнить expected chunks, keysets, row counts и hashes. Запретить смешение generations. Хранить approved exceptions и evidence.

16. Security и compliance

В YAML только secret references. Source readers least privilege, config changes review, logs redacted. Раздельные права publish и transform.

17. Implementation roadmap

Сначала два источника и dry run discovery, затем mapped retry fixture, затем pools, retention и backlog drill.

18. Testing и acceptance criteria

Проверить invalid YAML, partial failure, retry того же chunk, changed source, duplicate publish и повтор отчёта. Критерий — один manifest на approved generation и отсутствие partial visibility.

19. Trade-offs и ограничения

Dynamic Task Mapping упрощает runtime fan-out, но metadata DB и scheduler могут стать узким местом. Выбор зависит от granular retries и числа tasks.

20. Interview questions

Зачем pointer в XCom? Payload создаёт нагрузку на orchestration metadata и усложняет доступ. Как повторить прошлый день? Использовать сохранённый config и cut, затем выпустить отдельную generation.

Первичные источники

Проверка источников: 2026-11-03. Документация описывает свойства компонентов. Результаты испытаний выбранной системы требуют отдельного evidence.