Перейти к содержимому

Долгие и большие операции интеграций — асинхронно

Директивный

v8std#std642диагностикаTimeoutsInExternalResources

#http#надёжность#производительность

Внешний вызов, который может выполняться долго (отправка письма, обмен, upload), не блокирует ответ синхронного HTTP-сервиса: тяжёлую работу выносим в фоновое задание, а сервис быстро отвечает 200. Размер передаваемых пакетов ограничивать; объёмные и потоковые сценарии не гонять синхронным запросом.

Бюджеты времени и объёма, от которых считать:

Граница Значение Откуда
Порог выноса в фон ~8 с дольше — пользователь/клиент сервиса «висит», v8std #std642
Синхронный запрос через веб-публикацию 300 с, жёстко таймаут веб-сервера, подтверждён инцидентом
Размер тела запроса лимит WAF (у нас 256 МБ, не поднимаем) тела больше — чанками или не через веб-канал

Синхронный вызов связывает три таймаута в одну цепочку: пока сервис ждёт внешнюю систему, его самого ждёт веб-сервер, а веб-сервер — клиент. Рвётся цепочка в самом неожиданном месте: клиент получает 403/обрыв от WAF, хотя 1С «ещё работает», ретраит запрос — и тяжёлая операция запускается второй раз параллельно первой. Фоновое задание разрывает цепочку: сервис отвечает быстро, долгая работа идёт в своём темпе, а повторная доставка гасится идемпотентностью.

Асинхронный контракт для клиента: принять запрос → поставить фоновое задание → сразу ответить с идентификатором; статус — отдельным методом.

flowchart LR
    A[POST /export] --> B[Поставить фоновое задание]
    B --> C[Ответ 202 + ИдЗадания]
    C --> D[GET /export-status/ИдЗадания]
    D -->|выполняется| D
    D -->|готово| E[Ссылка на результат]

Фоновое задание при этом отвечает за свою половину контракта: итог (успех или ошибка с причиной) пишется в ЖР — «ушло в фон и пропало» не диагностируется (см. обработка ошибок и логирование).

Два подтверждённых инцидента:

  • 2FA. SMTP-отправка кода подтверждения вынесена в фоновое задание: синхронно платформа отдавала «Ошибка соединения с поставщиком» из-за таймаута провайдера. HTTP-сервис отвечает 200 OK сразу, сам код 2FA не логируется.
  • Большие пакеты ЭДО. Пакеты больше 20 МБ периодически падали с 403/Forbidden — на разборе подтвердился таймаут 300 секунд на синхронные запросы через веб-публикацию. Лимит тела на WAF подняли до 256 МБ, но дальше не увеличивают: тяжёлые сценарии уходят с тонкого веб-канала (RDS/серверный сценарий), а не расширяют его.

Гарантированно быстрые операции (единичная запись, короткий запрос) выносить в фон не нужно — это усложняет код без выгоды. Порог — риск превысить ~8 секунд.