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 Streams — Java client library от Confluent (с 2016). Stateful stream processing внутри обычного Java/Kotlin/Scala приложения. Использует Kafka топики как source/sink/state-storage.
- ksqlDB — SQL-интерфейс поверх Kafka Streams. Server-side приложение, принимает SQL и компилирует в Kafka Streams topology под капотом.
Обе технологии работают только с Kafka. В отличие от Flink, который умеет ещё Pulsar/Kinesis/RabbitMQ.
Когда хватит ksqlDB без Flink?
Простой rule of thumb:
- ✅ Простые aggregations (count, sum, avg по tumbling window)
- ✅ Filter / transformation потоков (where clause)
- ✅ Stream-table JOIN (поток событий + статическая dimension table)
- ✅ Materialized views поверх Kafka топиков
- ⚠️ Stream-stream JOIN — работает, но ограничения по watermark
- ❌ Complex Event Processing (sequence patterns, CEP)
- ❌ Session windows с custom timeout логикой
- ❌ Sub-second latency на 100k+ EPS
- ❌ Долгие retention периоды для state (>30 дней)
Референсные цифры: 3-node ksqlDB cluster (8 cores, 32 GB) = 50-80k EPS sustained на простой aggregation, p95 latency 400 мс.
Чем ksqlDB отличается от Kafka Streams в 2026?
| Критерий | ksqlDB | Kafka Streams |
|---|---|---|
| Язык запросов | SQL | Java SDK |
| Кто пишет | Аналитики и DE | Только программисты |
| Deploy | Standalone server | Embedded в приложение |
| Сложная логика (UDF) | Через Java UDF | Native |
| Debugging | Через query history | Standard Java tools |
| Scaling | Multi-node ksqlDB cluster | Horizontal через 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.
Рецепт скейлинга:
- Увеличить количество partitions Kafka топика (требует careful planning, не всегда rebalance free)
- Запустить дополнительные ksqlDB nodes (Kafka Streams instances)
- Кафка автоматически перераспределяет partitions между running instances
- State (RocksDB) копируется через standby replicas
Типичный scale: 6 partitions → 12 partitions + 2 → 4 ksqlDB instances. Throughput sustained 25k → 50k EPS. Scale-out занял 1 час downtime в maintenance window.
Какие подводные камни у ksqlDB / Kafka Streams?
- Грабли 1: ksqlDB Confluent Community License — не Apache. Фикс: проверить compliance с твоей политикой.
- Грабли 2: Restart Kafka Streams приложения = re-build state (минуты). Фикс: standby replicas + persistent state.
- Грабли 3: ksqlDB queries не survive upgrade. Фикс: export DDL → reapply на новом кластере.
- Грабли 4: Stream-stream JOIN требует careful timestamp management. Фикс: explicit
WITHINclause + watermark tuning. - Грабли 5: Custom serializers / UDF требуют jar deployment. Фикс: либо ksqlDB UDF, либо переезд на Flink.
- Грабли 6: Backfill (replay historical data) ломает state. Фикс: либо отдельный compaction-aware job, либо Flink.
Типичный инцидент: после увеличения нагрузки на 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:
| Критерий | ksqlDB | Materialize |
|---|---|---|
| Источник | Только Kafka | Kafka + PostgreSQL CDC + S3 + HTTP |
| SQL диалект | KSQL (subset) | PostgreSQL standard |
| Incremental view maintenance | ⚠️ Limited | ✅ Core feature |
| Cost | Free open-source | Managed (платно) |
| Production maturity | Stable since 2019 | Stable since 2022 |
| Лицензия | Confluent Community | Apache 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+ блог-постов.
Смежные посты
- Real-time pipeline Kafka+Flink+CH
- Real-time OLAP: CH vs Druid vs StarRocks vs Pinot
- Lakehouse Iceberg+Trino+CH
- ClickHouse CODEC
- Apache Superset для аналитика
- Аналитик → DE roadmap 2026
Сравнить Free и Pro → (1999₽/мес)
Источники
- Confluent Docs: «ksqlDB Overview» (docs.confluent.io)
- Apache Kafka Docs: «Streams API» (kafka.apache.org)
- Materialize Docs: «vs Other tools» (materialize.com)
- Habr: Kafka Streams production cases