Skip to content

作业执行与恢复 ​

页面入口为 工作流引擎 → 运维与集成 → 流程监控 → 作业账本。作业账本记录工作流的异步执行事实,适合查询失败、排队、暂停和恢复结果;人工审批待办见任务监控。

数据与作业类型 ​

数据对象职责
workflow_jobs父作业:类型、状态、输入、关联实例 / 任务 / 节点、优先级、计划执行时间、尝试预算、执行权和结果
workflow_job_executions每次领取产生的尝试记录:轮次、尝试序号、请求 / 响应、错误、开始 / 结束与耗时
workflow_job_effects已提交步骤回执:以操作键和步骤键去重,保存可复用的业务写入结果
作业类型说明执行池
delay_wake延迟器到期唤醒推进
task_timeout审批 / 办理待办超时处理推进
subprocess_spawn发起子流程推进
subprocess_join子流程结束后汇聚父任务推进
schedule_launch定时规则的原周期或手动发起推进
trigger_dispatch触发器节点派发事件与外呼
external_dispatch外部审批派发事件与外呼
event_dispatch工作流事件分发及可靠扇出事件与外呼
webhook_delivery事件订阅 Webhook 投递事件与外呼
compensation_action反向 / 兜底补偿动作事件与外呼
automation_action流程自动化的单个动作事件与外呼

审批单自动归档使用独立 workflow-print-archive 队列生成 PDF,不属于上述作业类型。归档配置与产物见审批单打印与存证。

父作业与执行尝试 ​

父作业表达当前调度状态,尝试记录表达一次执行的事实。一次失败尝试可以对应正在等待重试的父作业;后续成功或人工取消不会改写已结束的尝试。

父作业状态含义
pending等待首次执行或退避后的自动重试;runAt 未到时暂不领取
running已取得租约,正在执行
paused所属实例已挂起,保存剩余时长,等待实例恢复
succeeded作业完成;执行尝试可为实际成功或无需执行的 skipped
failed可人工重试的失败状态;正常自动失败结算会转为 pending 或 dead
dead尝试耗尽、永久错误,或外部操作结果待确认,需人工处理
canceled被取消或由运维跳过,不再自动执行

尝试状态为 running、succeeded、failed、skipped、canceled。skipped 表示处理器判断无需执行,例如投递时订阅已停用;它不等于请求成功。运维的「跳过」则取消父作业,状态为 canceled。

attempts 是当前轮次已领取次数,maxAttempts 是总尝试上限。自动失败未耗尽时按 30 秒起的指数退避重新计划,单次退避封顶 15 分钟;具体尝试预算由各类型入队时设置。人工重试增加 generation 并把 attempts 归零,保留全部旧轮次尝试。

领取与执行权 ​

只有 worker 角色执行处理器。两个执行池分别为 workflow-ledger(推进)与 workflow-ledger-outbound(事件与外呼),每个 worker 进程各有 4 个执行槽、2 秒短轮询。池只在有空闲槽时直接领取账本中已到期的 pending 作业,执行完成后继续补位。

领取使用数据库行锁与 SKIP LOCKED 协调多个 worker。通常按 priority、runAt、ID 升序领取(优先级数值越小越先执行);每第四次领取按最早到期时间优先,避免持续高优先级流量使普通作业一直等候。后续重试与定时作业仍按到期条件参与领取。

pg-boss 中的两个队列保存可合并的唤醒提示。业务作业和每次重试的权威记录在账本中;提示丢失时短轮询仍会继续领取。事务中建立的作业在事务成功提交后发布唤醒,回滚不发布;通知失败也不撤销已提交的业务事实。

字段 / 机制作用
generation执行轮次;取消、人工重试、挂起 / 恢复更新轮次,使旧执行者失去写入权
leaseToken / leaseUntil当前执行者身份及租约;每 15 秒续租,租约为 60 秒
executionTimeoutMs / executionDeadline单次执行时限及硬截止时间,缺省 10 分钟;续租不会越过截止时间
operationKey副作用操作标识;原输入重试保持稳定,显式修改 payload 时生成新键
traceId串联同一次操作产生的作业,包括跨实例和子流程

业务短事务按实例、作业顺序加锁,并在写入前后核验轮次、租约和截止时间。失去执行权或超过时限会触发中止信号,旧执行者不能覆盖后续操作;外部 HTTP 请求在业务事务之外执行。

步骤回执与外部结果 ​

内部流程创建、字段回写、通知入队等步骤将业务写入和回执一起提交。重试读取同一操作的已提交回执,复用结果;作业入库的 idempotencyKey 则负责避免同一业务事件重复建立父作业。两者承担不同职责。

作业上下文中的 HTTP 请求携带稳定 X-Idempotency-Key,关闭传输层自动重发,失败恢复由账本管理。不安全的外部写入在发送前登记副作用标记;响应缺失、408、429、5xx 或执行失联时,结果可能已经在接收方生效,作业会进入「外部操作结果待确认」死信,停止自动重发及自动兜底。

