Начало работы с Kafka

Apache Kafka является одной из наиболее популярных систем для обмена сообщениями в распределённых информационных системах. В этой статье рассматривается базовое устройство Kafka, терминология, установка и запуск для локальной разработки, а так же выполнение базовых операций из командной строки и из приложения на языке программирования Java.

Что такое Kafka?

Apache Kafka — это система стриминга событий (или сообщений). В основе процесса обмена сообщениями в Kafka лежит стрим или поток данных — абстрактная упорядоченная структура данных, которая предусматривает только добавление новых элементов в её конец.

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

В Apache Kafka стрим называется топиком и может быть разделён на несколько партиций для повышения производительности системы. Отправитель, создатель или продюсер (producer) — это приложение, которое создаёт новые сообщения в топиках. Отправитель может указать ключ и значение сообщения. Ключ используется для определения партиции, в которую будет добавлено сообщение, если отправитель не указал её явно. Все сообщения с одним ключом попадают в одну партицию. Если отправитель при добавлении нового сообщения не указывает партицию или ключ, то сообщения равномерно распределяются между партициями.

Ключи и значения Kafka хранит в виде последовательности байтов, что даёт большую гибкость при выборе типов данных, которые могут быть использованы в клиентах.

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

Получатели и отправители не зависят друг от друга: каждая группа получателей получает все сообщения, вне зависимости от получения сообщения другими группами, а отправители могут параллельно отправлять сообщения в одни и те же топики и не ждут, когда сообщение будет прочитано получателями.

Установка и запуск

Apache Kafka, как и многие другие инструменты, может быть установлена локально или развёрнута в контейнере, например в Docker.

Локальная установка

Для локальной установки вам потребуется JRE 8+, но желательно использовать JRE 17+, так как с релизом Apache Kafka 4.0 поддержка JRE 8 и 11 будет прекращена.

Для локальной установки вам потребуется скачать дистрибутив, выбирайте вариант с любой версией Scala, в данный момент это непринципиально. Дистрибутив помимо Kafka содержит Apache ZooKeeper — сервис для хранения метаданных и конфигов сервисов, который используется в качестве реестра сервисов при развёртывании кластера Kafka. Вместо ZooKeeper может быть использован KRaft — Apache Kafka Raft, собственный протокол для обмена метаданными в кластере, который в итоге должен убрать зависимость Kafka от ZooKeeper. Вы можете выбрать, как будет запускать Kafka — с KRaft или с ZooKeeper.

Запуск с KRaft

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

Запуск с ZooKeeper

Для запуска Kafka с ZooKeeper нужно так же вы полнить команды в директории с дистрибутивом сервиса:

Обратите внимание на то, что при запуске с KRaft и ZooKeeper используются разные файлы свойств для сервиса. Через некоторое время после выполнения kafka-server-start.sh сервис запустится и станет доступен.

Для остановки сервиса достаточно использовать комбинацию клавиш Ctrl+C сначала в терминале с Apache Kafka, затем — в терминале с ZooKeeper.

Запуск в контейнере

Для запуска в контейнере доступно два официальных образа: apache/kafka и apache/kafka-native, использующий нативный образ, собранный при помощи GraalVM.

Простейший вариант запуска:

После запуска сервиса он будет доступен по адресу localhost:9092, и будет можно приступать к его использованию.

Инструменты CLI

Дистрибутив Apache Kafka в директории bin содержит утилиты командной строки, позволяющие работать с сервисом. В данной статье я рассмотрю некоторые из них:

  • kafka-console-producer.sh — утилита для публикации сообщений
  • kafka-console-consumer.sh — утилита для получения сообщений
  • kafka-topics.sh — утилита для работы с топиками

Для ознакомления со справкой к каждой утилите выполните её с флагом --help.

Работа с топиками

Давайте создадим топик selmag.order-management.order с 5 партициями:

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

Получить список топиков и подробную информацию о них можно при помощи той же утилиты:

Удалить топик тоже можно при помощи этой утилиты:

Получение событий

Для подписки на события можно использовать утилиту kafka-console-consumer.sh:

Но пока что на экране ничего нет, так как в топике нет сообщений. Откройте новое окно терминала и отправьте несколько сообщений.

Отправка событий

Отправить сообщения в топик можно при помощи kafka-console-producer.sh:

Все три отправленные сообщения должны появиться в окне получателя.

В следующей статье будет рассмотрены базовые примеры работы с Apache Kafka в приложении на языке программирования Java.