+
Skip to content

comerc/kafka

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🚀 Учебный проект: Apache Kafka на Go

Полноценный курс для изучения Apache Kafka с нуля до продвинутого уровня за 3-4 недели.

📖 Содержание


🚀 Быстрый старт

Шаг 1: Установка зависимостей

make install
# или: go mod download

Шаг 2: Запуск Kafka

make quickstart
# Это запустит Kafka, создаст топики и подготовит окружение

⏳ Подождите 60 секунд. Kafka UI будет доступен на http://localhost:8080

Шаг 3: Первый пример

Терминал 1 - Consumer:

make lesson02

Терминал 2 - Producer:

make lesson01

🎉 Готово! Вы увидите, как сообщения передаются через Kafka в реальном времени!


🤔 Что такое Kafka?

Apache Kafka - это распределённая платформа потоковой передачи данных.

Три ключевые возможности:

  1. Publish/Subscribe - публикация и подписка на потоки данных
  2. Storage - надёжное хранение потоков (дни/недели)
  3. Processing - обработка в реальном времени

Основные концепции:

  • Producer - отправляет сообщения в Kafka
  • Consumer - читает сообщения из Kafka
  • Topic - категория сообщений (как таблица в БД)
  • Partition - часть топика для параллелизма
  • Broker - сервер Kafka
  • Consumer Group - группа консюмеров для распределения нагрузки
  • Offset - позиция сообщения в партиции

Когда использовать Kafka?

✅ Высокая нагрузка (100k+ сообщений/сек) ✅ Event-driven архитектура ✅ Real-time обработка потоков ✅ Агрегация логов и метрик ✅ Микросервисы

❌ Простой request-response ❌ Малая нагрузка (<1k сообщений/сек) ❌ Нужен только pub-sub без истории


📅 Учебный план

Неделя 1: Основы (8 часов)

Урок 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/

Неделя 2: Продвинутый уровень (8 часов)

Урок 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

Недели 3-4: Реальные проекты (20 часов)

Проект 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 часов)

  • Отслеживание изменений БД
  • Репликация в разные системы

📚 Уроки

Урок 1: Простой Producer

Теория (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.

Задания:

  1. Измените количество сообщений на 5
  2. Добавьте поля Author и Priority в структуру Message
  3. Добавьте счётчик успешных/неудачных отправок
  4. Сделайте непрерывную отправку с остановкой по Ctrl+C

Вопросы:

  • Что произойдёт, если Kafka недоступен?
  • Зачем нужен producer.Flush()?
  • Чем отличается acks=1 от acks=all?

Урок 2: Простой Consumer

Теория (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!

Задания:

  1. Измените auto.offset.reset на latest
  2. Добавьте статистику каждые 5 секунд
  3. Подпишитесь на несколько топиков
  4. Фильтруйте сообщения (только с чётным ID)
  5. Реализуйте manual commit

Вопросы:

  • Зачем нужен group.id?
  • Что будет, если Consumer упадёт до commit?
  • Можно ли читать один топик несколькими группами?

Урок 3: Ключи и партиционирование

Теория (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 пользователей. Все заказы одного пользователя попадут в одну партицию!

Задания:

  1. Добавьте больше пользователей (5-10)
  2. Создайте Producer без ключей - сравните распределение
  3. Используйте Product как ключ вместо UserID
  4. Создайте тест: отправьте 100 сообщений с одним ключом, проверьте порядок

Вопросы:

  • Что будет при добавлении новой партиции?
  • Можно ли гарантировать порядок между разными ключами?
  • Что если все сообщения с одним ключом?

Урок 4: Consumer Groups

Теория (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

Наблюдайте, как партиции распределяются между консюмерами!

Задания:

  1. Запустите 6 консюмеров - что произойдёт?
  2. Остановите один - наблюдайте rebalancing
  3. Проверьте состояние группы: make consumer-groups
  4. Измерьте throughput с 1, 3 и 6 консюмерами
  5. Создайте вторую группу - убедитесь в независимости

Вопросы:

  • Сколько консюмеров нужно для топика с 3 партициями?
  • Что если консюмеров больше, чем партиций?
  • Как часто происходит rebalancing?

🛠️ Полезные команды

Makefile команды

# Инфраструктура
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 команды

# Управление контейнерами
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

Consumer Groups

# Список групп
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

🔧 Troubleshooting

Kafka не запускается

# Проверить порты
lsof -i :9092
lsof -i :2181

# Проверить логи
docker-compose logs kafka

# Полная очистка
docker-compose down -v
docker-compose up -d

Consumer не получает сообщения

  1. Проверьте, что топик существует: make topics
  2. Проверьте offset группы: make consumer-groups
  3. Измените group.id на новый
  4. Используйте auto.offset.reset: earliest

Ошибки при компиляции Go

go clean -modcache
go mod download
go mod tidy

Ошибка "No brokers available"

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/                   ← Переиспользуемый код

💡 Советы по обучению

  1. Не спешите - лучше глубоко понять основы
  2. Запускайте код - теория без практики бесполезна
  3. Экспериментируйте - меняйте параметры, ломайте вещи
  4. Делайте заметки - записывайте insights
  5. Применяйте - придумайте свой проект

📊 Прогресс обучения

  • Урок 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:

  1. Запустить Kafka
  2. Отправить сообщения
  3. Получить сообщения
  4. Понять основы

Это займёт 2-3 часа. Начните прямо сейчас! 🚀

make quickstart  # Запустить всё
make lesson02    # Терминал 1
make lesson01    # Терминал 2

📄 Лицензия

MIT License - смотрите LICENSE

Удачи в изучении Kafka! 🎓

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载