1. Архитектура событий: Kafka, топики, партиции, consumer groups
Архитектура событий: Kafka, топики, партиции, consumer groups
Событийная архитектура нужна, когда системе важно реагировать на факты, а не только отвечать на запросы. Вместо прямых синхронных вызовов сервисы публикуют события (например, order.created), а другие сервисы подписываются и обрабатывают их асинхронно.
В этом курсе Kafka будет транспортом событий, FastStream — удобным слоем для продюсеров и консьюмеров в Python, а FastAPI — HTTP-входом в систему (например, создание заказа через API и публикация события в Kafka).
Что такое Kafka и какие роли она выполняет
Apache Kafka — распределённая платформа для потоковой передачи событий. Её ключевая идея: события записываются в устойчивый журнал (log), а потребители читают их в своём темпе.
Основные свойства Kafka, полезные в микросервисной архитектуре:
Полезные ссылки:
Базовые сущности: broker, topic, record
Broker и кластер
Broker — сервер Kafka. Обычно Kafka работает как кластер из нескольких broker-ов.
Topic
Topic — логическое имя потока событий, например:
orderspaymentsnotificationsВажно: топик — это не «очередь» в классическом смысле. Один и тот же топик могут независимо читать разные группы консьюмеров.
Record (сообщение, событие)
Событие в Kafka часто называют record. Обычно оно включает:
correlation_id).Партиции: параллелизм и порядок
Зачем нужны партиции
Каждый топик состоит из партиций (partition). Партиция — это упорядоченный append-only журнал.
Партиции дают два главных эффекта:
Порядок сообщений
Гарантия порядка в Kafka ограничена:
Практический вывод:
order_id шли строго последовательно, отправляйте их с key=order_id, чтобы они попадали в одну и ту же партицию.Как выбирается партиция
Упрощённо Kafka выбирает партицию так:
key задан, Kafka использует хеш ключа, чтобы стабильно направлять одинаковые ключи в одну партицию.key не задан, события распределяются по партициям более-менее равномерно.Это решение — архитектурное:
key нужен, когда важны порядок и локализация состояния.key подходит, когда события независимы и важна равномерная нагрузка.!Диаграмма показывает связь ключей, партиций и параллельного чтения в consumer group
Replication и устойчивость (коротко, но важно)
Kafka обычно хранит партиции с репликацией.
Для продюсера это важно через настройки подтверждений записи (acks), но на уровне архитектуры достаточно помнить:
Consumer groups: масштабирование обработки
Что такое consumer group
Consumer group — это логическое объединение консьюмеров, которые делят работу по чтению топика.
Правило распределения:
Следствия:
Паттерн: разные группы для разных задач
Ключевая сила Kafka: один топик могут читать разные consumer groups независимо.
Пример для orders:
billing-service читает события и выставляет счётanalytics-service читает события и строит метрикиnotifications-service читает события и отправляет уведомленияКаждая группа получает свою копию потока и продвигается по нему независимо.
Rebalance
Когда состав группы меняется (консьюмер упал/поднялся, изменилось число экземпляров), Kafka делает rebalance — перераспределяет партиции между консьюмерами.
Архитектурный нюанс:
Offset: позиция чтения и повторная обработка
Kafka не «удаляет сообщение после чтения» как классические очереди. Вместо этого консьюмер хранит offset — номер позиции в партиции, до которой он дочитал.
Почему это важно для проектирования:
Retention: как долго Kafka хранит события
Kafka хранит события по правилам retention:
Это влияет на архитектуру:
Отдельный режим — log compaction (компактация). Он полезен для топиков-состояний, где важна последняя запись по ключу (например, текущий профиль пользователя). Концептуально:
Официально:
Как эти понятия будут использоваться с FastStream и FastAPI
В рамках курса мы будем строить небольшой проект, где:
Соответствие терминов Kafka и будущего кода:
| Концепция Kafka | Как проявится в проекте | Практический смысл |
|---|---|---|
| topic | строка имени топика (например, orders) | канал событий домена |
| partition | настраивается у топика в Kafka | масштабирование обработки |
| key | поле (например, order_id) при публикации | порядок и локальность событий |
| consumer group | group_id у консьюмера | «делим работу» между инстансами |
| offset commit | настройка и поведение консьюмера | риск дублей и требования к идемпотентности |
Ссылки на инструменты курса:
Частые ошибки в событийной архитектуре (и как их избежать)
key связанные события могут оказаться в разных партициях.Что дальше
В следующей статье мы перейдём от концепций к практике окружения: поднимем Kafka локально (обычно через Docker), создадим топики и посмотрим, как продюсер/консьюмер взаимодействуют с ними на минимальном примере — это станет основой для дальнейшей интеграции с FastStream и FastAPI.