Skip to content

Task 层 ​

Task是NACEB的最小执行单元,负责执行一个具体任务并返回结果。

执行逻辑由TaskHandler定义,运行时由TaskInstance承载。

接口 ​

Task没有独立的TaskInterface。Pipeline通过PipelineStep指定Task名称与输入。

Task正常完成后,返回值由TaskResponse承载:

ts
class TaskResponse {
  readonly result: unknown
}

Task接收普通信号和中止信号:

ts
interface NormalSignal {
  signalId: string
  kind: 'normal'
  payload: unknown
}

type TaskSignal = NormalSignal | { kind: 'abort' }

实例 ​

ts
class TaskInstance {
  readonly id: string
  readonly pipeline: PipelineInstance
  readonly name: string
  readonly busyKeys: string[]
  readonly input: unknown
  readonly state: Record<string, any>

  status: TaskStatus
  response?: TaskResponse
  error?: unknown

  readonly eventId: string
  readonly abortSignal: AbortSignal

  processingResultReport(chunk: unknown): void
  onSignal(signal: TaskSignal): Promise<void>
  isBlocked(): boolean
  consume(): unknown
}
成员作用
idTaskInstance的唯一ID
pipeline所属PipelineInstance
name当前绑定的TaskHandler名称
busyKeys本Task占用的资源
inputPipelineStep提供的输入
state当前TaskInstance的状态空间
status当前Task状态
response正常完成后的TaskResponse
error执行失败时的错误
eventId所属Event的ID
abortSignal协商终止当前执行的AbortSignal
processingResultReport(chunk)上报一条过程消息
onSignal()处理普通信号或中止信号
isBlocked()判断本Task是否属于BlockedTask
consume()取出结果并移除本TaskInstance

TaskHandler.execute()与onSignal()的this绑定到TaskInstance。

跨Task步骤的数据应写入this.pipeline.state。

WARNING

status、response与error由NACEB维护,不应由Handler修改。

Async 与 Blocked ​

Task类型只由busyKeys区分:

busyKeys类型调度方式
未设置或空数组AsyncTask不限制并发
包含一个或多个资源键BlockedTask取得所有对应资源后执行

相同busyKey的BlockedTask共用一条Lane,同一时刻最多运行一个。

包含多个busyKeys的Task必须同时位于所有Lane的队首,且所有Lane均空闲。

payloadSchema会在TaskInstance创建前校验输入,但不会转换输入。

定义方式见TaskHandler。

调度 ​

TaskFSMController负责查找TaskHandler、校验输入、创建并持有TaskInstance,以及维护Async队列和Blocked Lane。

每一刻到来时,TaskFSMController会:

  1. 将Async队列中所有pending Task转为running并调用对应TaskHandler.execute()。
  2. 检查Blocked Lane,将同时满足所有资源条件的pending Task转为running并执行。

Task执行完成后,由TaskInstance直接进入done、failure或stopped并唤醒下一刻,不等待Task层再次调度。结果由Pipeline层在下一刻消费。

信号与协商终止由TaskInstance直接响应。暂停与恢复见生命周期,时钟机制见刻。

Released under the MIT License.