管理员应先核对接收方结果,再选择重试、跳过或人工业务处理。取消作业不能撤销已送达的请求,稳定操作键也需要接收方实施去重。明确成功的自动化 Webhook 保存步骤回执,后续账本结算重试复用该回执。各集成的恢复入口见事件订阅、流程自动化和补偿与 Saga。

挂起、终结与恢复扫描 ​

实例挂起会暂停延时、超时、触发器、外部审批和子流程作业,记录 runAt 的剩余毫秒数;恢复实例后以剩余时长重排。已开始不安全外呼且结果不明的运行中作业进入待确认死信。事件分发、Webhook 投递、自动化与补偿动作不受实例挂起控制。

实例终结、退回发起人、撤回或取消时,清场范围内的推进作业为 delay_wake、task_timeout、external_dispatch、subprocess_spawn、subprocess_join;触发器由任务和实例状态门控,已发生事件仍可分发。执行池的分类与清场 / 挂起范围是不同概念,具体实例动作见实例生命周期。

系统任务 workflow-jobs-drain 每分钟回收租约失效或超过执行截止时间的作业,并补投到期作业的唤醒提示。它不直接执行处理器;尝试耗尽或外部结果不明时转为死信。引擎页面的定向恢复动作与预览见引擎诊断与健康。

运行状态面板 ​

顶部运行状态反映账本与执行池的整体状态,不随列表的作业类型或状态筛选变化。

指标口径
存活 Worker近 10 分钟有心跳、具有 worker 角色且已注册工作流账本执行池的节点中,active 且心跳在 90 秒内的节点数 / 总节点数
执行槽存活节点正在使用的槽数 / 已注册槽容量;普通调度节点或仅 API 节点不计入
在途作业running 作业数
卡死running 且租约缺失 / 失效或达到执行截止时间,按数据库时间判断
积压已到期(runAt <= now)的 pending 作业数,不包含人工待办等待
最老排队最早到期 pending 作业的等待秒数;无到期作业时为空
排队 P95(1h)近一小时尝试从计划到期到实际领取的排队时长 P95;接口还返回 P99
死信dead 作业数
最后领取执行尝试中最近的开始时间
失败率(1h)近一小时创建的尝试中 failed 的占比
平均耗时(1h)近一小时创建且已有耗时的尝试平均值;没有样本时为空

平台作业监控的工作流来源另给租约回收器一分钟宽限后才判定卡死;不要将它与这里的即时失效租约计数混用。

查询、重试与重放 ​

作业页支持按类型、状态、关联实例与关键字筛选,查看父作业、逐次尝试、同一 traceId 的完整链路,并导出链路及其关联实例诊断包。

操作条件与结果
单条重试仅 failed / dead / canceled,重置当前尝试次数并增加轮次;可通过接口提交新的 payload
跳过 / 取消pending / running / paused / failed / dead,取消父作业并使旧执行失去所有权
批量重试逐条按上述状态条件提交,不满足条件的计为 skipped;按配置错峰执行
批量跳过逐条取消,返回成功提交数和因状态不满足而跳过的数量
条件重放圈定 dead 或 failed 作业,可按类型、实例、TraceId、错误关键字、入库时长筛选并先预览
失败聚类按错误原因、作业类型、实例、TraceId 聚合,显示成员错误与时间,可带条件进入重放

paused 作业通过恢复所属实例续跑;正在自动重试的 pending 作业不接受竞争性的手动重试。重放和批量重试缺省每秒 20 条,范围 1–200 条/秒,通过错开 runAt 分散压力;条件重放缺省及最大单次 500 条。返回的 success 是成功提交操作的数量,最终业务结果仍需查看账本和尝试记录。

API 与权限 ​

以下路径相对于 /api/workflows/engine。读取与预览使用 workflow:instance:monitor,重试、取消和重放使用 workflow:engine:operate,变更操作进入操作审计。

方法路径用途
GET/jobs、/jobs/summary列表与分类状态计数
GET/jobs/runtime-status运行状态
GET/jobs/{id}详情与尝试记录
GET/jobs/chain/{traceId}链路
GET/jobs/chain/{traceId}/diagnostic-bundle链路诊断包
GET/jobs/failure-clusters多维失败聚类
POST/jobs/{id}/retry、/jobs/{id}/skip单条重试、跳过 / 取消
POST/jobs/batch-retry、/jobs/batch-skip批量处理
POST/jobs/replay-preview、/jobs/replay-dead条件重放预览、提交

作业账本与运行状态是运维整体查询;实例、任务、业务配置和事件投递等页面的租户 / 数据范围规则见权限与范围控制。

Built with VitePress for local documentation preview.