TL;DR: real-time пайплайн «Kafka → Flink → ClickHouse» даёт end-to-end latency 200-800 мс на потоке 100k events/sec. Kafka хранит сырые события, Flink делает stateful aggregation с exactly-once семантикой, ClickHouse держит агрегаты для dashboard'ов. Альтернативы (ksqlDB, Spark Streaming, Materialize) проигрывают по сочетанию latency + cost для нагрузок 50k+ EPS.
Аудитория: Middle / Senior Data Engineer и Senior Analyst, проектирующие real-time платформу для e-commerce, fintech, marketplace или gaming.
Например, типичный production-кейс из e-comm: order events (200k EPS peak), Kafka 12 partitions, Flink 4 task-managers, ClickHouse 6 shards. End-to-end p95 latency: 320 мс. Cost ~180K ₽/мес.
Что такое real-time пайплайн и зачем он нужен?
Real-time пайплайн — поток данных, где от события до dashboard проходит меньше секунды. В отличие от batch (Airflow + dbt, latency часы), real-time даёт операционную аналитику: fraud detection, dynamic pricing, live retention.
| Задача | Batch (Airflow+dbt) | Real-time (Kafka+Flink+CH) |
|---|---|---|
| Daily revenue report | ✅ Идеально | ⚠️ Overkill |
| Fraud detection | ❌ Слишком поздно | ✅ Обязательно |
| Live dashboard CEO | ❌ Утром «вчерашний день» | ✅ Sub-second |
| Recommendation engine | ⚠️ Можно но устарели | ✅ Online learning |
| Reconciliation P&L | ✅ Достаточно | ❌ Дорого |
Какие три компонента нужны для пайплайна?
Минимальный production-стек 2026 года:
- Kafka — append-only лог событий. Хранит «raw» данные, retention 7-30 дней. Альтернативы: Yandex Message Queue, Apache Pulsar.
- Flink — stateful stream processing. Делает window aggregation, joins, deduplication. Альтернативы: Spark Streaming (slower), ksqlDB (limited).
- ClickHouse — columnar storage для агрегатов. Sub-second SELECT, high concurrency. Альтернативы: Apache Druid (concurrency), StarRocks (newest).
Когда брать Flink, а когда хватит ksqlDB?
Flink побеждает в сложных сценариях. ksqlDB достаточно для простых.
| Сценарий | Хватит ksqlDB | Нужен Flink |
|---|---|---|
| Tumbling window aggregation (1 мин revenue) | ✅ | ✅ |
| Session windows с custom timeout | ❌ | ✅ |
| Stream-stream JOIN >2 источников | ❌ | ✅ |
| Stateful pattern matching (CEP) | ❌ | ✅ |
| Backfill через replay Kafka | ⚠️ | ✅ |
| Exactly-once семантика | ⚠️ | ✅ |
Подробнее про ksqlDB и Kafka Streams — в нашем гайде по light-weight streaming.
Как настроить пайплайн с нуля?
Шаг 1: Поднять Kafka cluster
Минимум 3 broker'а в production для replication factor 3. Локально — Docker Compose с одним.
# docker-compose.yml фрагмент
kafka:
image: confluentinc/cp-kafka:7.6.0
environment:
KAFKA_BROKER_ID: 1
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
Типичные production-цифры: 3 broker × 16 cores × 64 GB RAM = 100k-200k EPS sustained, retention 14 дней (хватает для replay), replication factor 3.
Шаг 2: Настроить Flink job с exactly-once
// Упрощённая структура
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.enableCheckpointing(60_000, CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().setCheckpointStorage("s3://flink-checkpoints/");
DataStream<Event> events = env.fromSource(
KafkaSource.<Event>builder()
.setBootstrapServers("kafka:9092")
.setTopics("orders")
.setGroupId("flink-aggregator")
.setStartingOffsets(OffsetsInitializer.earliest())
.setDeserializer(new EventDeserializer())
.build(),
WatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(10)),
"kafka-source"
);
events
.keyBy(Event::getProductId)
.window(TumblingEventTimeWindows.of(Time.minutes(1)))
.aggregate(new RevenueAggregator())
.sinkTo(getClickhouseSink());
Шаг 3: Sink в ClickHouse через JDBC или native
ClickHouse поддерживает batch insert через JDBC. Native sink — через Flink ClickHouse Connector (clickhouse-jdbc + Flink connector).
-- DDL таблицы агрегатов в ClickHouse
CREATE TABLE revenue_by_minute (
minute DateTime CODEC(Delta, ZSTD(3)),
product_id UInt64,
revenue Decimal(18, 2),
orders_count UInt32
) ENGINE = MergeTree
ORDER BY (minute, product_id)
TTL minute + INTERVAL 90 DAY;
Подробнее про CH CODEC — в гайде LZ4/ZSTD/Delta/T64.
Шаг 4: Dashboard поверх ClickHouse
Любой BI с native CH-connector: DataLens, Apache Superset, Metabase. Подробнее в сравнении BI tools.
Какой throughput реальный на 3-node Flink кластере?
Референс из публичных Confluent docs: 3 task-manager × 8 vCPU × 32 GB = 80k EPS sustained simple aggregation, p50=80ms p95=350ms p99=900ms. Cost ~$1500/mo (AWS EKS managed).
Типичные референсные цифры из публичных кейсов (Confluent, AWS):
- 3 task-managers × 8 vCPU × 32 GB RAM
- Throughput sustained: 50-150k EPS на простой aggregation
- Throughput sustained: 20-60k EPS на stream-stream JOIN
- End-to-end p95 latency: 200-800 мс
- Стоимость в Yandex Cloud Managed Service: ~80-150K ₽/мес за 3-node
Какие подводные камни у Kafka + Flink + ClickHouse?
- Грабли 1: Late events нарушают agregation. Фикс: правильный watermark + grace period (allowedLateness).
- Грабли 2: Flink savepoint несовместим между minor versions. Фикс: тестировать upgrade на staging перед prod.
- Грабли 3: ClickHouse batch insert «душит» CPU при high QPS. Фикс: накапливать в Flink 1-5 сек, потом insert batch 50-200k rows.
- Грабли 4: Kafka consumer lag растёт незаметно. Фикс: alert на Kafka lag через Prometheus + Burrow.
- Грабли 5: Flink checkpoint размер растёт неконтролируемо. Фикс: RocksDB state backend + incremental checkpointing.
- Грабли 6: ClickHouse Replicated table блокируется при network split. Фикс: ZooKeeper observers + readiness probe.
Типичный инцидент: Flink savepoint несовместим после upgrade с 1.17 → 1.18. Symptom — job не стартует после restart. Fix — заново trigger savepoint на 1.18 в staging, applied к prod. Time-to-fix: 4 часа downtime real-time dashboards.
С чем real-time стек сравним и как выбрать?
Альтернативы и trade-offs:
| Стек | Latency p95 | Throughput | Cost | Сложность |
|---|---|---|---|---|
| Kafka + Flink + ClickHouse | 200-800 мс | 100k+ EPS | Mid | High |
| Kafka + ksqlDB + ClickHouse | 500-1500 мс | 30-50k EPS | Low | Mid |
| Kafka + Spark Streaming + Delta | 2-10 сек | 100k+ EPS | Mid | High |
| Materialize standalone | 100-500 мс | 10-30k EPS | High | Low |
| Tinybird (managed) | 100-500 мс | 10-50k EPS | Very High | Very Low |
| ClickHouse Kafka engine (без Flink) | 1-5 сек | 50k+ EPS | Low | Low |
Типичная позиция Senior DE 2026: «мы выбрали Flink вместо Spark Streaming потому что нужны session windows с custom timeout — Spark Structured Streaming это поддерживает только через grouped state, что неудобно. Plus exactly-once в Flink работает из коробки».
Частые вопросы про real-time пайплайн
Какой минимальный размер кластера для production?
3 broker'а Kafka + 3 task-manager'а Flink + 3 shard'а ClickHouse. Минимум 9 серверов. На меньшем — теряешь HA.
Можно ли заменить Flink на ClickHouse Kafka engine?
Да, если aggregation простая (tumbling window, count, sum). Нельзя если нужны stream JOIN или stateful pattern matching.
Как тестировать real-time пайплайн?
Embedded Kafka в JUnit для Flink job. Testcontainers ClickHouse для sink. End-to-end через replay test-events из Kafka backup topic.
Что делать если Kafka lag растёт?
Сначала scale-up Flink parallelism (taskmanager.numberOfTaskSlots). Если не помогает — partition'ы в Kafka топике (rebalance). В крайнем случае — пересмотреть business logic, может aggregation слишком тяжёлая.
Сколько стоит pipeline в Yandex Cloud / AWS?
Managed Kafka 3-node + Managed Flink 3-node + Managed ClickHouse 3-shard: ~250-500K ₽/мес в Yandex Cloud. AWS MSK + Kinesis Analytics + EMR: $3-6K/мес. ~250-500K ₽/мес. Точная цифра зависит от кластера: 3 broker × Yandex Cloud Managed Kafka m3-medium = 90K ₽; 3 task-manager Flink на VM = 70K ₽; CH 3 shard managed = 120K ₽. Итого ~280K ₽/мес для нагрузки 100k EPS
Что дальше?
Если хочешь практику — попробуй SQL-тренажёр с автопроверкой (5 задач бесплатно). Real-time aggregation queries (window, JOIN) полезны и для batch SQL — паттерны те же.
Готов к собеседованиям Senior DE? AI-интервью задаёт вопросы по real-time архитектуре (Kafka, Flink, exactly-once). В Pro — безлимит мок-собесов + 491 SQL-задача + 612 тестовых заданий + 55+ блог-постов.
Смежные посты
- ksqlDB / Kafka Streams vs Flink
- Real-time OLAP: ClickHouse vs Druid vs StarRocks vs Pinot
- ClickHouse CODEC: LZ4/ZSTD/Delta/T64
- Lakehouse: Iceberg + Trino + ClickHouse
- Apache Superset для аналитика
- Аналитик → DE roadmap 2026
Сравнить Free и Pro → (1999₽/мес)
Источники
- Habr 1022460: «Airflow + ClickHouse вытесняет Airflow + PostgreSQL»
- Apache Flink Docs: «Checkpointing и Exactly-Once» (flink.apache.org)
- Confluent: «Kafka Streams vs ksqlDB vs Flink» (confluent.io)
- ClickHouse Docs: «Kafka engine» (clickhouse.com/docs)
- Yandex Cloud: «Managed Service for Apache Flink»