Serverless-пайплайны, cron и фоновая обработка
Запускайте cron-задачи, сценарии по вебхуку и многошаговые фоновые задачи как serverless-пайплайны: стадии, ретраи и fan-out на тех же функциях, что обслуживают ваш живой HTTP API.
Дальше по теме
Начать бесплатно →Как это работает
Как устроены serverless-пайплайны
Определите шаги
Перетащите готовые функции на визуальный холст как шаги пайплайна и свяжите их входы, выходы и зависимости между собой.
Соедините и запланируйте
Соедините шаги в DAG или последовательную цепочку, затем добавьте cron-расписание или откройте HTTP-триггер, чтобы запуски стартовали автоматически.
Мониторьте в реальном времени
Следите за статусом, логами и выводом каждого шага в реальном времени и перезапускайте упавший шаг без перезапуска всего пайплайна.
Возможности
Для реальных сценариев
DAG-выполнение
Шаги выполняются параллельно везде, где позволяют зависимости, — полное разрешение зависимостей работает из коробки.
HTTP-триггеры
Дайте пайплайну собственный HTTP-эндпоинт с авторизацией по API-ключу — POST-payload попадает прямо в первый шаг. Ручные запуски из UI и API никуда не делись.
Ветвление и fan-out
Маршрутизируйте по выводу шага условиями if (input.intent === 'billing') и разводите работу параллельно явными узлами parallel и merge.
Ручное одобрение
Поставьте выполнение на паузу на любом шаге и требуйте подтверждения человека, прежде чем пайплайн пойдёт дальше.
Cron-расписание
Планируйте пайплайны обычным cron-выражением — ежедневные отчёты, батч-задачи, задачи очистки.
Преобразование данных
Меняйте форму payload между шагами узлами mapper и set — не нужно деплоить отдельную функцию ради склейки двух шагов.
Пайплайны вызывают те же функции, что опубликованы за API-шлюзом.
Как выбрать модель
Пайплайны, прямые функции и асинхронные задачи
Пайплайны
Берите пайплайны, когда cron-задачам, сценариям по вебхуку или фоновым задачам нужны ретраи, ветвление, fan-out или пошаговая оркестрация нескольких функций.
Прямой хендлер
Оставайтесь на прямой функции, когда один HTTP-запрос быстро закрывается одним обработчиком шлюза — без cron, вебхуков и многошагового состояния.
Асинхронные задачи
Берите асинхронные задачи, когда вызывающей стороне нужен мгновенный ответ, а полный DAG из многих шагов не требуется — хватит фоновой задачи в очереди.
Пример
DAG-пайплайн с ветвлением (HTTP-триггер)
{ "schemaVersion": 1, "nodes": [ { "id": "t1", "kind": "httpTrigger", "name": "Webhook", "position": { "x": 0, "y": 0 }, "config": { "method": "POST", "authType": "apiKey" } }, { "id": "n1", "kind": "lambda", "name": "Classify intent", "position": { "x": 240, "y": 0 }, "config": { "functionId": "intent-classifier", "onError": "failPipeline" } }, { "id": "i1", "kind": "if", "name": "Billing?", "position": { "x": 480, "y": 0 }, "config": { "expression": "input.intent === 'billing'" } }, { "id": "n2", "kind": "lambda", "name": "Billing agent", "position": { "x": 720, "y": -60 }, "config": { "functionId": "billing-agent", "onError": "failPipeline" } }, { "id": "n3", "kind": "lambda", "name": "Support agent", "position": { "x": 720, "y": 60 }, "config": { "functionId": "support-agent", "onError": "failPipeline" } }, { "id": "rB", "kind": "respond", "name": "Done", "position": { "x": 960, "y": -60 }, "config": { "statusCode": 200, "bodyMapping": { "ok": true } } }, { "id": "rS", "kind": "respond", "name": "Done", "position": { "x": 960, "y": 60 }, "config": { "statusCode": 200, "bodyMapping": { "ok": true } } } ], "edges": [ { "id": "e1", "sourceNodeId": "t1", "targetNodeId": "n1", "sourceHandle": "default" }, { "id": "e2", "sourceNodeId": "n1", "targetNodeId": "i1", "sourceHandle": "success" }, { "id": "e3", "sourceNodeId": "i1", "targetNodeId": "n2", "sourceHandle": "true" }, { "id": "e4", "sourceNodeId": "i1", "targetNodeId": "n3", "sourceHandle": "false" }, { "id": "e5", "sourceNodeId": "n2", "targetNodeId": "rB", "sourceHandle": "success" }, { "id": "e6", "sourceNodeId": "n3", "targetNodeId": "rS", "sourceHandle": "success" } ] }
Последовательный пример (ночная обработка)
{ "schemaVersion": 1, "nodes": [ { "id": "cron", "kind": "cronTrigger", "name": "Nightly 02:00", "position": { "x": 0, "y": 0 }, "config": { "cron": "0 2 * * *", "timezone": "UTC" } }, { "id": "extract", "kind": "lambda", "name": "Extract", "position": { "x": 240, "y": 0 }, "config": { "functionId": "nightly-extract", "onError": "failPipeline" } }, { "id": "transform", "kind": "lambda", "name": "Transform", "position": { "x": 480, "y": 0 }, "config": { "functionId": "nightly-transform", "onError": "failPipeline" } }, { "id": "publish", "kind": "lambda", "name": "Publish", "position": { "x": 720, "y": 0 }, "config": { "functionId": "nightly-publish", "onError": "failPipeline" } } ], "edges": [ { "id": "e1", "sourceNodeId": "cron", "targetNodeId": "extract", "sourceHandle": "default" }, { "id": "e2", "sourceNodeId": "extract", "targetNodeId": "transform", "sourceHandle": "success" }, { "id": "e3", "sourceNodeId": "transform", "targetNodeId": "publish", "sourceHandle": "success" } ] }