Apache Kafka
Apache Kafka — это распределённая платформа потоковой передачи данных (event streaming platform) с открытым исходным кодом, разработанная для обработки, хранения и передачи больших объёмов данных в реальном времени. Kafka сочетает в себе функции высокопроизводительного брокера сообщений, распределённого журнала (log) и системы потоковой обработки, что позволяет использовать её для построения конвейеров данных, интеграции микросервисов, аналитики в реальном времени и сбора логов. Система была создана в компании LinkedIn, а затем передана в управление Apache Software Foundation.
История
Разработка Apache Kafka началась в 2010 году в LinkedIn. Основными авторами стали инженеры Джей Крепс, Ниха Нархиде и Джуниан Рао. Первоначальная цель заключалась в создании системы, способной обрабатывать огромные потоки данных от различных сервисов LinkedIn (например, активность пользователей, просмотры страниц, поисковые запросы) и передавать их в аналитические системы. Традиционные брокеры сообщений (такие как RabbitMQ или ActiveMQ) не справлялись с такими нагрузками из-за ограничений по пропускной способности и масштабируемости.
В 2011 году проект был открыт под лицензией Apache 2.0 и передан в инкубатор Apache Software Foundation. В 2012 году Kafka стала проектом верхнего уровня Apache. Ключевой вклад в развитие внесли разработчики из LinkedIn, Confluent (компания, основанная авторами Kafka) и сообщества открытого кода. В последующие годы вышли версии с поддержкой потоковой обработки (Kafka Streams, версия 0.10.0.0), улучшенной безопасностью, транзакциями и новыми протоколами сжатия. На 2024 год Kafka является де-факто стандартом для построения событийно-ориентированных архитектур (event-driven architecture) и используется тысячами организаций по всему миру.
Архитектура и основные концепции
Архитектура Kafka строится вокруг нескольких ключевых компонентов, обеспечивающих её высокую производительность и отказоустойчивость.
Кластер и брокеры
Kafka работает как кластер, состоящий из одного или нескольких серверов, называемых брокерами (brokers). Каждый брокер — это экземпляр процесса Kafka, который хранит данные и обрабатывает запросы от клиентов (производителей и потребителей). Брокеры взаимодействуют друг с другом для репликации данных и координации. Один из брокеров выполняет роль контроллера, отвечающего за управление разделами и лидерами.
Топики и партиции
Данные в Kafka организуются в топики (topics) — логические каналы, соответствующие определённому типу сообщений (например, «логи веб-сервера», «заказы пользователей»). Каждый топик разбивается на партиции (partitions) — упорядоченные, неизменяемые последовательности записей. Партиции являются единицей параллелизма: разные партиции могут обрабатываться разными потребителями одновременно, что обеспечивает масштабирование. Каждая запись в партиции имеет уникальный смещение (offset) — последовательный номер, определяющий её положение.
Производители и потребители
Производители (producers) — это клиентские приложения, которые публикуют сообщения в топики. Они сами выбирают, в какую партицию отправить сообщение (на основе ключа или по round-robin). Потребители (consumers) — приложения, которые читают сообщения из топиков. Потребители объединяются в группы потребителей (consumer groups). Каждая партиция в топике может быть прочитана только одним потребителем из одной группы, что обеспечивает балансировку нагрузки. Если потребитель выходит из строя, Kafka автоматически перераспределяет партиции между оставшимися потребителями (rebalancing).
Репликация и отказоустойчивость
Для обеспечения надёжности каждая партиция может быть реплицирована на несколько брокеров. Один из реплик является лидером (leader), который обрабатывает все запросы на запись и чтение. Остальные реплики — последователи (followers), которые синхронизируют данные с лидером. Если лидер выходит из строя, контроллер выбирает нового лидера из числа последователей. Параметр replication.factor определяет количество копий каждой партиции (обычно 2 или 3).
Журнал и хранение
Kafka хранит все сообщения на диске в виде журнала (log). В отличие от традиционных брокеров, которые удаляют сообщения после их прочтения, Kafka хранит их в течение заданного времени (параметр retention.ms) или до достижения определённого размера (retention.bytes). Это позволяет потребителям читать данные не только в реальном времени, но и с произвольной точки в прошлом (replay). Сообщения хранятся в бинарном формате, что обеспечивает высокую скорость записи и чтения.
Протокол и API
Kafka использует собственный бинарный протокол поверх TCP. Для взаимодействия с кластером предоставляются несколько API:
- Producer API — для публикации сообщений.
- Consumer API — для чтения сообщений.
- Streams API — для построения приложений потоковой обработки (Kafka Streams).
- Connect API — для интеграции с внешними системами (Kafka Connect).
- Admin API — для управления топиками, конфигурациями и кластером.
Классификация и компоненты
Kafka можно рассматривать как платформу, включающую несколько интегрированных компонентов:
Kafka Broker (ядро)
Основной сервер, реализующий хранение, репликацию и обслуживание запросов. Это то, что обычно называют «собственно Kafka».
Kafka Streams
Библиотека для построения приложений потоковой обработки (stream processing). Позволяет выполнять операции (фильтрацию, агрегацию, объединение) над данными в реальном времени без использования внешних систем (Spark, Flink). Kafka Streams работает как обычное Java-приложение, используя Kafka в качестве источника и приёмника данных.
Kafka Connect
Фреймворк для интеграции Kafka с внешними системами (базы данных, файловые хранилища, другие очереди). Connect работает в кластерном режиме (Kafka Connect cluster) и использует коннекторы (connectors) — готовые или написанные пользователем модули для чтения/записи данных. Примеры: коннектор для PostgreSQL (JDBC), для файлов, для HDFS.
Schema Registry
Хотя Schema Registry не является частью ядра Kafka, это стандартный компонент экосистемы. Он хранит схемы данных (в формате Avro, Protobuf или JSON Schema) и обеспечивает совместимость версий. Производители и потребители могут проверять соответствие сообщений схеме, что предотвращает ошибки при изменении формата данных.
Применение
Kafka используется в широком спектре задач, где требуется обработка потоков данных в реальном времени или надёжная передача сообщений.
Сбор и агрегация логов
Одно из первых и наиболее распространённых применений. Kafka собирает логи от множества серверов и приложений, затем передаёт их в системы хранения (Elasticsearch, HDFS) или аналитики (Splunk, Logstash). Это позволяет централизованно мониторить и анализировать поведение систем.
Мониторинг и метрики
Kafka используется для сбора метрик производительности (CPU, память, сеть) от инфраструктуры и приложений. Данные могут передаваться в системы визуализации (Grafana, Prometheus) или в алгоритмы обнаружения аномалий.
Построение конвейеров данных (Data Pipelines)
Kafka выступает в роли центральной шины данных (data bus), соединяющей различные системы: базы данных, хранилища, сервисы машинного обучения. Например, изменения в базе данных (CDC — Change Data Capture) могут транслироваться через Kafka в поисковый движок (Elasticsearch) или в аналитическое хранилище (ClickHouse, Snowflake).
Событийно-ориентированная архитектура (Event-Driven Architecture)
Микросервисы общаются друг с другом через Kafka, отправляя события (например, «заказ создан», «платёж подтверждён»). Это обеспечивает слабую связанность, асинхронность и масштабируемость. Каждый сервис может подписаться на нужные события и реагировать на них независимо.
Аналитика в реальном времени
Kafka служит источником данных для систем потоковой обработки (Apache Flink, Apache Spark Streaming, Kafka Streams). Это позволяет вычислять агрегаты (количество кликов, средняя цена) с задержкой в секунды и использовать их для принятия решений (например, динамическое ценообразование, выявление мошенничества).
Хранение и воспроизведение событий (Event Sourcing)
Kafka может использоваться как хранилище событий для архитектуры Event Sourcing. Каждое изменение состояния системы фиксируется как событие в Kafka, а текущее состояние восстанавливается путём воспроизведения всех событий. Это обеспечивает полный аудит и возможность отката.
Примеры использования
- LinkedIn — оригинальный разработчик, использует Kafka для отслеживания активности пользователей, метрик, логов и интеграции сервисов. Обрабатывает триллионы сообщений в день.
- Uber — использует Kafka для обработки данных о поездках, местоположении водителей и пассажиров, а также для аналитики в реальном времени.
- Netflix — применяет Kafka для сбора логов, мониторинга состояния сервисов и передачи событий между микросервисами.
- Airbnb — использует Kafka для обработки бронирований, платежей и уведомлений.
- Сбербанк — использует Kafka в своей платформе для обработки транзакций, мониторинга и аналитики.
- Яндекс — применяет Kafka для сбора метрик, логов и построения конвейеров данных в сервисах.
Критика и ограничения
Несмотря на широкую популярность, Kafka имеет ряд ограничений и критических замечаний:
- Сложность эксплуатации — для развёртывания и поддержки кластера Kafka требуется квалифицированная команда администраторов. Настройка параметров (репликация, сжатие, retention) требует глубокого понимания системы.
- Задержка (latency) — хотя Kafka обеспечивает высокую пропускную способность, задержка доставки сообщений (end-to-end latency) может быть выше, чем у некоторых альтернатив (например, RabbitMQ), особенно при использовании репликации и гарантий доставки.
- Гарантии доставки — Kafka поддерживает три уровня гарантий: at-most-once (не более одного раза), at-least-once (не менее одного раза) и exactly-once (ровно один раз). Реализация exactly-once требует тщательной настройки и может снижать производительность.
- Ограниченная поддержка сложной маршрутизации — Kafka не поддерживает сложные правила маршрутизации сообщений (например, на основе содержимого) без дополнительной обработки.
- Зависимость от ZooKeeper — до версии 2.8 Kafka требовала ZooKeeper для управления кластером (выбор лидера, хранение метаданных). В версии 2.8 появился режим без ZooKeeper (Kafka Raft Metadata mode), но он ещё не стал стандартом.
Интересные факты
- Название Kafka происходит от имени чешского писателя Франца Кафки, так как создатели хотели подчеркнуть, что система «загадочна и сложна» в хорошем смысле (сложность обработки потоков данных).
- Kafka способна обрабатывать миллионы сообщений в секунду на одном кластере из нескольких десятков брокеров.
- Сообщения в Kafka хранятся в бинарном формате, что делает их независимыми от языка программирования. Официальные клиенты существуют для Java, Python, Go, C++, .NET, Node.js и других языков.
- Kafka широко используется в научных исследованиях, например, в проектах ЦЕРН (Большой адронный коллайдер) для обработки данных с детекторов.
Источники
- Apache Kafka Documentation (официальная документация проекта)
- Книга: Neha Narkhede, Gwen Shapira, Todd Palino. «Kafka: The Definitive Guide» (O'Reilly Media, 2017)
- Книга: Джей Крепс. «I Heart Logs» (O'Reilly Media, 2014)
- Статья: «Kafka: a Distributed Messaging System for Log Processing» (Jay Kreps, Neha Narkhede, Jun Rao, 2011)
- Материалы конференций Kafka Summit и ApacheCon
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →