Перейти к содержимому
Назад в блог
Технические8 февраля 202612 мин

Архитектура обработки данных в реальном времени: операционная аналитика с потоковой обработкой

Проектирование инфраструктуры обработки операционных данных на уровне миллисекунд с Apache Kafka, Flink и архитектурами Lambda/Kappa.

ASTO TECH Muhandislik Jamoasi

# Архитектура обработки данных в реальном времени

Что такое обработка данных в реальном времени и почему она важна?

Обработка данных в реальном времени — это практика приёма, анализа и реакции на данные в момент их генерации или в пределах окна задержки, измеряемого в миллисекундах и нескольких секундах. В отличие от традиционной пакетной обработки, где данные накапливаются за определённый период и периодически обрабатываются, системы реального времени работают с непрерывными, неограниченными потоками данных.

Kleppmann (2017) формулирует это как фундаментальный сдвиг: современные системы данных должны рассматривать данные не как статичные таблицы, а как непрерывно текущие потоки, обрабатываемые в движении. Ценность решения снижается со временем: обнаружение мошенничества, срабатывающее после завершения транзакции, операционно бесполезно. По данным Marz и Warren (2015), масштабируемая архитектура реального времени должна удовлетворять трём свойствам: надёжность (отказоустойчивость), низкая задержка (субсекундные ответы) и масштабируемость (горизонтальное масштабирование без переархитектуры).

Ключевые области применения: обнаружение финансового мошенничества, персонализация электронной коммерции, мониторинг телекоммуникационных сетей, прогностическое обслуживание в производстве и мониторинг пациентов в здравоохранении.

Что такое Apache Kafka и как он работает?

Apache Kafka — это распределённая платформа потоковой передачи событий, созданная в LinkedIn и выпущенная как открытое ПО в 2011 году. Kreps et al. (2011) описывают её определяющую характеристику: в отличие от традиционных очередей сообщений, удаляющих их после потребления, Kafka работает как распределённый журнал фиксации — сообщения хранятся на диске в течение настраиваемого периода вне зависимости от их потребления.

Основные архитектурные компоненты:

Брокер: Каждый сервер в кластере Kafka является брокером. Брокеры получают сообщения от производителей, хранят их на диске и обслуживают потребителей. Кластер из трёх и более брокеров обеспечивает отказоустойчивость через репликацию.

Топик: Именованный логический канал для сообщений. Топики разделяются на партиции для горизонтальной масштабируемости. Каждая партиция — упорядоченная неизменяемая последовательность записей.

Партиция: Единица параллелизма и упорядоченности в Kafka. Записи внутри партиции поддерживают строгий порядок. Партиции распределены по брокерам, обеспечивая балансировку нагрузки и отказоустойчивость через лидерство по партициям и ISR (In-Sync Replicas).

Производитель: Клиентское приложение, публикующее записи в топики. Функция partitioner определяет, в какую партицию поступит запись — обычно по хешу ключа записи.

Группа потребителей: Набор потребителей, совместно читающих топик. Каждая партиция назначается ровно одному потребителю в группе, обеспечивая параллелизм при сохранении порядка в рамках партиции.

Режим KRaft: Kafka 3.x ввёл KRaft (Kafka Raft Metadata Mode), устранив зависимость от ZooKeeper. Начиная с Kafka 4.0, режим ZooKeeper полностью удалён.

Пропускная способность Kafka достигается за счёт последовательного ввода-вывода на диск, передачи данных без копирования через системный вызов sendfile и пакетного сжатия сообщений.

В чём разница между потоковой и пакетной обработкой?

Пакетная обработка накапливает данные за определённый период и обрабатывает их как конечный набор. Фундаментальное ограничение — задержка: результаты отстают от реальности на часы.

Потоковая обработка рассматривает данные как неограниченную последовательность событий и обрабатывает каждое событие (или небольшой мини-пакет) по мере поступления. Задержка снижается до миллисекунд или секунд. Akidau et al. (2015) выявляют три фундаментальных вызова: обработка неупорядоченных событий, учёт разницы между временем события и временем обработки, а также гарантия семантики exactly-once при сбоях.

Carbone et al. (2015) представляют Apache Flink как единый движок: пакетная обработка моделируется как конечный поток, поэтому один API и среда выполнения справляются с обеими нагрузками без дублирования кода.

СвойствоПакетнаяПотоковая
ЗадержкаМинуты–часыМиллисекунды–секунды
Модель данныхКонечная, ограниченнаяБесконечная, неограниченная
Восстановление при сбояхПерезапуск заданияКонтрольная точка + воспроизведение
СтоимостьНижеСредняя–высокая
ПримененияОтчётность, ETLОповещения, рекомендации, мониторинг

Что такое архитектуры Lambda и Kappa?

Архитектура Lambda, формализованная Marz и Warren (2015), устраняет противоречие между точностью пакетной обработки и задержкой потоковой, запуская оба процесса параллельно:

  1. Пакетный уровень: Хранит все необработанные данные неизменяемо и периодически пересчитывает полные пакетные представления. Высокая точность, высокая задержка.
  2. Скоростной уровень: Обрабатывает только последние данные, создавая низкозадержанные инкрементальные представления.
  3. Сервисный уровень: Объединяет пакетные и скоростные представления для ответа на запросы.

Критический недостаток Lambda — дублирование кода: одна и та же бизнес-логика должна реализовываться дважды в двух разных системах.

Архитектура Kappa, предложенная Jay Kreps в 2014 году, полностью устраняет пакетный уровень. Предпосылка: всё есть поток. Единая кодовая база обслуживает как обработку в реальном времени, так и историческую. Kleppmann (2017) отмечает, что реализуемость Kappa во многом зависит от ёмкости хранения Kafka.

Как обработка в реальном времени применяется в операционном интеллекте?

Операционный интеллект (OI) использует аналитику реального времени для мониторинга, понимания и улучшения текущих бизнес-процессов. В отличие от традиционной BI, формирующей исторические отчёты, OI обеспечивает немедленное вмешательство — обнаружение аномалий и реагирование на них в процессе их возникновения.

Производственная архитектура OI включает:

Уровень приёма: Исходные системы (ERP, CRM, датчики IoT, веб-журналы) передают события через Kafka Producer API. Управление схемами через Confluent Schema Registry с Apache Avro обеспечивает совместимость производителей и потребителей.

Уровень потоковой обработки: Задания Flink или Kafka Streams реализуют бизнес-логику: фильтрацию нерелевантных событий, оконные агрегации (tumbling, sliding, session windows), объединение потоков и обнаружение аномалий.

Сервисный уровень: Обработанные результаты записываются в низкозадержанные хранилища — Apache Druid или InfluxDB для временных рядов, Redis или Apache Cassandra для поиска по ключу-значению.

Уровень визуализации: Информационные панели реального времени используют WebSocket или Server-Sent Events (SSE) для отправки обновлений без опроса.

Механизм водяных меток, описанный Akidau et al. (2015), позволяет системе продвигаться в оконных вычислениях даже при запоздавших событиях.

Список литературы

  • Kreps, J., Narkhede, N., & Rao, J. (2011). *Kafka: a Distributed Messaging System for Log Processing*. NetDB Workshop at VLDB.
  • Carbone, P., et al. (2015). *Apache Flink: Stream and Batch Processing in a Single Engine*. IEEE Data Engineering Bulletin, 38(4), 28–38.
  • Marz, N., & Warren, J. (2015). *Big Data: Principles and Best Practices of Scalable Real-Time Data Systems*. Manning Publications.
  • Kleppmann, M. (2017). *Designing Data-Intensive Applications*. O'Reilly Media.
  • Akidau, T., et al. (2015). *The Dataflow Model*. Proceedings of the VLDB Endowment, 8(12), 1792–1803.

Часто задаваемые вопросы

Каковы минимальные инфраструктурные требования для обработки в реальном времени? Для небольших нагрузок достаточно однонодового Kafka с Kafka Streams. Для производственных систем, обрабатывающих свыше 100 000 сообщений в секунду, рекомендуется кластер Kafka минимум из трёх брокеров с отдельными нодами потоковой обработки. Управляемые сервисы (Confluent Cloud, AWS Kinesis Data Streams) существенно снижают операционную нагрузку.

Когда следует выбирать Kappa вместо Lambda? Выбирайте Kappa при отсутствии существующей пакетной инфраструктуры и при необходимости единой кодовой базы. Выбирайте Lambda при необходимости интеграции с существующим хранилищем данных на базе Hadoop или когда ваш фреймворк потоковой обработки недостаточно зрел для полной исторической переобработки.

Что означает семантика exactly-once на практике? Гарантирует, что каждое событие обрабатывается и его эффект фиксируется в нижестоящих системах ровно один раз, даже при сбое и восстановлении обрабатывающего узла. Kafka реализует это через идемпотентных производителей и транзакционные API. Apache Flink реализует через распределённые контрольные точки с двухфазной фиксацией в внешних хранилищах.

Как водяные метки обрабатывают запоздавшие события? Водяная метка — это утверждение о времени: «все события с временем T или ранее прибыли». Обработчик потока использует водяные метки для запуска оконных вычислений. Запоздавшие события могут включаться через окно допустимого опоздания (включаться в обновлённые результаты) или направляться в побочный вывод для отдельной обработки.