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