Открыть сервис

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:

Классификация и компоненты

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, а текущее состояние восстанавливается путём воспроизведения всех событий. Это обеспечивает полный аудит и возможность отката.

Примеры использования

Критика и ограничения

Несмотря на широкую популярность, Kafka имеет ряд ограничений и критических замечаний:

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →