Полноценный курс для изучения Apache Kafka с нуля до продвинутого уровня за 3-4 недели.
make install
# или: go mod download
make quickstart
# Это запустит Kafka, создаст топики и подготовит окружение
⏳ Подождите 60 секунд. Kafka UI будет доступен на http://localhost:8080
Терминал 1 - Consumer:
make lesson02
Терминал 2 - Producer:
make lesson01
🎉 Готово! Вы увидите, как сообщения передаются через Kafka в реальном времени!
Apache Kafka - это распределённая платформа потоковой передачи данных.
- Publish/Subscribe - публикация и подписка на потоки данных
- Storage - надёжное хранение потоков (дни/недели)
- Processing - обработка в реальном времени
- Producer - отправляет сообщения в Kafka
- Consumer - читает сообщения из Kafka
- Topic - категория сообщений (как таблица в БД)
- Partition - часть топика для параллелизма
- Broker - сервер Kafka
- Consumer Group - группа консюмеров для распределения нагрузки
- Offset - позиция сообщения в партиции
✅ Высокая нагрузка (100k+ сообщений/сек) ✅ Event-driven архитектура ✅ Real-time обработка потоков ✅ Агрегация логов и метрик ✅ Микросервисы
❌ Простой request-response ❌ Малая нагрузка (<1k сообщений/сек) ❌ Нужен только pub-sub без истории
Урок 1: Простой Producer (2 часа)
- Создание Producer
- Отправка сообщений
- Обработка подтверждений
- 📁
examples/lesson01/
Урок 2: Простой Consumer (2 часа)
- Создание Consumer
- Чтение сообщений
- Auto-commit offset
- Graceful shutdown
- 📁
examples/lesson02/
Урок 3: Ключи и партиционирование (2 часа)
- Ключи сообщений
- Партиционирование
- Гарантия порядка
- 📁
examples/lesson03/
Урок 4: Consumer Groups (2 часа)
- Группы консюмеров
- Rebalancing
- Масштабирование
- 📁
examples/lesson04/
Урок 5: Управление Offset (2 часа)
- Manual commit
- Batch commit
- Seeking to offset
- Идемпотентность
Урок 6: Обработка ошибок (2 часа)
- Retry стратегии
- Dead Letter Queue (DLQ)
- Transient vs permanent errors
- Circuit breaker pattern
Урок 7: Производительность (2 часа)
- Batching и compression
- Параллельная обработка
- Настройка параметров
- Benchmarking
Урок 8: Мониторинг (2 часа)
- Метрики Producer/Consumer
- Consumer lag
- Health checks
- Structured logging
Проект 1: E-commerce система (5 часов)
- Event Sourcing
- Saga pattern
- Распределённые транзакции
Проект 2: Агрегация логов (5 часов)
- Парсинг логов
- Агрегация статистики
- Real-time алерты
Проект 3: Real-time метрики (5 часов)
- Windowed aggregation
- Percentiles
- Anomaly detection
Проект 4: Change Data Capture (5 часов)
- Отслеживание изменений БД
- Репликация в разные системы
Теория (20 мин):
Producer отправляет сообщения в Kafka топики.
Основные параметры:
config := &kafka.ConfigMap{
"bootstrap.servers": "localhost:9092", // Адрес брокера
"client.id": "my-producer", // ID клиента
"acks": "all", // Ждать подтверждения от всех реплик
}
Параметр acks
:
0
- не ждать подтверждения (быстро, но можно потерять данные)1
- от leader партицииall
- от всех in-sync реплик (надёжно)
Практика (1.5 часа):
# Запустить Producer
cd examples/lesson01/producer
go run main.go
Код отправляет 10 JSON сообщений в топик hello-kafka
.
Задания:
- Измените количество сообщений на 5
- Добавьте поля
Author
иPriority
в структуруMessage
- Добавьте счётчик успешных/неудачных отправок
- Сделайте непрерывную отправку с остановкой по Ctrl+C
Вопросы:
- Что произойдёт, если Kafka недоступен?
- Зачем нужен
producer.Flush()
? - Чем отличается
acks=1
отacks=all
?
Теория (20 мин):
Consumer читает сообщения из топиков.
Основные параметры:
config := &kafka.ConfigMap{
"bootstrap.servers": "localhost:9092",
"group.id": "my-group", // Группа консюмеров
"auto.offset.reset": "earliest", // earliest или latest
"enable.auto.commit": true, // Авто-сохранение offset
}
Offset - позиция сообщения в партиции. Consumer запоминает, до какого offset'а прочитал.
Практика (1.5 часа):
# Терминал 1 - Consumer
cd examples/lesson02/consumer
go run main.go
# Терминал 2 - Producer
cd examples/lesson01/producer
go run main.go
Consumer получит все сообщения от Producer!
Задания:
- Измените
auto.offset.reset
наlatest
- Добавьте статистику каждые 5 секунд
- Подпишитесь на несколько топиков
- Фильтруйте сообщения (только с чётным ID)
- Реализуйте manual commit
Вопросы:
- Зачем нужен
group.id
? - Что будет, если Consumer упадёт до commit?
- Можно ли читать один топик несколькими группами?
Теория (30 мин):
Партиция - часть топика. Топик разделяется на партиции для параллелизма.
Без ключа: сообщения распределяются равномерно (round-robin)
Message 1 → Partition 0
Message 2 → Partition 1
Message 3 → Partition 2
С ключом: partition = hash(key) % num_partitions
Message (key="user-1") → Partition 0
Message (key="user-1") → Partition 0 ← Та же партиция!
Зачем нужны ключи:
- Гарантия порядка для связанных событий
- Все события одного пользователя в одной партиции
Практика (1.5 часа):
# Создать топик с 3 партициями
docker exec -it kafka kafka-topics --create \
--topic orders --bootstrap-server localhost:9092 \
--partitions 3 --replication-factor 1
# Терминал 1
cd examples/lesson03/consumer
go run main.go
# Терминал 2
cd examples/lesson03/producer
go run main.go
Producer отправляет заказы от 3 пользователей. Все заказы одного пользователя попадут в одну партицию!
Задания:
- Добавьте больше пользователей (5-10)
- Создайте Producer без ключей - сравните распределение
- Используйте
Product
как ключ вместоUserID
- Создайте тест: отправьте 100 сообщений с одним ключом, проверьте порядок
Вопросы:
- Что будет при добавлении новой партиции?
- Можно ли гарантировать порядок между разными ключами?
- Что если все сообщения с одним ключом?
Теория (30 мин):
Consumer Group - группа консюмеров, работающих вместе.
Правила:
- Каждая партиция читается только одним консюмером в группе
- Один консюмер может читать несколько партиций
Topic (3 партиции):
P0 ──→ Consumer A ─┐
P1 ──→ Consumer B ─┤ Group "app"
P2 ──→ Consumer C ─┘
Rebalancing - перераспределение партиций при:
- Добавлении консюмера
- Падении консюмера
- Изменении числа партиций
Разные группы независимы:
Topic → Group "orders" (обработка)
→ Group "analytics" (аналитика)
→ Group "audit" (аудит)
Практика (1.5 часа):
# Создать топик
docker exec -it kafka kafka-topics --create \
--topic events --bootstrap-server localhost:9092 \
--partitions 6 --replication-factor 1
# Терминал 1 - Producer
cd examples/lesson04/producer
go run main.go
# Терминалы 2-4 - Consumers
cd examples/lesson04/consumer
go run main.go 1 # Consumer 1
go run main.go 2 # Consumer 2
go run main.go 3 # Consumer 3
Наблюдайте, как партиции распределяются между консюмерами!
Задания:
- Запустите 6 консюмеров - что произойдёт?
- Остановите один - наблюдайте rebalancing
- Проверьте состояние группы:
make consumer-groups
- Измерьте throughput с 1, 3 и 6 консюмерами
- Создайте вторую группу - убедитесь в независимости
Вопросы:
- Сколько консюмеров нужно для топика с 3 партициями?
- Что если консюмеров больше, чем партиций?
- Как часто происходит rebalancing?
# Инфраструктура
make start # Запустить Kafka
make stop # Остановить Kafka
make restart # Перезапустить
make status # Статус контейнеров
make logs # Логи Kafka
make ui # Открыть Kafka UI
# Разработка
make install # Установить зависимости
make build # Собрать примеры
make fmt # Форматировать код
make test # Запустить тесты
# Топики
make topics # Список топиков
make create-topics # Создать топики для уроков
make describe-topics # Информация о топиках
# Уроки
make lesson01 # Producer (Урок 1)
make lesson02 # Consumer (Урок 2)
make lesson03-producer # Producer с ключами
make lesson03-consumer # Consumer с ключами
make lesson04-producer # Непрерывный Producer
make lesson04-consumer ID=1 # Consumer в группе
# Утилиты
make consumer-groups # Список Consumer Groups
make clean # Удалить все данные
make quickstart # Всё в одной команде
# Управление контейнерами
docker-compose up -d # Запустить
docker-compose down # Остановить
docker-compose down -v # Остановить + удалить данные
docker-compose logs -f kafka # Логи
docker-compose restart # Перезапустить
docker-compose ps # Статус
# Создать топик
docker exec -it kafka kafka-topics --create \
--topic my-topic --bootstrap-server localhost:9092 \
--partitions 3 --replication-factor 1
# Список топиков
docker exec -it kafka kafka-topics --list \
--bootstrap-server localhost:9092
# Описание топика
docker exec -it kafka kafka-topics --describe \
--topic my-topic --bootstrap-server localhost:9092
# Удалить топик
docker exec -it kafka kafka-topics --delete \
--topic my-topic --bootstrap-server localhost:9092
# Список групп
docker exec -it kafka kafka-consumer-groups --list \
--bootstrap-server localhost:9092
# Информация о группе
docker exec -it kafka kafka-consumer-groups --describe \
--group my-group --bootstrap-server localhost:9092
# Сброс offset на earliest
docker exec -it kafka kafka-consumer-groups \
--reset-offsets --group my-group --topic my-topic \
--to-earliest --execute --bootstrap-server localhost:9092
# Консольный Producer
docker exec -it kafka kafka-console-producer \
--topic test --bootstrap-server localhost:9092
# Консольный Consumer
docker exec -it kafka kafka-console-consumer \
--topic test --bootstrap-server localhost:9092 --from-beginning
# Проверить порты
lsof -i :9092
lsof -i :2181
# Проверить логи
docker-compose logs kafka
# Полная очистка
docker-compose down -v
docker-compose up -d
- Проверьте, что топик существует:
make topics
- Проверьте offset группы:
make consumer-groups
- Измените
group.id
на новый - Используйте
auto.offset.reset: earliest
go clean -modcache
go mod download
go mod tidy
Kafka ещё не запустился. Подождите 60 секунд после docker-compose up
.
- "Kafka: The Definitive Guide" - O'Reilly
- "Designing Event-Driven Systems" - Ben Stopford
kafka/
├── README.md ← Вы здесь
├── docker-compose.yml ← Kafka окружение
├── go.mod ← Go зависимости
├── Makefile ← Команды
│
├── examples/ ← Уроки
│ ├── lesson01/ ← Простой Producer
│ ├── lesson02/ ← Простой Consumer
│ ├── lesson03/ ← Ключи и партиции
│ ├── lesson04/ ← Consumer Groups
│ ├── lesson05/ ← Управление offset
│ ├── lesson06/ ← Обработка ошибок
│ ├── lesson07/ ← Производительность
│ └── lesson08/ ← Мониторинг
│
├── scenarios/ ← Реальные проекты
│ ├── ecommerce/ ← E-commerce система
│ ├── logs/ ← Агрегация логов
│ ├── metrics/ ← Real-time метрики
│ └── cdc/ ← Change Data Capture
│
├── scripts/ ← Утилиты
│ ├── start.sh
│ ├── stop.sh
│ ├── create-topics.sh
│ └── ...
│
├── docs/ ← Документация
│ └── theory.md ← Подробная теория
│
└── pkg/ ← Переиспользуемый код
- Не спешите - лучше глубоко понять основы
- Запускайте код - теория без практики бесполезна
- Экспериментируйте - меняйте параметры, ломайте вещи
- Делайте заметки - записывайте insights
- Применяйте - придумайте свой проект
- Урок 1: Producer
- Урок 2: Consumer
- Урок 3: Партиционирование
- Урок 4: Consumer Groups
- Урок 5: Offset Management
- Урок 6: Error Handling
- Урок 7: Performance
- Урок 8: Monitoring
- Проект 1: E-commerce
- Проект 2: Log Aggregation
- Проект 3: Metrics
- Проект 4: CDC
Сегодня пройдите Уроки 1-2:
- Запустить Kafka
- Отправить сообщения
- Получить сообщения
- Понять основы
Это займёт 2-3 часа. Начните прямо сейчас! 🚀
make quickstart # Запустить всё
make lesson02 # Терминал 1
make lesson01 # Терминал 2
MIT License - смотрите LICENSE
Удачи в изучении Kafka! 🎓