Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 1

Основы Kafka: компоненты и управление через консоль

Recommended resources

Здравствуйте! Добро пожаловать на наш первый урок по Apache Kafka.

Введение

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

Цель этого урока: Объяснить роль ключевых компонентов Kafka (брокер, топик, партиция, офсет) и продемонстрировать их создание и инспекцию с помощью консольных утилит.

Мы начнем с теоретического обзора архитектуры Kafka, а затем перейдем к практике: развернем Kafka локально с помощью Docker и поработаем с ней через командную строку. Ваш опыт в backend-разработке и работе с Docker поможет вам быстро освоить практическую часть, а опыт в дизайне — лучше воспринять визуальные аспекты архитектуры распределенных систем.


1. Что такое Kafka и зачем она нужна?

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

Kafka была создана в LinkedIn именно для решения этой задачи — обработки огромных потоков событий (event streams) с высокой скоростью и надежностью. Она выступает в роли центральной нервной системы для приложений, позволяя различным сервисам асинхронно обмениваться данными.

Чтобы получить общее представление о том, что такое Kafka и какие проблемы она решает, посмотрите следующее короткое видео.

Learn Kafka in 10 Minutes | Most Important Skill for Data Engineering

В этом видео от Darshil Parmar объясняется, почему возникла потребность в системах потоковой обработки данных, и как Kafka стала решением.

Посмотрите фрагмент с 00:00 до 03:08. Обратите внимание на разницу между пакетной и потоковой обработкой данных.

2. Ключевые компоненты архитектуры Kafka

Теперь давайте детально разберем основные строительные блоки Kafka. Это брокер, топик, партиция и офсет.

Капча: Схематическое изображение архитектуры Kafka. Продюсеры (Producers) отправляют сообщения в брокер (Broker), который хранит их в топиках (Topics). Топики разделены на партиции (Partitions), где у каждого сообщения есть свой офсет (Offset). Консьюмеры (Consumers) читают сообщения из партиций.

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

Apache Kafka® Components & Architecture Detailed Explanation in 15 min | Javatechie

Это видео от канала Java Techie подробно и последовательно разбирает каждый компонент архитектуры Kafka.

Мы будем обращаться к разным частям этого видео. Сейчас вы можете ознакомиться с общей структурой, а затем смотреть конкретные фрагменты по ходу урока.

Брокер (Broker) и Кластер (Cluster)

  • Брокер — это, по сути, один сервер Kafka. Его задача — принимать сообщения от отправителей (продюсеров), сохранять их и отдавать получателям (консьюмерам).
  • Несколько брокеров, работающих вместе, образуют кластер Kafka. Кластер обеспечивает отказоустойчивость (если один брокер выйдет из строя, другие продолжат работу) и масштабируемость (можно добавлять новые брокеры для увеличения производительности и объема хранения).

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

Посмотрите: Фрагмент о брокере и кластере в видео от Java Techie (с 00:02:07 по 00:03:03).

Топик (Topic)

  • Топик — это именованный канал или категория, в которую публикуются сообщения. Можно провести аналогию с таблицей в базе данных: все связанные данные (например, все события о заказах) хранятся в одном месте. Продюсеры пишут данные в топики, а консьюмеры читают их из топиков.
  • Сообщения в Kafka неизменяемы (immutable) и добавляются только в конец, как в лог-файле.
Капча: Иллюстрация, показывающая один топик (Topic), который разделен на три партиции (Partition 0, 1, 2). Все они управляются одним брокером (Broker 1). Внутри каждой партиции сообщения упорядочены и пронумерованы офсетами.

Посмотрите: Фрагмент о топиках в видео от Java Techie (с 00:03:03 по 00:07:46).

Партиция (Partition)

  • Каждый топик делится на одну или несколько партиций. Именно партиции физически хранятся на брокерах. Разделение топика на партиции — это ключ к параллелизму в Kafka.
  • Разные партиции одного топика могут находиться на разных брокерах в кластере. Это позволяет распределить нагрузку как на запись, так и на чтение.
  • Важный момент: Kafka гарантирует порядок сообщений только в пределах одной партиции.

Посмотрите: Фрагмент о партициях в видео от Java Techie (с 00:07:46 по 00:09:48).

Офсет (Offset)

  • Офсет — это уникальный последовательный номер, который присваивается каждому сообщению внутри партиции. Он идентифицирует позицию сообщения в партиции.
  • Офсеты монотонно возрастают (0, 1, 2, 3...).
  • Консьюмеры используют офсет, чтобы отслеживать, какие сообщения они уже прочитали. Когда консьюмер перезапускается, он может продолжить чтение с последнего сохраненного офсета, что обеспечивает надежную обработку.

Посмотрите: Фрагмент об офсетах в видео от Java Techie (с 00:09:48 по 00:11:12).

Zookeeper

В большинстве текущих инсталляций Kafka используется Zookeeper. Это отдельный сервис, который отвечает за координацию брокеров в кластере: хранит метаданные (какие топики существуют, кто является лидером для каждой партиции и т.д.), отслеживает состояние брокеров и управляет выборами лидера.

Важно: В новых версиях Kafka появляется режим без Zookeeper (KRaft), но пока важно знать о его роли, так как вы будете часто встречать его в проектах и документации.

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

Why Kafka? A Developer-Friendly Guide to Event-Driven ...

Эта статья «Why Kafka? A Developer-Friendly Guide» от Athreya на dev.to содержит отличный раздел «How Kafka Works», который поможет вам систематизировать знания о ключевых компонентах.

Прочитайте раздел «How Kafka Works». Обратите особое внимание на пункты 2 (Topic), 4 (Partition), 8 (Broker) и 7 (Offset Management).


