Skip to content

Pipeline 层 ​

Pipeline是Event与Task之间的流程层。

Pipeline专注于用当前状态和上一个Task的结果决定下一步。

流程由PipelineHandler定义,运行时由PipelineInstance承载。每个Event最多对应一个PipelineInstance。

接口 ​

Pipeline没有独立的PipelineInterface。它通过PipelineStep描述下一步要派发的Task:

ts
interface PipelineStep {
  task: string
  input: unknown
}
字段作用
task要执行的TaskHandler名称
input传给下一TaskInstance的输入

PipelineHandler.next()返回PipelineStep,具体规则见PipelineHandler。

实例 ​

ts
class PipelineInstance {
  readonly id: string
  readonly event: EventInstance
  readonly handler: PipelineHandler
  readonly state: Record<string, any>

  status: PipelineStatus
  currentTaskId: string | null

  getTask(): TaskInstance | null
  signalTask(signal: TaskSignal): Promise<void>
  consume(): unknown
}
成员作用
idPipelineInstance的唯一ID
event当前处理的EventInstance
handler当前绑定的PipelineHandler
state跨Task步骤共享的状态空间
status当前Pipeline状态
currentTaskId当前TaskInstance的ID
getTask()获取当前TaskInstance;不存在时返回null
signalTask()将信号发送给当前TaskInstance
consume()取出终局结果并移除本PipelineInstance

PipelineHandler.next()与onNormalSIG()的this绑定到PipelineInstance。Handler全局复用,流程中的可变数据应写入this.state。

WARNING

status与currentTaskId由NACEB维护,不应由Handler修改。

调度 ​

PipelineFSMController负责校验PipelineHandler是否已注册、为Event创建并持有PipelineInstance、按Event查询实例,以及转发普通信号。

每一刻到来时,PipelineFSMController按以下顺序检查所有PipelineInstance:

  1. 处理running Pipeline的已终局Task。
  2. Task为done时消费其结果;若为$terminal,Pipeline进入done,否则将结果传给PipelineHandler.next()并派发下一步。
  3. Task为stopped时,Pipeline进入paused。
  4. Task为failure时消费错误结果,Pipeline进入failure。
  5. 对pending Pipeline调用首次next(undefined),并派发第一个Task。

与Event层不同,Pipeline层每一刻可以推进多个PipelineInstance。

暂停、恢复和普通信号由PipelineInstance响应,不等待下一刻;具体调用由上层EventInstance发起。

状态变化见生命周期,NACEB的时钟机制见刻。

Released under the MIT License.