Построение выгрузки за три минуты внутри POST-запроса: почему клиент получает 504 и дубли
Ручка POST /reports синхронно строит большую выгрузку: собирает данные, формирует файл, кладёт его в хранилище. На боевых объёмах это занимает 2–3 минуты.
Что происходит на практике: шлюз рвёт соединение по таймауту, клиент видит 504 и нажимает кнопку ещё раз, а в хранилище оказываются две одинаковые выгрузки, потому что первая всё же досчиталась.
Какое решение правильное?
- Поднять таймауты шлюза и клиента до пяти минут — этого достаточно при текущих объёмах
- Отдавать ответ по частям потоком, чтобы соединение не простаивало и не рвалось по таймауту
- Перевести обработчик в async def — тогда запрос перестанет висеть и таймаута не будет
- Принять задачу, вернуть 202 с идентификатором, считать в фоне, статус отдавать отдельной ручкой
