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

Backpressure, retry, ordering и poison messages

Глубокие темы · Раздел03

Тип материала: архитектурный разбор. Схемы и примеры иллюстративные, если не указано иное.

Версии в источниках: Kafka/Connect/Streams 4.1, Debezium 3.3, Flink 1.20.3, Spark 4.0.1 и Airflow 3.1 либо явно названная система. Непроверенные вопросы и ограничения runtime — в журнале (архив рабочего проекта).

Механизм

Backpressure ограничивает скорость upstream при перегрузке downstream; retry повторяет попытку, ordering задаёт допустимую последовательность. Poison record не исправится от бесконечного retry и может блокировать целую partition или занимать все workers.

flowchart TB
  Record --> Validate[Validate and classify]
  Validate --> Effect[Durable idempotent effect]
  Validate --> Retry[Bounded transient retry]
  Retry --> Effect
  Validate --> DLQ[Confirmed quarantine]
  Effect --> Offset[Advance safe prefix]
  DLQ --> Offset

Пошаговое объяснение

Validate input → classify permanent/transient → bounded retry с backoff/deadline → commit durable effect либо durable quarantine → только затем advance source progress. При retry-topic routing меняется порядок: более позднее событие может обойти раннее, поэтому нужны business versions либо остановка key/partition.

Failure scenarios и recovery

SQL commit + lost ACK вызывает replay; target idempotency сохраняет effect. DLQ send + lost ACK может дать несколько quarantine records. Если send не подтверждён, commit source offset опасен. Consumer не должен продолжить и commit более поздний offset той же partition после необработанной ранней ошибки.

Trade-offs и эксплуатация

Pause partition сохраняет order ценой blocking unrelated keys; retry topics повышают availability ценой reordering/extra state. Global sleep тормозит все partitions и poll loop. max.poll.interval и retry budget должны быть согласованы; не лечить overload бесконечными speculative retries.

Практический пример

DLQ/retry consumer показывает sequential safe prefix, bounded SQLite transient retries и confirmed quarantine publication. Это не универсальная библиотека всех brokers.

Типичные ошибки проектирования

Смешивать source/state/sink boundaries, скрывать failed records и неопределённый исход timeout; применять retry без identity/version и retention contract. Конкретные ограничения разобраны выше.

Вопросы на собеседовании

DLQ гарантирует исправление? Нет, это наблюдаемый backlog с owner.

Можно commit после enqueue в producer buffer? Нет, нужно знать outcome durable publication по выбранному broker contract.

Практические упражнения

Разберите poison offset11 и valid12; предложите strict-order и retry-topic варианты, указав последствия каждой схемы.

Дополнительные источники