介绍
Conductor是一个微服务的编排引擎
Conductor优点
Conductor,帮助我们协调基于微服务的流程,具有以下功能:
- 允许创建复杂的流程/业务流,其中由微服务实现单个任务。
- 基于JSON DSL的定义执行流程。
- 为这些流程提供可见性和可追溯性。
- 在暂停,恢复,重启等周围公开控制语义,以获得更好的devops体验。
- 允许更多地重用现有的微服务,为管理提供更容易的途径。
- 用户界面可视化流程。
- 能够在需要时同步处理所有任务。
- 能够扩展数百万个并发运行的流程。
- 由客户端提取的排队服务支持。
- 能够在HTTP或其他传输上运行,例如gRPC。
为什么不进行点对点编排?
通过点对点任务编排,我们发现随着业务需求和复杂性的增长难以扩展。发布/订阅模型适用于最简单的流程,
但很快就突出了与该方法相关的一些问题:
- 流程“嵌入”在多个应用程序的代码中。
- 通常,围绕输入/输出,SLA等存在紧密耦合和假设,使得更难以适应不断变化的需求。
- 几乎没有办法系统地回答“我们用过程X做了多少”?
基本概念
工作流定义
工作流是使用基于JSON的DSL定义的,包括一组作为工作流的一部分执行的任务。任务是在远程机器上执行的控制任务(fork,条件等)或应用程序任务(例如编码文件)。
任务定义
- 所有任务都需要在活动工作流程使用之前进行注册。
- 任务可以在多个工作流程中重复使用。工人任务分为两类:
- 系统任务
- 工人任务
系统任务
系统任务在Conductor服务器的JVM内执行,并由Conductor管理,以实现其可执行性和可扩展性。
名称 | 目的 |
---|---|
DYNAMIC | 基于任务的输入表达式派生的工作任务,而不是静态定义为计划的一部分 |
DECIDE | 决策任务 - 实现案例……开关样式分叉 |
FORK | 分叉一组并行的任务。计划每个集合并行执行 |
FORK_JOIN_DYNAMIC | 与FORK类似,但FORK_JOIN_DYNAMIC不是在并行执行计划中定义的任务集,而是根据此任务的输入表达式生成并行任务 |
JOIN | 补充FORK和FORK_JOIN_DYNAMIC。用于合并一个或多个并行分支* |
SUB_WORKFLOW | 将另一个工作流嵌套为子工作流任务。在执行时,它实例化子工作流并等待它完成 |
EVENT | 在支持的事件系统中生成事件(例如,Conductor,SQS) |
Conductor提供了一个API来创建在与引擎相同的JVM中执行的用户定义任务。有关详细信息,请参阅WorkflowSystemTask接口。
工人任务
工作人员任务由应用程序实现,并在与Conductor不同的环境中运行。工作人员任务可以用任何语言实现。这些任务通过REST API端点与Conductor服务器通信,以轮询任务发现并执行,并在执行后更新其状态。
工作人员任务由计划中的任务类型SIMPLE标识。
工作流任务的生命周期
元数据定义
任务定义
Conductor维护着一个工作人员任务类型的注册表。在工作流程中使用之前必须注册任务类型。
{
"name": "encode_task",
"retryCount": 3,
"timeoutSeconds": 1200,
"inputKeys": [
"sourceRequestId",
"qcElementType"
],
"outputKeys": [
"state",
"skipped",
"result"
],
"timeoutPolicy": "TIME_OUT_WF",
"retryLogic": "FIXED",
"retryDelaySeconds": 600,
"responseTimeoutSeconds": 3600
}
领域 | 描述 |
---|---|
name | 任务类型 |
retryCount | 任务标记为失败时尝试重试的次数 |
retryLogic | 重试机制 |
timeoutSeconds | 以毫秒为单位的时间,在此之后,如果在转换到IN_PROGRESS状态后未完成任务,则将任务标记为TIMED_OUT |
timeoutPolicy | 任务的超时策略 |
responseTimeoutSeconds | 如果大于0,则在此时间之后未更新状态时,将重新安排任务。当工作人员轮询任务但由于错误/网络故障而无法完成时很有用。 |
outputKeys | 任务输出的键集。用于记录任务的输出 |