跳到主要内容

13. 完整链路:从点击执行到结果落库

这一章用一个最常见的手动执行场景,把前面的模块串成一条源码阅读路线:用户在编辑器里点击执行,工作流包含 Webhook/Manual Trigger、HTTP Request、If 和 Respond 节点,系统使用 queue worker,并可能调用 credential。

13.1 事件序列

13.2 逐步定位源码

第一步:前端发起执行

CanvasRunWorkflowButton.vue、workflow execution store 和相应 feature API 开始,确认请求 payload:workflow id/version、dirty state、start node、pin data、destination node、manual mode 等。

第二步:后端认证和 controller

沿 controller registry 和执行 controller,确认请求经过 AuthService、scope 校验、workflow ownership/project filter,并进入 manual-execution.service.tsworkflow-execution.service.ts

第三步:WorkflowRunner 决策

packages/cli/src/workflow-runner.tsshouldEnqueue 的判断:queue mode 下非 manual 执行通常入队,manual 可能有特殊路径;还要观察 priority、retry、execution mode 和 webhook relay metadata。

第四步:Worker 调 core

packages/cli/src/scaling/job-processor.ts 如何把 job payload 还原成 workflow 与 additional data,再进入 core 的 WorkflowExecute.run()。此处是跨进程序列化边界,任何遗漏都会在 worker 才暴露。

第五步:核心执行器推进

workflow-execute.ts 中关注三件事:

  1. nodeExecutionStack 如何初始化和消费。
  2. IRunData 如何按节点追加 task data。
  3. 下一批节点如何根据 output index、connection type、等待和错误策略入栈。

第六步:节点上下文和凭证

进入 ExecuteContextCredentialsHelper,确认 HTTP Request 节点拿到的是脱敏后的临时 credential data,表达式是在当前 item/run 上下文解析,binary 通过 binary manager 处理。

第七步:持久化和推送

execution service 把状态、开始/结束时间、错误、run data 和 binary references 写入数据库/对象存储;push service 发送节点开始、节点结束、execution finished 等事件,编辑器将事件还原为画布上的状态。

13.3 一个故障如何定位

现象优先检查
点击执行没有 job前端 payload、controller scope、WorkflowRunner enqueue 分支
job 一直 queuedRedis、worker status、concurrency capacity、stalled job
节点找不到node loader、node type name/version、package scan
凭证失败credential type、CredentialsHelper、OAuth preAuthentication、项目共享
只在 worker 失败job serialization、worker env、task runner、binary storage
UI 不更新但 execution 成功push channel、browser id/session、execution store
Webhook 超时response mode、queue relay、节点耗时、代理超时

13.4 最短源码阅读路线

如果时间有限,按这 12 个文件开始:

packages/workflow/src/Interfaces.ts
packages/workflow/src/workflow.ts
packages/core/src/execution-engine/workflow-execute.ts
packages/core/src/execution-engine/node-execution-context/execute-context.ts
packages/cli/src/workflow-runner.ts
packages/cli/src/workflows/workflow-execution.service.ts
packages/cli/src/scaling/job-processor.ts
packages/cli/src/executions/execution.service.ts
packages/cli/src/credentials-helper.ts
packages/cli/src/webhooks/webhook-request-handler.ts
packages/frontend/editor-ui/src/features/workflows/canvas/components/WorkflowCanvas.vue
packages/frontend/editor-ui/src/app/stores/workflowExecutionState.store.ts

先回答“执行一次如何走通”,再扩展到多主、AI、MCP、Code sandbox 和企业权限。这样不会被 n8n 庞大的节点数量淹没。