ksqlDBKafka StreamsstreamingKafkareal-timeаналитика

Когда брать ksqlDB или Kafka Streams вместо Flink?

2026-06-02 11 мин

TL;DR: ksqlDB подходит когда нужны простые aggregation, filter, JOIN потоков через SQL — без Flink-кластера. Kafka Streams даёт Java SDK для более сложной логики, но всё ещё внутри одного приложения. Оба проигрывают Flink для сложного stateful processing (CEP, session windows, watermark management), но выигрывают по operational simplicity и стоимости для небольших нагрузок.

Аудитория: Middle Data Engineer и Senior Analyst, решающие нужен ли Flink или хватит lighter-weight tool.

Типичный кейс: ad-tech pipeline 30k EPS, sub-second не требуется (хватает 1-2 сек), команда без Java-опыта. Выбрали ksqlDB — SQL понятен аналитикам, prod-ready за 2 недели.

Что такое ksqlDB и Kafka Streams?

Обе технологии работают только с Kafka. В отличие от Flink, который умеет ещё Pulsar/Kinesis/RabbitMQ.

Простой rule of thumb:

Референсные цифры: 3-node ksqlDB cluster (8 cores, 32 GB) = 50-80k EPS sustained на простой aggregation, p95 latency 400 мс.

Чем ksqlDB отличается от Kafka Streams в 2026?

КритерийksqlDBKafka Streams
Язык запросовSQLJava SDK
Кто пишетАналитики и DEТолько программисты
DeployStandalone serverEmbedded в приложение
Сложная логика (UDF)Через Java UDFNative
DebuggingЧерез query historyStandard Java tools
ScalingMulti-node ksqlDB clusterHorizontal через partition rebalance
ЛицензияConfluent Community (не Apache 2.0)Apache 2.0
Типичная позиция: «мы выбрали Kafka Streams вместо ksqlDB потому что нужны custom serializers (Protobuf со схемой через Schema Registry) и кастомные UDF на Java — это в ksqlDB через Java UDF возможно, но Kafka Streams нативнее».

Как написать простой aggregation в ksqlDB?

Шаг 1: Создать STREAM поверх Kafka топика

CREATE STREAM orders_stream (
    order_id BIGINT KEY,
    user_id BIGINT,
    amount DECIMAL(10, 2),
    created_at BIGINT
) WITH (
    KAFKA_TOPIC = 'orders',
    VALUE_FORMAT = 'JSON',
    TIMESTAMP = 'created_at'
);

Шаг 2: Создать MATERIALIZED TABLE с агрегатами

CREATE TABLE revenue_per_minute AS
SELECT
    TIMESTAMPTOSTRING(WINDOWSTART, 'yyyy-MM-dd HH:mm') AS minute,
    SUM(amount) AS total_revenue,
    COUNT(*) AS orders_count
FROM orders_stream
WINDOW TUMBLING (SIZE 1 MINUTE)
GROUP BY 1
EMIT CHANGES;

Шаг 3: Sink в ClickHouse через Kafka Connect

# config/clickhouse-sink.json
{
    "name": "clickhouse-revenue",
    "config": {
        "connector.class": "com.clickhouse.kafka.connect.ClickHouseSinkConnector",
        "topics": "REVENUE_PER_MINUTE",
        "hostname": "clickhouse",
        "database": "analytics",
        "table": "revenue_per_minute"
    }
}

Подробнее про ClickHouse в real-time стеке — в гайде Kafka+Flink+CH.

Как написать тот же aggregation в Kafka Streams?

StreamsBuilder builder = new StreamsBuilder();

KStream<Long, Order> orders = builder.stream(
    "orders",
    Consumed.with(Serdes.Long(), orderSerde)
);

KTable<Windowed<String>, OrderAggregate> revenuePerMinute = orders
    .groupBy(
        (orderId, order) -> "global",
        Grouped.with(Serdes.String(), orderSerde)
    )
    .windowedBy(TimeWindows.of(Duration.ofMinutes(1)))
    .aggregate(
        OrderAggregate::new,
        (key, order, agg) -> agg.add(order),
        Materialized.with(Serdes.String(), aggSerde)
    );

