Kafka offset replay и ownership при rebalance¶
Тип материала: учебная 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 и последовательность¶
- Rewind source offsets, сохранив target DB и inbox. Запустите existing consumer вновь; ожидается повтор delivery без повторного effect.
- Для отдельного rebalance эксперимента нужны два instances на общем target DB; задайте разные process IDs, одинаковый group, сохраните assignment logs.
- Existing consumer serial: он не предоставляет pause-after-fetch callback. Для детерминированного in-flight rebalance используйте внешний debugger barrier перед commit, не меняя existing file. Привяжите evidence к DB commit и assignment revoke. Если точка не подтверждена, эксперимент считается не выполненным.
- Возобновите 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.
Источники¶
- Kafka 4.1 design — 4.1.