advanced
Idempotent consumers
Делайте message handlers safe for redelivery через processed-message records, natural unique keys, transactions и side-effect guards.
Идемпотентный consumer даёт один и тот же результат при однократной или многократной обработке. Техники: естественные уникальные ключи (order ID), таблицы обработанных сообщений с окном дедупликации, compare-and-set по версии и outbox, связывающий публикацию с commit в БД.
Проектируйте идемпотентность на уровне бизнес-операции, а не только транспорта. Handler, дважды списавший карту, неверен даже при exactly-once на брокере. Храните достаточно состояния, чтобы обнаруживать replay в окне redelivery.
На интервью: спроектируйте идемпотентность для `PaymentCaptured`, сравните dedup-таблицу и unique constraint и объясните связь с at-least-once брокерами.
Типовые ошибки: ключи идемпотентности истекают раньше max redelivery; гонка параллельных consumer на одном ключе; побочные эффекты вне транзакции; вера, что offset Kafka гарантирует бизнес-идемпотентность.
Компромисс — гибкость против сложности: знайте, когда достаточно более простого пути.
Чеклист:
- Определите естественный ключ идемпотентности.
- Сохраняйте результат обработки до ack.
- Покройте внешние эффекты outbox или компенсациями.
- Явно тестируйте дубликаты доставки.