Практикум: идемпотентность фоновых задач и консьюмеров¶
Redis 7 запускается в отдельном контейнере. Повторная доставка очереди моделируется в памяти, а локальный имитатор почтового провайдера считает отправки. Kafka и SMTP-сервер в этом практикуме не запускаются.
Подтверждение первой доставки завершается ошибкой после действия и сохранения его результата. Тот же счёт приходит с новым идентификатором доставки. Проверки ожидают две доставки и одно успешное подтверждение: без координатора уходят два письма, с ним одно, а при повторе возвращается сохранённый идентификатор письма.
Ключ определяется организацией, заказом и версией счёта. Новая версия отправляется отдельно; подмена получателя старой версии вызывает IdempotencyKeyReuseError. Ошибка внедряется в момент подтверждения, процесс ОС не завершается аварийно. Сбой до сохранения результата и параллельные вызовы проверяются в отдельном практикуме о ключах.
Нужны Docker и uv. Запустите из каталога docs/blog/lab/2026-09-07-idempotency-for-jobs-and-consumers:
Зависимости закреплены в requirements.txt: idempotency-kit 0.4.1, redis-py 8.1.0, Pydantic 2.13.5, testcontainers 4.15.0, HTTPX 0.28.1 и aiohttp 3.14.3.
Сохраните соседний каталог 2026-09-07-idempotency-keys: отсюда загружаются общий код и зависимости.