Практикум: Retry-After, защита платежей от дублей и повтор тела запроса¶
Драйвер проверяет секундную паузу из Retry-After, а затем отказ от повтора с паузой 60 секунд, когда осталось только 300 мс: клиент возвращает исходный 503 без ещё одного запроса.
Обработчик оплаты намеренно отказывает после записи списания. Обычный POST не повторяется. С idempotent=True без ключа возникают два списания; стабильный ключ и сохранённый ответ на сервере оставляют одно списание, в том числе при более позднем повторном вызове.
Также проверяются буферизация конечного итератора тела адаптером HTTPX, одинаковые байты во всех попытках и отсутствие повтора на ответ 400. Настройки backoff и jitter находятся в client_flow.RETRIES; распределение jitter по приблизительным замерам времени практикум не проверяет.
Учебная оплата хранит ключи в памяти и обрабатывает последовательные вызовы. Это не реализация идемпотентности для продакшена. Общий код находится в соседнем практикуме с HTTP-клиентами; сохраните этот каталог.
Запустите из каталога docs/blog/lab/2026-09-07-retry-after-backoff-jitter в копии репозитория. Версии зависимостей закреплены в requirements.txt.