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.ts 或 workflow-execution.service.ts。
第三步:WorkflowRunner 决策
看 packages/cli/src/workflow-runner.ts 中 shouldEnqueue 的判断: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 中关注三件事:
nodeExecutionStack如何初始化和消费。IRunData如何按节点追加 task data。- 下一批节点如何根据 output index、connection type、等待和错误策略入栈。
第六步:节点上下文和凭证
进入 ExecuteContext 与 CredentialsHelper,确认 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 一直 queued | Redis、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 庞大的节点数量淹没。