Запрос генерации завершился по тайм-ауту, но провайдер всё ещё может создавать изображения. Повторная отправка способна создать второе задание. Интеграция должна восстановить первое задание, повторить запрос в рамках документированной гарантии идемпотентности либо оставить результат неизвестным, пока не удастся установить, что произошло.
Храните запросы на сервере и атомарно назначайте отправителя
Перед отправкой сохраните достаточно данных, чтобы распознать работу после перезапуска:
- Локальный ID задания и кампанию или запрос, к которому оно относится.
- Отправленные входные данные или доступный снимок, включая исходные материалы, форматы и локали.
- ID задания у провайдера и ключ идемпотентности, если API их возвращает или принимает.
- Текущее состояние, историю попыток и список ожидаемых результатов.
До отправки один воркер должен атомарно закрепить задание за собой. Это не даст двум локальным воркерам отправить его одновременно, но не исключит дубль после сбоя между принятием у провайдера и сохранением ответа. Этот отдельный разрыв закрывает поддерживаемая провайдером идемпотентность. Отпечаток запроса помогает заметить изменившиеся данные, но одинаковые входные данные могут означать и намеренную вторую генерацию, поэтому он не заменяет идентификатор задания.
После тайм-аута считайте принятие неизвестным и сверяйте состояние до повтора
Выбирайте путь восстановления по контракту провайдера:
| Что известно | Следующее действие |
|---|---|
| ID задания у провайдера сохранён | Запросите состояние этого задания или ждите документированного события завершения. Не отправляйте новую генерацию только из-за тайм-аута опроса. |
| Отправка завершилась по тайм-ауту, а эндпоинт поддерживает идемпотентные повторы | Повторно используйте тот же ключ и неизменные входные данные в пределах документированного срока защиты. |
| Отправка завершилась по тайм-ауту и доступен поиск по клиентскому идентификатору | Найдите исходный запрос и привяжите восстановленный ID провайдера к локальному заданию. |
| Поддерживаемый поиск или безопасный повтор не позволяют установить результат | Отметьте принятие как неизвестное и приостановите автоматическую повторную отправку. Используйте доступные записи провайдера или поддержку; любое решение рискнуть дублем должно быть явным. |
| Провайдер отклонил некорректные входные данные | Исправьте их до создания новой попытки. |
Объяснение идемпотентных API от AWS показывает, почему потеря ответа оставляет вызывающую сторону в неопределённости и как заданный клиентом ID запроса делает повтор безопасным, если сервис соблюдает этот контракт. Локальный цикл повторов не добавит такую гарантию провайдеру, у которого её нет.
Для ответов, допускающих повтор, соблюдайте рекомендованную провайдером задержку и ограничивайте число попыток и общее время. Проверьте и настройки SDK: повторы одновременно в SDK и воркере могут перемножить число отправок. До отправки зарезервируйте конечный лимит запросов или расходов с учётом разрешённых повторов, чтобы один сбойный пакет не исчерпал весь бюджет.
Защитите обработку колбэков и хранение файлов
Используйте документированный механизм ответа, опроса или колбэков. Для подписанных колбэков проверяйте подпись до изменения задания. Повторные события завершения должны быть безвредны, а запоздалое событие прогресса не должно возвращать завершённое задание в работу. Учётные данные провайдера храните на сервере.
Связывайте каждый полученный файл с запрошенным результатом. Проверьте срок действия ссылок провайдера на скачивание. Если вам нужно хранить результаты дольше, скопируйте файлы в собственное хранилище до истечения ссылок и сохраните новые ссылки в том же задании.
До передачи проверьте полноту пакета
Допустим, запрос требует квадратную и вертикальную рекламу на английском и французском. Это четыре ожидаемых результата. Сверьте полученные пары формат/локаль со списком, затем декодируйте каждый файл и проверьте размеры и формат. Успешный HTTP-ответ с тремя пригодными изображениями всё ещё означает неполный пакет.
Сохраните эти три результата. Исправьте недостающий отдельно, если провайдер это поддерживает; иначе решите, приемлема ли замена всего пакета. Частичное скачивание может быть полезным, но укажите недостающий результат, не выдавая пакет за полный. Реестр материалов креатива может хранить эти ссылки на уровне файлов.
Отделите завершение от публикации
Разделяйте техническую готовность и согласование кампании. Если процесс требует проверки, передайте файлы проверяющему вместе с брифом и ссылками на исходники; решение зафиксируйте по процессу согласования креативов. Колбэк завершения от провайдера не должен случайно публиковать кампанию.
До подключения распространения проверьте восстановление: потеряйте ответ на отправку, перезапустите воркер, повторите колбэк и верните пакет с одним отсутствующим файлом. Вы должны суметь найти исходное задание, избежать незапланированной второй отправки и точно показать, какие результаты готовы.