3. Практика: работа с Kafka через консольные утилиты

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

Шаг 1: Настройка окружения с помощью Docker

Поскольку у вас есть опыт работы с Docker, этот шаг будет простым. Мы используем docker-compose для запуска Kafka и Zookeeper.

  1. Создайте в вашем рабочем каталоге файл с именем docker-compose.yml.

  2. Скопируйте в него следующее содержимое:

    version: '3.8'
    services:
      zookeeper:
        image: confluentinc/cp-zookeeper:7.3.0
        container_name: zookeeper
        environment:
          ZOOKEEPER_CLIENT_PORT: 2181
          ZOOKEEPER_TICK_TIME: 2000
    
      kafka:
        image: confluentinc/cp-kafka:7.3.0
        container_name: kafka
        ports:
          - "9092:9092"
        depends_on:
          - zookeeper
        environment:
          KAFKA_BROKER_ID: 1
          KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
          KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_INTERNAL:PLAINTEXT
          KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,PLAINTEXT_INTERNAL://kafka:29092
          KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
          KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
          KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
    
  3. Откройте терминал в каталоге с этим файлом и выполните команду:

    docker-compose up -d
    

    Эта команда скачает образы и запустит два контейнера: zookeeper и kafka.

Шаг 2: Подключение к контейнеру Kafka

Все утилиты командной строки находятся внутри контейнера kafka. Чтобы получить к ним доступ, выполните команду:

docker exec -it kafka /bin/bash

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

Шаг 3: Создание и инспекция топиков

Консольная утилита kafka-topics.sh позволяет управлять топиками.

  1. Создание топика

    Давайте создадим наш первый топик с именем orders с 3 партициями.

    kafka-topics.sh --create \
      --topic orders \
      --bootstrap-server localhost:9092 \
      --partitions 3 \
      --replication-factor 1
    
    • --topic orders: имя нашего топика.
    • --bootstrap-server localhost:9092: адрес брокера Kafka для подключения.
    • --partitions 3: количество партиций для этого топика.
    • --replication-factor 1: сколько копий каждой партиции хранить. Так как у нас всего один брокер, мы ставим 1. В продакшн-кластере это значение обычно 3.
  2. Просмотр списка топиков

    kafka-topics.sh --list --bootstrap-server localhost:9092
    

    Вы должны увидеть в списке наш топик orders.

  3. Инспекция (описание) топика

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

    kafka-topics.sh --describe --topic orders --bootstrap-server localhost:9092
    

    Вывод будет выглядеть примерно так:

    Topic: orders   TopicId: <some_id>     PartitionCount: 3       ReplicationFactor: 1    Configs:
        Topic: orders   Partition: 0    Leader: 1       Replicas: 1     Isr: 1
        Topic: orders   Partition: 1    Leader: 1       Replicas: 1     Isr: 1
        Topic: orders   Partition: 2    Leader: 1       Replicas: 1     Isr: 1
    

    Здесь мы видим, что наш топик orders состоит из трех партиций (0, 1, 2). Для каждой партиции указан Leader (лидирующий брокер, который обрабатывает чтение и запись, в нашем случае это брокер с ID 1), Replicas (список брокеров, хранящих копию партиции) и Isr (In-Sync Replicas — реплики, которые не отстают от лидера).

Шаг 4: Отправка и чтение сообщений

Теперь воспользуемся консольными продюсером и консьюмером. Для этого нам понадобится два окна терминала, подключенных к контейнеру kafka.

  1. Запуск консьюмера (в первом терминале)

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

    kafka-console-consumer.sh --topic orders \
      --bootstrap-server localhost:9092 \
      --from-beginning
    

    Терминал перейдет в режим ожидания сообщений.

  2. Запуск продюсера и отправка сообщений (во втором терминале)

    Запустим продюсер в интерактивном режиме.

    kafka-console-producer.sh --topic orders --bootstrap-server localhost:9092
    

    После запуска вы увидите приглашение >. Теперь вы можете вводить сообщения. Каждая строка будет отправлена как отдельное сообщение.

    Введите несколько сообщений, например:

    >New order: 123
    >New order: 456
    >Order 123 updated
    
  3. Наблюдение за результатом

    Вернитесь в первый терминал (где запущен консьюмер). Вы увидите, что все отправленные вами сообщения появились на экране. Это демонстрирует полный цикл: продюсер отправил сообщения в топик, брокер их сохранил, а консьюмер прочитал.

Чтобы выйти из продюсера или консьюмера, нажмите Ctrl+C. Чтобы остановить и удалить контейнеры, выполните docker-compose down в каталоге с docker-compose.yml.



Заключение

Поздравляю с завершением первого урока!

Ключевые выводы:

  • Брокер — это сервер Kafka, а кластер — группа брокеров, обеспечивающая масштабируемость и отказоустойчивость.
  • Топик — это именованный поток событий, аналог таблицы в БД.
  • Партиция — это часть топика, являющаяся основной единицей параллелизма. Порядок сообщений гарантируется только в пределах одной партиции.
  • Офсет — это уникальный ID сообщения внутри партиции, который позволяет консьюмерам отслеживать прогресс чтения.
  • С помощью консольных утилит (kafka-topics.sh, kafka-console-producer.sh, kafka-console-consumer.sh) можно управлять топиками и обмениваться сообщениями.

Что дальше?

В этом уроке мы отправляли сообщения без ключа, и Kafka распределяла их по партициям в режиме round-robin. В следующем уроке мы разберем, как ключ сообщения (message key) влияет на распределение сообщений по партициям. Это фундаментальный механизм для обеспечения того, чтобы связанные сообщения (например, все события для одного заказа) попадали в одну и ту же партицию и обрабатывались последовательно.