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

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
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru