Kafka Topic (топик) — это логическая категория или канал для публикации и подписки на сообщения. Это фундаментальная единица организации данных в Kafka. Топики аналогичны папкам в файловой системе или таблицам в базе данных, где сообщения хранятся и группируются по их назначению.
Ключевые характеристики
Имя топика
Каждый топик имеет уникальное имя, которое используется производителями (producers) для публикации сообщений и потребителями (consumers) для их чтения. Существуют ограничения на использования специальных символов и зарегистрированных слов. Для удобства пользования лучше продумать политику именования топиков и следовать ей неукоснительно. Простое информативное иерархическое имя, возможно с цифровым префиксом позволит Вам легко разобраться в сотнях топиков в консоли или GUI.
Разделы (Partitions) и Репликация (Replication)
Топики делятся на разделы (partitions). Раздел — это упорядоченный, неизменяемый журнал сообщений. Каждое сообщение, добавленное в раздел, получает последовательный идентификатор, называемый смещением (offset). Разделы позволяют Kafka масштабироваться горизонтально, так как данные топика могут быть распределены по нескольким брокерам (брокеры — это серверы Kafka). Чем больше разделов, тем выше параллелизм обработки сообщений.
Каждый раздел может быть реплицирован на несколько брокеров. Это обеспечивает отказоустойчивость: если один брокер выходит из строя, его реплики на других брокерах могут продолжить обслуживать запросы. Количество реплик для раздела называется фактором репликации (replication factor). Одна из реплик является лидером (leader), а остальные — последователями (followers). Только лидер обрабатывает операции записи и чтения, а последователи синхронизируются с лидером.
Срок хранения сообщений (Retention Policy) и очередность сообщений в топиках Kafka
Kafka позволяет настроить политику хранения сообщений для каждого топика. Сообщения могут храниться в течение определенного периода времени (например, 7 дней) или до достижения определенного размера. По истечении срока хранения старые сообщения автоматически удаляются. Внутри одного раздела Kafka гарантирует порядок сообщений: сообщения записываются и читаются в том порядке, в котором они были опубликованы. Однако порядок сообщений между разными разделами не гарантируется.
Принцип работы топиков
Когда производитель отправляет сообщение в топик, он указывает имя топика. Kafka распределяет это сообщение по одному из разделов топика, используя ключ сообщения (если он есть) для обеспечения детерминированного распределения или круговой алгоритм (round-robin), если ключ отсутствует. Потребители, подписанные на топик, могут читать сообщения из одного или нескольких разделов. Каждый потребитель в одной группе потребителей читает сообщения из уникального подмножества разделов, что позволяет параллельно обрабатывать сообщения.
Примеры использования
Топики Kafka используются в широком спектре сценариев, включая:
- Сбор логов: Различные сервисы публикуют свои логи в топик ‘application_logs’.
- Потоковая обработка данных: Данные о продажах отправляются в топик ‘sales_events’ для анализа в реальном времени.
- Обмен сообщениями: Микросервисы обмениваются сообщениями через топики для асинхронной коммуникации.
- Отслеживание событий: События пользовательской активности (например, клики, просмотры страниц) публикуются в топик ‘user_activity’.
Управление топиками: Утилиты командной строки и примеры
Управление топиками осуществляется с помощью утилит командной строки Kafka (например, kafka-topics.sh
) или через клиентские библиотеки.
Создание нового топика
Создание топика с 3 разделами и фактором репликации 1:
bin/kafka-topics.sh --create --topic my_new_topic --bootstrap-server localhost:9092 --partitions 9 --replication-factor 3
Обратите внимание на предупреждение о том что нельзя использовать точки “.” вместе с подчеркиванием “_”.
Просмотр списка топиков
Получение списка всех доступных топиков:
bin/kafka-topics.sh --list --bootstrap-server localhost:9092
Описание топика
Просмотр детальной информации о конкретном топике, включая его разделы, реплики и лидеров:
bin/kafka-topics.sh --describe --topic my_new_topic --bootstrap-server localhost:9092
Изменение топика (добавление разделов)
Увеличение количества разделов для существующего топика (обратите внимание: уменьшить количество разделов невозможно):
bin/kafka-topics.sh --alter --topic my_new_topic --bootstrap-server localhost:9092 --partitions 5
Удаление топика
Удаление топика (требуется активация в настройках брокера delete.topic.enable=true
):
bin/kafka-topics.sh --delete --topic my_new_topic --bootstrap-server localhost:9092
Использованные источники и материалы: