Conductor
netflix conductor 是基于Java开发的开源流程引擎,用于编排微服务的流程。有如下特性:
- 允许创建复杂的业务流程,流程中每个独立的任务都是由一个微服务所实现。
- 基于JSON DSL创建工作流,对于任务的执行进行编排。
- 工作流在执行过程中可观测、可追溯
- 提供暂停、回复、重启等多种控制
- 提供一种简单的方式来最大限度的重用微服务
- 拥有扩展到百万罗成并发运行的服务能力
- 通过队列服务实现客户端与服务端的分离
- 支持http或其他RPC协议进行通信
基本概念
聊概念要基于conductor整体架构进行描述。整体架构图如下:
涉及到的概念如下:
Orchestrator
: 负责流程的流转调度工作;Management/Execution Service
: 提供流程、任务的管理更新等操作;TaskQueues
: 任务队列,Orchestrator
解析出来的待执行Task
会放到队列中;Worker
: 任务执行worker
,从TaskQueues
中获取任务,通过Execution Service
更新任务状态与结果数据;Database
: 元数据&运行时数据库,用于保存运行时的Workflow
、Task
等状态信息,以及流程任务定义的等原信息;Index
: 索引数据库,用于存储执行历史;
还有相关的执行状态概念,如图:
Task
:Task
是最小执行单元,承载了一段执行逻辑,如发送HTTP请求等workflow
: 由一系列需要执行的Task组成,conductor采用json来描述Task的流转关系。除基本的顺序流程外,借助内置的SWITCH
、FORK
、JOIN
、DO_WIHLE
、TERMINATE
任务,还能实现分支、并行、循环、提前结束等流程控制Task
的输入是一种映射,其作为工作流实例化的一部分或某些其他Task的输出。允许将来自工作流或其他Task的输入/输出作为随后执行的Task的输入
Task 状态
task作为最小执行单元,必然有状态的转移,Task的状态机如图:
- SCHEDULED:待调度,task放到队列中还没有被poll出来执行时的状态
- IN_PROGRESS:执行中,被poll出来执行但还没有完成时的状态
- COMPLETED:执行完成
- FAILED:执行失败
- CANCELLED:被中止时为此状态,一般出现在两种情况:
- 手动中止流程时,正在运行中的task会被置为此状态;
- 多个fork分支,当某个分支的task失败时,其它分支中正在运行的task会被置为此状态;
执行流程
整体执行流程如图:
- 首先在conductor server上定义task和workflow
- 通过接口启动workflow
- 编排服务会从存储中取得workflow和其中task的metadata,通过状态机服务判断当前要执行的task放入task queues,并置此task状态为SCHEDULED,等待worker认领
- 启动各微服务worker,在worker中声明当前worker对应的task定义的名字
- worker会轮询conductor server,如果发现有同名的任务被放入task queues里,认领此任务,并更新任务状态为IN_PROGRESS,然后开始执行worker内业务逻辑
- worker中业务逻辑执行完后,根据至执行结果,更新任务状态为COMPLETE或FAIL
- conductor server监听此任务如果变为COMPLETE或FAIL执行下一个节点或重试等逻辑操作,如此往复。
代码主结构
代码结构说明:
- client层:Conductor的使用场景是服务编排,必然会涉及client和server端也就是说在我们的微服务中的服务中可以使用client端来和conductor的server端进行通信,根据不同状态来执行相应任务。
- server层:负责conductor server端的启动、工作流任务的启动,由server层调用core层实现分布式状态机控制和任务的调度。
- common层:这一层主要涉及的是Task任务和Workflow工作流的元数据和请求参数定义,还有一些工具类。
- core层【核心模块】:这一层主要包括的是核心类,包括:事件、队列功能类,还包括任务类型定义、每种类型任务的具体实现逻辑和映射关系,比如分支条件如何进行判断,逻辑表达式如何解析,并行任务如何执行等等。
- jersey层:这个主要提供的是Swagger接口展示层,通过启动这个模块可以看到一个接口列表页面,用户可以在界面上操作接口实现任务和工作流元数据的编写和上传,还可以在界面上启动工作流引擎等。
- contribs层:亚马逊消息SQS
- es-persistence:这一层主要是持久层,根据请求版本不同包括es5和es6二个模块,作用主要包括将任务和工作流元数据保存到es中,还有就是将任务运行时数据进行保存,比如任务执行的状态,执行时间等等。
- mysql-persistence:mysql持久层,存储任务和工作流定义的元数据。
- redis-persistence:redis持久层,存储任务和工作流定义的元数据。
- conductor-cassandra-persistence:cassandra持久层,存储任务和工作流定义的元数据。
grpc、grpc-client、grpc-server是用于支持rpc通信相关的模块
基础概念做基本了解,后续会将业务流编排能力,应用与wms,实现通用wms的升级。
相关文章
概念科普
使用Conductor