Долгие serverless-задачи без HTTP-таймаута
Шаги пайплайна выполняются вне HTTP-окна. HTTP-обработчик принимает запрос, возвращает job ID, пайплайн продолжает работу сколько нужно — без ограничения в 10–30 секунд шлюза.
Last updated: 2026-04-20
- No HTTP timeout: pipelines run outside the request window
- Retries with step-level granularity—not all-or-nothing restarts
- Execution history for every job: duration, output, failures
- Same secrets and observability as your gateway API functions
Answer first
Direct answer
Долгие serverless-задачи без HTTP-таймаута. Разделить на: HTTP-функция принимает запрос, валидирует, вызывает `global.durable.startNew()`, возвращает `{ jobId }`. Оркестрация выполняет шаги без HTTP-окна.
When it fits
- Задача занимает больше 10 секунд
- Важны повторы, история и изоляция шагов
Tradeoffs
- Увеличение таймаута шлюза не решает проблему: клиент всё равно разрывает соединение. Задача может упасть на середине без уведомления.
- Вынести задачу в lambda с отдельным `InvocationType=Event` — скрытая очередь внутри другого сервиса с его лимитами и счётом.
Нагрузка и где ломается
Почему долгие задачи не помещаются в HTTP
Шлюзы и платформы устанавливают таймаут на HTTP-запрос. Задачи дольше 10–30 секунд — CSV-импорт, рассылка, синхронизация — не помещаются в это окно.
Держать соединение открытым рискованно: обрыв сети — потеря работы без возможности повтора.
Компромиссы
Где ломаются обходные пути
Увеличение таймаута шлюза не решает проблему: клиент всё равно разрывает соединение. Задача может упасть на середине без уведомления.
Вынести задачу в lambda с отдельным `InvocationType=Event` — скрытая очередь внутри другого сервиса с его лимитами и счётом.
Как помогает Inquir
Как Inquir решает проблему долгих задач
Разделить на: HTTP-функция принимает запрос, валидирует, вызывает `global.durable.startNew()`, возвращает `{ jobId }`. Оркестрация выполняет шаги без HTTP-окна.
Каждый шаг — отдельная функция с повторами. История прогона видна в консоли: какой шаг на каком этапе и сколько занял.
Что получаете
Что нужно для долгих задач
Разделение HTTP и job
HTTP-функция принимает запрос и передаёт работу в пайплайн за <100 мс.
Шаги с повторами
Каждый шаг пайплайна повторяется независимо при ошибке без повтора предыдущих.
History
История каждого прогона в консоли — шаг, статус, длительность, логи.
Идемпотентность
Job ID генерируется из входных данных — повторный trigger не создаёт дубль при проверке.
Что делать дальше
Как перенести долгую задачу в пайплайн
Acknowledge the HTTP request fast, hand off to a pipeline, run slow work in steps.
Разбить на шаги
Выделите этапы: validate → process → notify. Каждый шаг — функция с явным входом/выходом.
HTTP принимает, оркестрация делает
Маршрут шлюза вызывает `global.durable.startNew(name, undefined, payload)`, сразу возвращает `{ jobId }`.
Следить за прогрессом
Клиент опрашивает статус по jobId или получает вебхук по завершении.
Пример кода
HTTP → pipeline handoff pattern
The HTTP handler validates input and returns 202 immediately. The pipeline step does the slow work. Use event.payload for pipeline context; event.previousOutput to read prior step results.
export async function handler(event) { const { reportId, format } = JSON.parse(event.body || '{}'); if (!reportId) return { statusCode: 400, body: JSON.stringify({ error: 'reportId required' }) }; // Return immediately — don't wait for the slow work const { instanceId: jobId } = await global.durable.startNew('generate-report', undefined, { reportId, format: format ?? 'pdf' }); return { statusCode: 202, body: JSON.stringify({ jobId, status: 'queued' }) }; }
export async function handler(event) { // Runs outside HTTP window — no timeout from the gateway const { reportId, format } = event.payload ?? {}; const data = await fetchAllReportData(reportId); // may take minutes const file = await renderReport(data, format); await storage.upload(file, `reports/${reportId}.${format}`); await notifyUser(reportId, file.url); return { reportId, size: file.byteLength, url: file.url }; }
Когда подходит
Когда нужен пайплайн
Когда это уместно
- Задача занимает больше 10 секунд
- Важны повторы, история и изоляция шагов
Когда лучше не трогать
- Синхронный ответ критичен и задача укладывается в HTTP-таймаут
FAQ
Вопросы и ответы
Как вернуть результат клиенту?
Два варианта: polling по jobId через отдельный маршрут или вебхук в конце пайплайна на URL клиента.
Что если шаг упал?
Шаг повторяется согласно политике повторов. Если исчерпаны попытки — прогон помечается failed с логами.
What if a step fails mid-job?
Configure retry count and delay per pipeline step. Failed steps retry independently without restarting earlier steps. Set alerts on step failure rates to catch recurring issues.