KafkaFlinkClickHousereal-timestreamingdata engineering

Как построить real-time пайплайн на Kafka + Flink + ClickHouse в 2026?

2026-06-02 13 мин

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 года:

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.

Референс из публичных 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):

Типичный инцидент: 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 p95ThroughputCostСложность
Kafka + Flink + ClickHouse200-800 мс100k+ EPSMidHigh
Kafka + ksqlDB + ClickHouse500-1500 мс30-50k EPSLowMid
Kafka + Spark Streaming + Delta2-10 сек100k+ EPSMidHigh
Materialize standalone100-500 мс10-30k EPSHighLow
Tinybird (managed)100-500 мс10-50k EPSVery HighVery Low
ClickHouse Kafka engine (без Flink)1-5 сек50k+ EPSLowLow
Типичная позиция 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+ блог-постов.

Смежные посты

Сравнить Free и Pro → (1999₽/мес)

Источники

AI-интервью
Тренируйся к собесам DE на real-time архитектуре. AI задаёт вопросы и оценивает структуру ответа. 1 бесплатная сессия.
Открыть AI-интервью →