В прошлом уроке мы разобрали топики, партиции и брокеры в песочнице. Песочница удобна, но это симулятор. Сегодня запустим настоящую Kafka у себя на компьютере, создадим топик для «Гонца», запишем в него заказы и прочитаем их обратно. Понадобится только Docker.
Тестовая кухня
Прежде чем открыть ресторан, повар готовит на домашней кухне. Плита одна, помощников нет, но блюда настоящие: тот же рецепт, те же продукты. Если суп получился дома, он получится и на большой кухне.
Kafka из одного брокера в Docker это домашняя кухня. В продакшене у «Гонца» будет кластер из нескольких брокеров, но команды, топики и сообщения там те же самые.
Запуск
Kafka распространяется официальным образом Docker apache/kafka. Одна команда запускает брокер версии 4.3.1 и пробрасывает порт 9092, на котором Kafka принимает клиентов:
docker run -d --name kafka -p 9092:9092 apache/kafka:4.3.1
Через несколько секунд брокер готов. Проверить можно по логу контейнера:
docker logs kafka | grep "Kafka Server started"
[2026-10-11 17:02:17,355] INFO [KafkaRaftServer nodeId=1] Kafka Server started (kafka.server.KafkaRaftServer)
Обрати внимание на слово KafkaRaftServer. С версии 4.0 Kafka управляет кластером сама, через встроенный протокол KRaft. Раньше для этого нужен был отдельный сервис ZooKeeper, и в старых инструкциях ты ещё встретишь его. Сейчас он не нужен: один контейнер это целый кластер из одного брокера. Как KRaft устроен, разберём в уроке про внутреннее устройство.
Где лежат команды
Вместе с Kafka поставляются консольные утилиты: скрипты в папке /opt/kafka/bin внутри контейнера. Каждой утилите нужно сказать, к какому брокеру подключаться, через флаг --bootstrap-server localhost:9092. Запускать их будем через docker exec:
docker exec -it kafka /opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
Пока топиков нет, и команда ничего не напечатает. Дальше в уроке для краткости пишем команды без docker exec -it kafka /opt/kafka/bin/, но в терминале этот префикс нужен.
Топик
Создаём топик orders на три партиции:
kafka-topics.sh --bootstrap-server localhost:9092 --create --topic orders --partitions 3
Created topic orders.
Смотрим, что получилось:
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic orders
Topic: orders TopicId: 8P3mkw3qTEup0oTW-a8eQw PartitionCount: 3 ReplicationFactor: 1 Configs: min.insync.replicas=1,segment.bytes=1073741824
Topic: orders Partition: 0 Leader: 1 Replicas: 1 Isr: 1 Elr: LastKnownElr:
Topic: orders Partition: 1 Leader: 1 Replicas: 1 Isr: 1 Elr: LastKnownElr:
Topic: orders Partition: 2 Leader: 1 Replicas: 1 Isr: 1 Elr: LastKnownElr:
Брокер один, поэтому лидер всех трёх партиций это брокер 1, и копия у каждой партиции одна: ReplicationFactor: 1. TopicId у тебя будет другой, Kafka выдаёт его случайно. Elr и LastKnownElr пока пустые, это служебные списки для выбора лидера, нам они не понадобятся.
урок из курса
Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.