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

Практикум: идемпотентность фоновых задач и консьюмеров

Redis 7 запускается в отдельном контейнере. Повторная доставка очереди моделируется в памяти, а локальный имитатор почтового провайдера считает отправки. Kafka и SMTP-сервер в этом практикуме не запускаются.

Подтверждение первой доставки завершается ошибкой после действия и сохранения его результата. Тот же счёт приходит с новым идентификатором доставки. Проверки ожидают две доставки и одно успешное подтверждение: без координатора уходят два письма, с ним одно, а при повторе возвращается сохранённый идентификатор письма.

Ключ определяется организацией, заказом и версией счёта. Новая версия отправляется отдельно; подмена получателя старой версии вызывает IdempotencyKeyReuseError. Ошибка внедряется в момент подтверждения, процесс ОС не завершается аварийно. Сбой до сохранения результата и параллельные вызовы проверяются в отдельном практикуме о ключах.

Нужны Docker и uv. Запустите из каталога docs/blog/lab/2026-09-07-idempotency-for-jobs-and-consumers:

uv run --no-project --python 3.13 --with-requirements requirements.txt python jobs_lab.py

Зависимости закреплены в 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: отсюда загружаются общий код и зависимости.

Исходный код практикума на GitHub.