Kafka
Apache Kafka — это распределённая платформа для потоковой обработки данных с открытым исходным кодом, разработанная компанией LinkedIn и впоследствии переданная фонду Apache Software Foundation. Kafka предназначена для построения высоконагруженных конвейеров данных в реальном времени, обеспечивая надёжное хранение, передачу и обработку потоков сообщений между различными системами.
История
Проект Kafka был создан в 2010 году в LinkedIn инженерами Джеем Крепсом, Нилом Шахом и Джуном Рао. Основной целью было создание системы, способной обрабатывать огромные объёмы данных, генерируемых социальной сетью, с низкой задержкой и высокой пропускной способностью. В 2011 году проект был открыт под лицензией Apache 2.0. В 2012 году Kafka стала проектом верхнего уровня Apache Software Foundation. С тех пор платформа получила широкое распространение в индустрии, став де-факто стандартом для построения систем обработки событий и микросервисной архитектуры.
Архитектура
Архитектура Kafka основана на модели «издатель-подписчик» (pub/sub) и включает несколько ключевых компонентов:
Брокеры (Brokers)
Брокеры — это серверы, образующие кластер Kafka. Каждый брокер хранит часть данных и обрабатывает запросы от клиентов (производителей и потребителей). Кластер может состоять из одного или нескольких брокеров, что обеспечивает горизонтальное масштабирование и отказоустойчивость.
Топики (Topics)
Топик — это логическая категория или канал, в который публикуются сообщения. Каждое сообщение в топике имеет ключ, значение и временную метку. Топики могут быть разбиты на разделы (partitions), что позволяет параллельно обрабатывать данные.
Разделы (Partitions)
Раздел — это упорядоченная, неизменяемая последовательность сообщений, которая хранится на диске брокера. Каждое сообщение в разделе имеет уникальный идентификатор — смещение (offset). Разделы обеспечивают параллелизм: разные потребители могут читать данные из разных разделов одного топика одновременно.
Производители (Producers)
Производители — это клиенты, которые публикуют сообщения в топики. Они могут указывать ключ сообщения, который определяет, в какой раздел будет записано сообщение. Производители могут настраивать уровень подтверждения записи (acks) для обеспечения надёжности.
Потребители (Consumers)
Потребители — это клиенты, которые читают сообщения из топиков. Они объединяются в группы потребителей (consumer groups). Каждое сообщение в топике доставляется только одному потребителю из группы, что позволяет распределять нагрузку. Если несколько групп подписаны на один топик, каждая группа получает все сообщения независимо.
ZooKeeper и KRaft
Исторически Kafka использовала Apache ZooKeeper для управления кластером: выбора лидера, хранения метаданных и обнаружения сбоев. Начиная с версии 2.8, Kafka внедряет собственный механизм управления — KRaft (Kafka Raft), который постепенно заменяет ZooKeeper, упрощая развёртывание и эксплуатацию.
Принципы работы
Kafka обеспечивает высокую пропускную способность за счёт нескольких архитектурных решений:
- Пакетная обработка: сообщения группируются в пакеты перед записью на диск или передачей по сети.
- Последовательный ввод-вывод: данные записываются и читаются последовательно, что значительно быстрее произвольного доступа.
- Кэширование страниц: Kafka активно использует page cache операционной системы, а не собственный кэш.
- Нулевое копирование (zero-copy): при передаче данных потребителям Kafka использует системный вызов
sendfile, который копирует данные напрямую из дискового кэша в сетевой буфер, минуя прикладной уровень.
Классификация и характеристики
Типы гарантий доставки
Kafka предлагает несколько уровней гарантий доставки сообщений:
- At most once (не более одного раза): сообщение может быть потеряно, но не доставлено повторно.
- At least once (не менее одного раза): сообщение будет доставлено, но возможно повторно (по умолчанию).
- Exactly once (ровно один раз): сообщение доставляется ровно один раз, без потерь и дублирования (требует настройки идемпотентности и транзакций).
Хранение данных
Сообщения в Kafka хранятся на диске в течение заданного времени (по умолчанию 7 дней) или до достижения определённого объёма. После истечения срока хранения они удаляются. Это позволяет потребителям читать данные не только в реальном времени, но и «из прошлого» (replay).
Производительность
Kafka способна обрабатывать миллионы сообщений в секунду при задержке на уровне миллисекунд. Пропускная способность ограничивается в основном скоростью дисков и сети.
Применение
Kafka используется в широком спектре задач:
Потоковая обработка данных
Kafka часто служит центральной шиной данных (event bus) для систем потоковой обработки, таких как Apache Flink, Apache Spark Streaming, Apache Storm и Kafka Streams (встроенная библиотека потоковой обработки).
Логирование и мониторинг
Kafka заменяет традиционные системы логирования, позволяя агрегировать логи от множества сервисов и приложений в реальном времени. Примеры: сбор метрик, трейсинг запросов, анализ ошибок.
Микросервисная архитектура
В микросервисных системах Kafka используется для асинхронного обмена сообщениями между сервисами, что снижает связанность и повышает отказоустойчивость.
Аналитика в реальном времени
Kafka применяется для сбора и обработки событий пользовательской активности (клики, просмотры, покупки) для построения аналитических панелей и рекомендательных систем.
Интеграция данных
Kafka выступает в роли коннектора между различными базами данных, хранилищами и системами. Например, с помощью Kafka Connect можно синхронизировать данные между PostgreSQL, Elasticsearch и HDFS.
Примеры использования
- LinkedIn: Kafka обрабатывает более 7 триллионов сообщений в день, обеспечивая работу ленты новостей, поиска и аналитики.
- Uber: использует Kafka для сбора и обработки данных о поездках, местоположении водителей и пассажиров.
- Netflix: применяет Kafka для мониторинга производительности сервисов и сбора событий пользовательской активности.
- Yandex: использует Kafka в своей инфраструктуре для потоковой обработки данных и построения систем рекомендаций.
Критика и ограничения
Несмотря на широкую популярность, Kafka имеет ряд недостатков:
- Сложность эксплуатации: развёртывание и настройка кластера Kafka требуют высокой квалификации администраторов. Особенно сложным является управление ZooKeeper (или KRaft) и настройка параметров производительности.
- Отсутствие встроенной обработки сложных событий: Kafka не поддерживает сложные шаблоны событий (например, обнаружение последовательностей или оконные агрегации) без использования внешних библиотек.
- Проблемы с порядком сообщений: порядок сообщений гарантируется только в пределах одного раздела. Если топик имеет несколько разделов, глобальный порядок не сохраняется.
- Потребление ресурсов: для обеспечения высокой производительности Kafka требует значительных объёмов оперативной памяти и быстрых дисков (SSD).
- Отсутствие встроенной поддержки транзакций между разными топиками: хотя Kafka поддерживает транзакции, они ограничены одним кластером и не распространяются на внешние системы.
Интересные факты
- Название «Kafka» происходит от имени писателя Франца Кафки, так как создатели проекта считали, что система «кафкиански» сложна и неожиданна.
- Kafka изначально разрабатывалась как система для обработки логов активности пользователей LinkedIn, но быстро вышла за рамки этой задачи.
- В 2020 году проект Kafka был удостоен премии «ACM Software System Award» за вклад в развитие программного обеспечения.
Источники
- Apache Kafka Documentation (официальная документация проекта)
- Jay Kreps, Neha Narkhede, Jun Rao. «Kafka: a Distributed Messaging System for Log Processing» (2011)
- Gwen Shapira, Todd Palino, Rajini Sivaram, Krit Petty. «Kafka: The Definitive Guide» (O'Reilly Media, 2021)
- Статья «Apache Kafka» в вики-энциклопедии Apache Software Foundation
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →