В процессе доклада напишем приложение, использующее Kafka Streams и Spring, в реальном времени обрабатывающее данные датчика погоды Raspberry Pi. Разберёмся как течёт время в Kafka Streams и почему это грозит вам бессонными ночами debug’a. Вы узнаете как обрабатывать потоки данных в Kafka c помощью библиотеки Kafka Streams и абстракций Spring Cloud. Мы обсудим окна, агрегации, графы обработки данных и топологии. Напоследок, обсудим нюансы деплоя Kafka Streams приложений.
4. О чём поговорим:
• Что вообще такое эти ваши Kafka Streams?
• Архитектура приложения со стримами
• Live coding: Streams, Spring, RaspberryPi и IoT
• Stateful & stateless обработка
• Окна и агрегация
• А как всё это работает со Спрингом?
• Как течёт время
• Как правильно деплоить
5. Что вообще такое эти ваши Kafka Streams?
Kafka Streams - это клиентская библиотека для обработки и анализа
данных, хранящихся в Kafka. Она основана на важных концепциях
потоковой обработки, таких как правильное различие между временем
события и временем обработки, поддержка окон, а также простое, но
эффективное управление запросами состояния приложения в режиме
реального времени…
TL;DR:
• Kafka Streams – это просто библиотека живущая в твоём приложении;
• API для обработки данных в Kafka;
• Содержит решения проблем потоковой обработки: агрегации,
состояния, восстановление, масштабирование и т.д.
6. Use cases
• Анализ активности на сайте, в приложении и т.д.
• Обработка и агрегация логов
• Потоковая генерация контента
• You name it!
Логи
7. Из коробки:
• Fault-tolerance
• Scaling
• Exactly-once processing semantics (default is at-least-once)
• Операции агрегации: windowing, count, …
• Late-arrival records handling
8. Архитектура
• Processor topology – граф (DAG) задающий логику обработки
• Stream – последовательность сообщений в топике Kafka
• Processor – узел графа topology обрабатывающий сообщения
Kafka topic Kafka topic
Kafka topic
Kafkatopic
12. Spring Cloud Stream Kafka Streams
• Есть starter!
• Под капотом: библиотеки Kafka Streams и Spring for Kafka
• Самостоятельно создаёт и настраивает Topology
• С недавних пор умеет в функциональщину
13. Stop talking, start coding!
Weather
sensors
REST API
application1
Kafka Streams
application
HTTP
Kafka
Собирает температуру
и влажность.
Отправляет
измерения по REST API
Собирает измерения и
отправляет в Кафку
(потенциально делает
AAA, enrichment и т.п.)
1Возможно убрать это звено и писать сразу в Kafka но эта архитектура ещё покрывает сбор метрик с фронта
Обрабатывает данные
и триггерит алерты
More in a while
15. Kafka Streams application zoomed in
Weather
sensor
REST API
Kafka Streams
application
Calculate average for
5 seconds
Fire alert if threshold
reached
KStream
KStream
KTable
19. Data processing types
Два вида обработки данных:
• Stateless:
• Отравить сообщение в другую систему
• Записать лог
• Примеры операторов: filter, map, forEach, print
• Stateful:
• Посчитать количество сообщений
• Объедение нескольких стримов
• В целом любая операция в которой нужно «запомнить» что-то вне границ одного
сообщения
• Примеры операторов: aggregate, count, reduce
• Хранят состояние в state store
20. State stores
• Хранятся в локальной файловой системе используя RocksDB, по
умолчанию в папке /tmp
• Дублируются в «changelog topic» в Kafka чтобы восстановить
локальную копию после падения
• State store идентифицируются приложением используя параметр
“application.id”
21. Back to code: finishing up
- Заканчиваем ”average” processor
- Пишем “alerts” processor
- Запускаем!
22. The different concepts of time in Kafka Streams
Подходы к заданию времени сообщения:
• Event time – момент времени когда событие произошло на
источнике (e.g. например время сбора показаний на сенсоре )
• Processing time – момент времени когда сообщение получено
приложением-обработчиком
• Ingestion time – момент времени когда сообщение попало в
топик Kafka
В Kafka Streams, вы выбираете подход реализуя интерфейс
TimestampExtractor
23. Stream time
As a result, time will only advance when a new record arrives at the
processor. This concept is called Stream time.
24. Testing the offline scenario
The data collected from the IoT sensor during a loss of connectivity must be processed correctly!
25. Expired window, why?
• Stream time is tracked per partition not per key!
• There is KIP-540 to address this problem
26. So Kafka Streams doesn’t work for IoT?*
* and other cases when we need to process offline-generated data
27. Expired window: solutions
• Custom operator that implements enhanced window
expiration/suppress logic
• Wait for the solution from the Kafka team (see KIP-540)
28. Expired window: ещё
одно решение
Create as many partitions as there are
keys and make sure your partitioning
strategy is one-to-one
29. Things to know when deploying to cloud
• Spring Cloud Actuator’s /health endpoint tracks Kafka Streams
threads liveness starting from version 3.0.0 only
• Better to have a same persistent /tmp folder between application
redeploys as it help Kafka Streams to recreate state stores
immediately as opposed to a rebuild from the changelog topic
• Consider deploying to the same node
• Use StatefulSet in Kubernetes