Практикум: ключи идемпотентности¶
Скрипт запускает Redis 7 в отдельном Docker-контейнере. Локальный имитатор платёжного провайдера считает списания; внешнего платёжного сервиса здесь нет.
Проверяются три режима обработки параллельных запросов, возврат готового результата, изменение параметров, разделение организаций и отклонение недопустимых ключей до действия. События asyncio.Event удерживают первый вызов, пока второй не дойдёт до координатора.
Отдельные проверки теряют ответ после списания, дожидаются истечения lease при ещё работающем первом вызове, удаляют результат по TTL и делают Redis недоступным. Ожидаемое число списаний: run=2, wait=1, raise=1. Потеря ответа провайдера даёт два списания без его собственной дедупликации и одно с ней. Истёкший lease и недоступный Redis тоже допускают повторы действия.
Сначала проверяется штатный TTL результата, один час. Затем только у временной записи практикума срок сокращается через PEXPIRE, чтобы не ждать час. Сбой провайдера моделируется исключением после действия, а не реальным падением процесса. Ожидаемые ошибки библиотеки не выводятся в лог; их последствия проверяются через assert.
Нужны Docker и uv. Запустите из каталога docs/blog/lab/2026-09-07-idempotency-keys:
Зависимости закреплены в 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.
Фрагменты статьи взяты из payment_flow.py; lab_support.py содержит имитаторы и управление контейнером.