Топик и партиция задают структуру потока
События публикуются в топик, который делится на одну или несколько партиций. Внутри каждой партиции записи имеют последовательный порядок и получают смещение — offset. Глобального порядка между всеми партициями нет. Если порядок критичен для событий одного объекта, обычно используют ключ, чтобы связанные записи попадали в одну партицию. При этом выбор ключа влияет на распределение нагрузки: слишком узкий набор ключей способен создать горячую партицию и ограничить масштабирование.
Группа потребителей распределяет работу
Потребители могут объединяться в consumer group. В рамках одной группы каждая партиция в момент времени назначается одному потребителю, поэтому несколько экземпляров приложения делят нагрузку. Если потребителей больше, чем партиций, часть экземпляров не получает работу. При изменении состава группы происходит перераспределение партиций. Разработчику важно учитывать, что ребаланс может временно приостановить обработку и повлиять на время ответа.
Offset отделяет чтение от удаления данных
В Kafka чтение записи не означает её немедленное удаление. Данные сохраняются в соответствии с политикой хранения, а потребитель фиксирует своё положение через offset. Благодаря этому поток можно перечитать, например после исправления ошибки в обработчике. Но повторное чтение означает, что приложение должно быть готово к дублям. Практичный подход — проектировать обработчики так, чтобы повтор одного и того же события не приводил к некорректному изменению состояния.
Надёжность требует явных компромиссов
Настройки подтверждений, репликации и фиксации offset влияют на баланс между скоростью и устойчивостью. Если offset фиксируется до завершения бизнес-операции, при сбое запись может считаться обработанной слишком рано. Если после операции, возможно повторение. Поэтому часто важна идемпотентность: повторное выполнение должно давать тот же конечный эффект. Также нужно следить за задержкой потребителя, размером сообщений, ошибками сериализации и недоступными зависимостями.
Попробуйте на практике
Спроектировать небольшой поток событий на бумаге.
- Опишите событие, например изменение статуса заказа, и перечислите его минимальные поля.
- Выберите ключ партиционирования и объясните, какой порядок событий он должен сохранить.
- Нарисуйте один продюсер, топик из трёх партиций и два потребителя в одной группе.
- Опишите, что произойдёт при повторной доставке одного события и как обработчик избежит двойного эффекта.
Как проверить результат. Схема считается удачной, если из неё ясно, где гарантирован порядок, как делится нагрузка и что произойдёт при повторной обработке.
Частые вопросы
Kafka гарантирует порядок всех сообщений?
Нет. Порядок гарантируется внутри конкретной партиции. Между разными партициями общего порядка нет.
Почему сообщения могут обрабатываться повторно?
Сбой может произойти после выполнения операции, но до фиксации offset. Тогда потребитель при восстановлении прочитает событие снова.
Чем Kafka отличается от простой очереди?
Kafka хранит журнал событий в течение заданного периода и позволяет разным группам потребителей читать один поток независимо и при необходимости повторно.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.