Перейти к содержанию

Kafka offset replay и ownership при rebalance

Все лаборатории · Раздел 04

Тип материала: учебная fault-injection лаборатория. Все данные, IDs, интервалы и суммы — HYPOTHETICAL. NOT_RUN относится к интеграционной части; локальные результаты фиксируются отдельно в отчёте Этапа 4.

Зависимости и reuse

Reuse existing producer, consumer и SQLite projection. Kafka 4.1 tools работают в container; consumer group classic в existing client. Не переносить callback contract другого client/version.

Подготовка и команды

Команды PowerShell выполняются из корня handbook. Используйте отдельные namespace/workdir; не подключайте production endpoints. Доступность Docker проверяется docker info; одного docker compose config недостаточно. Нужны свободные localhost ports и синтетические fixture.

docker compose -f examples/processing/compose.yaml config --quiet
docker compose -f examples/processing/compose.yaml up -d kafka postgres

Existing compose — один broker без HA; credentials только локальные demo. Kafka bootstrap для host client: localhost:19092. Установите dependencies по existing setup. Здесь и ниже $labPython указывает на существующий Python venv с processing requirements.

Завершите consumer lab на отдельном topic/group и остановите consumers. Посмотрите offsets и выполните сначала dry-run:

docker compose -f examples/processing/compose.yaml exec -T kafka /opt/kafka/bin/kafka-consumer-groups.sh --bootstrap-server kafka:9092 --group rel4-consumer-unique-run --describe
docker compose -f examples/processing/compose.yaml exec -T kafka /opt/kafka/bin/kafka-consumer-groups.sh --bootstrap-server kafka:9092 --group rel4-consumer-unique-run --topic rel4-consumer-unique-run --reset-offsets --to-earliest --dry-run

Только для проверенного inactive synthetic group повторите reset с --execute вместо --dry-run. Сохраните план и предыдущие offsets.

Точка fault injection и последовательность

  1. Rewind source offsets, сохранив target DB и inbox. Запустите existing consumer вновь; ожидается повтор delivery без повторного effect.
  2. Для отдельного rebalance эксперимента нужны два instances на общем target DB; задайте разные process IDs, одинаковый group, сохраните assignment logs.
  3. Existing consumer serial: он не предоставляет pause-after-fetch callback. Для детерминированного in-flight rebalance используйте внешний debugger barrier перед commit, не меняя existing file. Привяжите evidence к DB commit и assignment revoke. Если точка не подтверждена, эксперимент считается не выполненным.
  4. Возобновите old handler после передачи partition и проверьте rejected stale commit плюс duplicate-safe DB result.

Проверки и evidence

До и после replay совпадают exact inbox identities и amounts. Committed frontier не проходит unresolved hole. При rebalance old/new collision не должен создавать второй effect. Один broker/одна SQLite DB не проверяет replicated durability или Kafka transaction EOS.

Записывайте versions, исходные offsets/cut, момент injection, состояние после recovery и independent oracle. Отсутствующий prerequisite даёт NOT_RUN; несработавший ожидаемый fault — FAIL эксперимента, а не PASS correctness.

Recovery и cleanup

При rejected commit разрешите новому владельцу replay, не пропускайте вход ручным продвижением offset. После стабилизации group сверяйте source/target sets. Для нового target generation используйте соответствующий новый inbox namespace: старый global marker не должен подавлять необходимый rebuild.

Остановите созданные тестовые процессы; очистка допускается только для собственных синтетических namespaces. Не используйте down -v для общей лаборатории 3B: это удалит evidence предыдущих работ. Сохраните protocol до cleanup.

Ограничения и статус

Reset inactive test group воспроизводим по CLI; deterministic rebalance требует debugger/barrier и дополнительной организации evidence. Он NOT_RUN и не выдаётся за поддерживаемый самим старым consumer failpoint.

Интеграционный статус в текущем окружении: NOT_RUN — Docker daemon недоступен. Ожидаемые результаты выше являются acceptance criteria, а не фактически полученным runtime output.

Источники