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

Практикум: идемпотентность в цепочке сервисов

Шлюз работает как HTTP-клиент и вызывает два локальных сервера aiohttp: заказы и платежи. Redis 7 работает в отдельном контейнере; локальный имитатор провайдера считает списания. Внешнего платёжного сервиса здесь нет.

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

Каждый сценарий делает два обращения к заказам и три к платежам. Проверки ожидают три списания без координатора, два при создании нового ключа шлюзом на повторе и одно при сохранении ключа. Затем изменение суммы получает HTTP 422, а ключ с двоеточием получает HTTP 400 ещё до нового списания.

Практикум проверяет транспорт и идемпотентность. Авторизации в нём нет: идентификаторам организаций в запросах пример просто доверяет. Настоящий API получает организацию из проверенного контекста авторизации и проверяет доступ к заказу.

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

uv run --no-project --python 3.13 --with-requirements requirements.txt python chain_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.