Всем привет! Меня зовут Вадим, и я QA-инженер в IT-компании Intelsy. В современной разработке программного обеспечения всё чаще встречаются распределённые системы и микросервисная архитектура. Один из ключевых инструментов, обеспечивающих надёжное и масштабируемое взаимодействие между сервисами, — это Apache Kafka — распределённая платформа потоковой обработки и передачи сообщений. Для специалиста по обеспечению качества понимание принципов работы Kafka критически важно.

Apache Kafka – это распределенная платформа потоковой передачи данных с открытым исходным кодом. Она используется для построения высокопроизводительных конвейеров данных, стриминговых приложений и обработки событий в режиме реального времени. Kafka стала одной из самых популярных технологий для обработки больших объёмов данных и обеспечения высокой пропускной способности.

Что такое потоковая передача данных?

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

Ключевые концепции Apache Kafka:

1.    Топики (Topics):

Топик – централизованные хранилища данных, которые используются для обмена информацией между производителями (продюсерами) и потребителями (консьюмерами).

Можно представить топик как именованный канал, к которому производители (продюсеры) отправляют сообщения, а потребители (консьюмеры) подписываются для их получения.

Топики разделены на партиции (Partitions) для параллельной обработки.

Архитектура взаимодействия Producers, Topic и Consumer Group в Apache Kafka
Архитектура взаимодействия Producers, Topic и Consumer Group в Apache Kafka

2.     Партиции (Partitions):

Каждая партиция – это упорядоченная, неизменяемая последовательность записей (сообщений).

Сообщения в партиции упорядочены по времени их поступления.

Распределение партиций по брокерам (серверам Kafka) обеспечивает масштабируемость и отказоустойчивость.

Модель взаимодействия компонентов Kafka: производители, топики с партициями
Модель взаимодействия компонентов Kafka: производители, топики с партициями

3.    Продюсеры (Producers):

Продюсер отвечает за публикацию Сообщений в Топике. Это может быть любое приложение или система, которая генерирует данные и отправляет их в Kafka для дальнейшей обработки. Продюсеры могут отправлять сообщения в конкретные партиции или позволить Kafka автоматически распределять их.

4.    Консьюмеры (Consumers):

Консьюмер считывает сообщения из Топиков. Это может быть любое приложение или система, которая подписывается на один или несколько Топиков и потребляет Сообщения, созданные Продюсерами. Консьюмеры могут читать сообщения из нескольких Партиций параллельно, обеспечивая масштабируемость и высокую пропускную способность.

Консьюмеры могут быть сгруппированы в потребительские группы (consumer groups).

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

5.    Брокеры (Brokers):

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

Брокеры формируют кластер Kafka - это группа взаимосвязанных брокеров Kafka, которые работают вместе для управления потоками данных, входящих и выходящих из системы Kafka.

Брокер Kafka
Брокер Kafka

6. ZooKeeper:

Зукипер - это централизованный сервис, используемый Apache Kafka для поддержки конфигурационной информации, обеспечения распределенной синхронизации и обработки выборов Лидера. Он отслеживает состояние Брокеров, Топиков, Партиций и Групп консьюмеров.
Зукипер обеспечивает надежность и согласованность путем поддержания иерархической структуры узлов, называемых znode.

Современные версии Kafka (после 3.0) могут работать без ZooKeeper с использованием Raft consensus protocol.

ZooKeeper
ZooKeeper

Ключевые концепции Apache Kafka:

1.    Параллелизм в партициях

Чтобы гарантировать порядок чтения сообщений из партиции, Kafka дает доступ к партиции только одному консюмеру (из группы консюмеров). Если партиция получает сообщения A, F и K, консюмер читает их в том же порядке: A, F и K. Это важно, ведь порядок потребления сообщений на уровне топика не гарантирован, если у вас несколько партиций.

Если консюмеров будет больше, параллелизм не увеличится. Нужно больше партиций. Чтобы два консюмера параллельно считывали данные из топика, нужно создать две партиции — по одной на каждого. Партиции в одном топике могут находиться в разных брокерах, поэтому два консюмера топика могут считывать данные из двух разных брокеров.

Kafka из двух групп консюмеров с указанием порядка внутри партиций
Kafka из двух групп консюмеров с указанием порядка внутри партиций

2.    Репликация

Репликация в Kafka работает на основе принципа лидера и последователя. Для каждой партиции в топике определена одна реплика как лидер (leader replica) и одна или несколько реплик-последователей (follower replicas).

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

Когда данные публикуются в топик, они сначала записываются на лидере. Затем лидер передает данные своим последователям в асинхронном режиме.

Это обеспечивает высокую производительность, поскольку производители и потребители работают с лидеро��, и данные реплицируются в фоновом режиме.

Порядок взаимодействия в случае выхода из строя лидера
Порядок взаимодействия в случае выхода из строя лидера

Как работает Kafka?

1.    Продюсер отправляет сообщение в топик Kafka.

2.    Сообщение добавляется в определенную партицию топика.

3.    Kafka хранит сообщения в партициях на дисках брокеров.

4.    Консьюмер подписывается на топик (или его партицию) и начинает читать сообщения.

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

6.    Сообщения могут сохраняться в течение заданного периода времени или до определенного размера, даже если их уже прочитали консьюмеры.

Преимущества Apache Kafka:

  1. Масштабируемость: Kafka легко масштабируется, позволяя обрабатывать огромные объемы данных. Можно добавлять новые брокеры для увеличения пропускной способности.

  2. Отказоустойчивость: Репликация данных между брокерами обеспечивает отказоустойчивость системы. Даже если один или несколько брокеров выйдут из строя, данные остаются доступными.

  3. Производительность: Kafka способна обрабатывать миллионы сообщений в секунду с минимальными задержками.

  4. Надежность: Kafka гарантирует доставку сообщений хотя бы один раз. Это означает, что сообщение не будет потеряно, да��е если произойдет сбой.

  5. Гибкость: Kafka поддерживает различные типы данных и интеграции с разными системами.

  6. Широкое распространение: Kafka – это популярная технология с большим сообществом и множеством ресурсов.

Основные отличия между Kafka и RabbitMQ:

  1. Модель работы: Kafka основан на модели публикации-подписки, где сообщения хранятся в логах до тех пор, пока они не будут прочитаны, тогда как RabbitMQ использует модель очередей, где сообщения удаляются после обработки.

  2. Производительность: Kafka способен обрабатывать большие объемы данных и поддерживает более высокую пропускную способность благодаря своей архитектуре. RabbitMQ подходит для меньших объемов сообщений и запросов.

  3. Хранение сообщений: в Kafka сообщения могут сохраняться на длительный срок, что позволяет повторно их читать. В RabbitMQ сообщения, как правило, удаляются после обработки.

  4. Защита от потерь: Kafka обеспечивает стойкость данных благодаря репликации и хранению. RabbitMQ также поддерживает подтверждение сообщений, но может быть менее устойчив в распределенных системах.

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

Направления использования Apache Kafka:

  1. Потоковая аналитика: Обработка и анализ данных в режиме реального времени (например, клики на веб-сайте, транзакции).

  2. Конвейеры данных: Создание надежных и масштабируемых ко��вейеров для перемещения данных между разными системами.

  3. Логирование: Централизованное логирование и мониторинг приложений.

  4. Системы обмена сообщениями: Построение асинхронных систем для обмена данными между микросервисами.

  5. Internet of Things (Интернет вещей): Сбор и обработка данных от сенсоров и устройств.

Заключение:

Apache Kafka – это мощный инструмент для построения современных потоковых систем. Его масштабируемость, отказоустойчивость и производительность делают его идеальным решением для обработки данных в реальном времени. Независимо от того, создаете ли вы систему потоковой аналитики, конвейер данных или систему обмена сообщениями, Kafka может стать надежной основой для вашего решения.