Практикум: идемпотентность в цепочке сервисов¶
Шлюз работает как HTTP-клиент и вызывает два локальных сервера aiohttp: заказы и платежи. Redis 7 работает в отдельном контейнере; локальный имитатор провайдера считает списания. Внешнего платёжного сервиса здесь нет.
Первый ответ платежей теряется после списания и сохранения готового результата в Redis. Первый ответ заказов тоже теряется. Соединения намеренно обрываются: медленный запрос сам по себе не считается доказательством успешного списания.
Каждый сценарий делает два обращения к заказам и три к платежам. Проверки ожидают три списания без координатора, два при создании нового ключа шлюзом на повторе и одно при сохранении ключа. Затем изменение суммы получает HTTP 422, а ключ с двоеточием получает HTTP 400 ещё до нового списания.
Практикум проверяет транспорт и идемпотентность. Авторизации в нём нет: идентификаторам организаций в запросах пример просто доверяет. Настоящий API получает организацию из проверенного контекста авторизации и проверяет доступ к заказу.
Нужны Docker и uv. Запустите из каталога docs/blog/lab/2026-09-07-idempotency-across-a-chain:
Зависимости закреплены в 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: отсюда загружаются общий код и зависимости.