revenuePerMinute.toStream().to("revenue-per-minute");

Тот же результат, больше кода, гибче в edge-cases (custom serializers, ad-hoc operations).

Как масштабировать ksqlDB / Kafka Streams приложение?

Оба используют partition-based parallelism Kafka. Если топик имеет 12 partitions — максимум 12 параллельных task instances.

Рецепт скейлинга:

Типичный scale: 6 partitions → 12 partitions + 2 → 4 ksqlDB instances. Throughput sustained 25k → 50k EPS. Scale-out занял 1 час downtime в maintenance window.

Какие подводные камни у ksqlDB / Kafka Streams?

Типичный инцидент: после увеличения нагрузки на 30% query latency вырос в 3 раза. Root cause через EXPLAIN — missing index на JOIN column. Fix: добавили composite index, OPTIMIZE TABLE FINAL. Time-to-fix: 2 часа.

Чем ksqlDB отличается от Materialize?

Похожие по идее tools — SQL поверх streaming. Differences:

КритерийksqlDBMaterialize
ИсточникТолько KafkaKafka + PostgreSQL CDC + S3 + HTTP
SQL диалектKSQL (subset)PostgreSQL standard
Incremental view maintenance⚠️ Limited✅ Core feature
CostFree open-sourceManaged (платно)
Production maturityStable since 2019Stable since 2022
ЛицензияConfluent CommunityApache 2.0
Типичная позиция: «Materialize выигрывает на incremental view maintenance — она поддерживает обновляющиеся materialized views с минимальным overhead. Но Materialize managed-only и дорогая ($5-15K/mo). Для on-prem — ksqlDB разумнее».

Частые вопросы про ksqlDB и Kafka Streams

Что выбрать для первого streaming проекта в команде?

ksqlDB. SQL понятен большинству аналитиков, не требует Java скиллов. Сложности появятся через 6-12 месяцев — тогда можно think about Kafka Streams или Flink.

Можно ли использовать ksqlDB без Confluent Platform?

Технически можно — ksqlDB server можно деплоить отдельно. Но Confluent Schema Registry и Connect облегчают жизнь. На open-source Kafka — поднимается, но больше DevOps работы.

Какой throughput реальный?

3-node ksqlDB cluster: 30-100k EPS на простой aggregation. Kafka Streams в одном приложении: схожие цифры. Flink: 100-300k EPS. из публичных бенчмарков (Confluent + ClickHouse blog) 3-node ksqlDB sustained — 50-80k EPS, Flink 3-task-manager — 150-300k EPS на эквивалентном железе

Куда деваются данные при рестарте?

В Kafka топиках (input + output + state changelog) + локальный RocksDB state. После рестарта state восстанавливается из changelog топика. Если changelog truncate'нут — потеря.

Можно ли запросить state из ksqlDB как обычную БД?

Да, через Pull Queries: SELECT * FROM revenue_per_minute WHERE minute = '2026-06-02 14:00';. Это точечные запросы к materialized view, нагрузка на ksqlDB кластер. Для high-QPS дашбордов — sink в ClickHouse.

Что дальше?

Если хочешь практику — попробуй SQL-тренажёр с автопроверкой (5 задач бесплатно). KSQL диалект очень похож на стандартный SQL с window functions — тренировка переносится.

Готов к собеседованиям Middle/Senior DE? AI-интервью задаёт вопросы по streaming архитектуре, Kafka, exactly-once семантике. В Pro — безлимит мок-собесов + 491 SQL-задача + 612 тестовых + 55+ блог-постов.

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

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

Источники

SQL-тренажёр
Тренируйся в SQL: настоящий PostgreSQL 16 + SQLite. Streaming SQL похож на window-функции. 491 задача, первые 5 бесплатно.
Открыть тренажёр →