Отправитель публикует сообщения в Kafka, а обработчики читают их из журнала. На лентах ниже видно, где появляется новая запись, как возникает её копия и когда запись доходит до читателя.
Три участника потока
Отправитель, producer, публикует сообщения. Kafka хранит их в топике, именованном потоке записей. На схеме топик «Сообщения» разделён на две партиции, отдельные упорядоченные журналы. Читатели, consumers, получают записи для обработки.
Прямоугольник с №7 обозначает седьмое сообщение в демонстрации. Жёлтый цвет обозначает партицию 0, синий — партицию 1. На каждом сервере видна основная реплика одной партиции и копия другой. У читателей показаны уже обработанные сообщения.
Ключ — отдельное значение в записи, по которому отправитель может выбирать партицию. В схеме используются условные ключи key-1…key-4. Переключатель «Один ключ у всех сообщений» позволяет увидеть, как меняется распределение при одинаковом ключе.
Поток идёт автоматически. Нажми «Пауза», затем «Один шаг», чтобы проследить отдельное сообщение.
Основная реплика и копия
Реплика — копия журнала партиции. В этой схеме каждой партиции назначены две реплики на разных серверах. Основную называют leader: отправитель пишет туда новые сообщения. Вторая реплика, follower, копирует её журнал.
Новая запись сначала появляется в основной реплике своей партиции. На следующем шаге тот же номер появляется в копии на другом сервере. Это одно сообщение в двух местах. Многоточие в копии означает, что новая запись туда ещё не пришла.
Для партиции 0 основная реплика находится на сервере 1, копия — на сервере 2. У партиции 1 роли серверов обратные. Один broker может хранить основные реплики одних партиций и копии других.
При выбранной в модели политике сообщение становится доступно чтению после копирования. Репликация помогает сохранить журнал при отказе сервера. Подтверждения, ISR и выбор нового лидера подробнее разобраны в уроке о репликации.
Кто читает сообщения
Два читателя работают в одной обычной consumer group. Читатель 1 получает партицию 0, читатель 2 — партицию 1. Копию на втором сервере они не считают отдельной очередью: каждую партицию обслуживает один участник этой группы.
Сравни номер у отправителя, в основной реплике, в копии и у читателя. После чтения запись остаётся в Kafka. В отличие от обычной рабочей очереди, чтение не удаляет запись из журнала.
Номер на плитке помогает различать сообщения в демонстрации. Это не offset. Offset обозначает позицию записи внутри конкретной партиции: две разные партиции могут обе иметь запись с offset 0. Его можно посмотреть в подсказке над плиткой.
Другие группы могут читать тот же топик независимо. Назначение партиций и смена читателей разобраны в следующем уроке.
Что меняет ключ
При неизменных настройках один ключ направляет сообщения в одну партицию, поэтому там сохраняется порядок добавления. Разные ключи могут попасть в одну и ту же партицию; распределение не обязано быть поровну.
Включи «Один ключ у всех сообщений». Схема начнётся заново, и все записи с ключом key-1 пойдут в партицию 0. Первый читатель продолжит обработку, второй останется ждать. Добавление читателей не позволяет разделить одну партицию между несколькими участниками этой группы.
Выключи переключатель, чтобы вернуть разные ключи. Кнопка «Сначала» очищает только демонстрацию. На лентах показаны последние шесть записей; уход с ленты не означает удаление сообщения из Kafka.
Это учебная модель нормального потока. Копирование занимает один шаг, чтение и обработка завершаются вместе. Здесь не воспроизводятся сетевые таймауты, транзакции, отказы и длительность реальной обработки. Настоящий Kafka можно запустить по практическому уроку.