Inquir Compute logoInquir Compute
Паттерн · Inquir Compute

Долгие 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

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 решает проблему долгих задач

Разделить на: 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.

1

Разбить на шаги

Выделите этапы: validate → process → notify. Каждый шаг — функция с явным входом/выходом.

2

HTTP принимает, оркестрация делает

Маршрут шлюза вызывает `global.durable.startNew(name, undefined, payload)`, сразу возвращает `{ jobId }`.

3

Следить за прогрессом

Клиент опрашивает статус по 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.

api/process-report.mjs (HTTP handler)
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' }) };
}
jobs/generate-report.mjs (pipeline step)
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-таймаут

Вопросы и ответы

Как вернуть результат клиенту?

Два варианта: 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.

Inquir Compute logoInquir Compute

Самый простой способ запускать AI-агентов и backend-джобы без инфраструктуры.

Связаться info@inquir.org

© 2025 Inquir Compute. Все права защищены.