简介:本文主要介绍Netflix导体的基本概念和主要操作机制。
作者|Yeyang Source |阿里技术公共帐户
本文主要介绍Netflix导体的基本概念和主要操作机制。
Netflix导体是基于Java语言的开源过程引擎,用于基于体系结构的流程流程。它具有以下特征:
1个任务
任务是最低执行单元,它具有执行逻辑的一部分,例如发送HTTP请求。
导体提供了几个构建的系统任务:
2工作流程
3输入和输出;
任务的输入是一个映射,是其他任务的工作流程或输出实例的一部分。从工作流或其他任务作为后续任务的输入,允许输入/输出。
任务实现了原子操作和过程控制操作的处理,工作流程定义了任务的循环关系,任务引用了工作流或其他任务的输入和输出。通过这些机制,导体实现了JSON DSL过程的描述。
主要分为几个部分:
1个任务状态转移
2个任务队列
任务的执行(同步系统任务除外)将首先添加到任务队列,该任务队列是典型的生产者消费者模型。
可以插入队列接口,导体提供了Dynomite,MySQL和PostgreSQL的实现。
3核心功能实施机制
导体调度的核心是决定器服务。根据当前过程的当前过程,它分析要执行要执行的任务列表,并将任务输入团队进行执行。
决定的主要过程被简化为如下。有关详细信息,请参见WorkFlowExecutor.java的决定方法:
其中,调度任务处理过程简化为如下。有关详细信息,请参阅工作flowexecutor.java的ScheduleTask方法:
决定触发时机
主要触发时机:
过程控制节点实现机制
1)任务和TaskMapper
对于每个任务,都有两个部分:任务和TaskMapper:
对于普通任务,TaskMapper返回任务本身,以补充某些执行实例的某些状态信息。但是对于控制节点,将有不同的逻辑。
2)条件分支的实施机制(开关)
开关用于根据条件来判断不同的分支。
实际上,节点的任务没有执行任何操作。TaskMapper根据分支条件判断分支后,返回相应分支的第一个任务。
switchTaskMapper.java getMappappasks方法密钥代码:
3)平行的实现机制(叉)
叉用于打开多个并行分支。
实际上,该节点的任务无需做任何事情,并且TaskMapper返回所有并行分支的第一个任务。ForkJointaskMapper.javagetMappappappasks关键代码:
通常,分支(开关)和并行节点本身不会执行逻辑。它返回任务以通过TaskMapper积极执行,然后将其交给Decider Service进行处理。
重试的实现机制
审查和延迟时间设置是通过任务队列的功能来实现的。
评论:再次将任务添加到任务队列
重试的延迟时间:设置添加到任务队列时的延迟时间。延迟时间之后,可以在队列中的民意调查执行任务
由于偶尔的情况,例如机器重新启动,网络异常和JVM在调度过程中崩溃,因此将导致决定过程意外结束的决定过程,并且该过程的执行是不完整的。其他状态错误和其他异常现象。
1个WorkflowReconciler
为了应对这种情况,导体有一个WorkFlowReconciler,该工作将尝试定期尝试操作中的所有运行过程以修复流程执行的一致性。此外,它还具有检查超时过程的作用。
2个标题
那么WorkFlowReconcileer如何获得当前的运行过程?答案是决定性的。decidequeue与任务队列相同,它也是具有延迟功能的队列。它存储正在执行的过程的实例ID。任务开始执行时(包括新启动的执行,重试执行,恢复执行,重新执行的执行等),实例ID将推送到Chandecequeue Will Will贝斯
3 executionlockservice
WorkFlowReconciler将尝试定期尝试所有运行过程,以在时间限制和维护过程一致性中进行所有运行过程。但是,正常的执行本身也将触发决定。如果同时触发相同的执行,则两者决定可能引起混乱和执行等问题。
导体使用锁来解决此问题,该问题提供了一个单位localonlylylock(基于信号量实现),redis分布式锁(基于可重复性)和Zookeeper分布式锁。
在决定方法中,您将尝试首先获取锁定,并在失败时直接返回。通过锁定相同的进程实例,在同一过程实例上进行决定。
因为配置了锁,因此可能会导致误解:如果使用单个计算机,则无需配置锁。该过程将导致冲突,这可能导致偶尔出现过程状态的问题。