引擎

引擎
  引擎是实际执行任务和重试的实体。引擎通过流的模式来判断要执行哪个任务和重试,以及什么时候需要执行。
  TaskFlow提供对引擎的不同实现。每种引擎的实现具有不同的能力和配置。有些实现简单容易理解并且易于使用;有些比较复杂但是提供更好的扩展。完美的目标是让用户和开发者可以根据需要选项引擎的实现,而不用修改服务的代码。

存在的意义

  那么,引擎存在的意义是什么呢?要回答这个问题,我们需要先了解一下命令式编程和声明式编程。命令式编程关注于如何实现目标,通常意味着开发者需要定义第一步该做什么,第二步该做什么,...,将这些步骤都完成之后目标就实现了。而声明式编程则关注于目标是什么,开发者只需要定义目标是什么即可,无需关心如何实现此目标。Python是典型的命令式编程,而SQL语句是典型的声明式编程。对于“获取所有用户的姓名”这个目标,命令式编程(Python)通常会分步操作:第一步,连接数据库,第二步,执行SQL查询语句,获取姓名,第三步,处理姓名,第四步,关闭数据库连接。而对于声明式编程,只需要定义目标是什么,即SQL语句select name from user即可。
  让我们回到TaskFlow中,任务/重试/子流这些可以认为是设定的目标,而引擎可以认为是如何实现(执行)目标。相当于,使用引擎,将“目标是什么”和“如何实现目标”进行了解耦,任务/重试/子流负责定义“目标是什么”,而引擎负责“如何实现目标”。
  现实往往不是完美无缺的,引入引擎有优点也有其缺点。引人引擎的主要优点是:
    提高可靠性:将状态以及状态变化从任务中分离出来,这样引擎就可以跟踪状态的变化,并且在需要恢复的时候知道应该在哪个点开始执行。
    提高可扩展性:由于引擎负责执行任务,在任务不变的情况下,替换引擎依然可以达成最终的目标。也就是说,可以实现多种引擎,每种引擎的特性和使用场景都不相同。
    提高一致性:由于引擎负责执行任务、子流和流,因而引擎作为这种执行模式的一个实体,这样有助于保持执行模式的一致性。随着锁定技术的应用(通过tooz),引擎未来有助于获取资源,以及其它进程、线程等其它实体能获取相同的资源。
  引入引擎的缺点也很明显:
    使用引擎需要开发者从“命令式编程”转变为“命令式编程”和“声明式编程”混合的模式。
    对于现有的“命令式编程”的代码,需要对其进行修改和重构,其工作量可能会比较大。
    使用引擎的模式,还会造成传统的调试方法难以生效,特别是对于wworker不在本地而是位于远程的情况。

引擎的类型

  引擎有四种类型:线性的、并行的、工作者模式。
  线性的引擎会在一个线程中执行所有的任务。这是默认的引擎类型。
  并行的引擎会将无依赖关心的任务放到不同的线程或者进程去执行,相当于同时执行了多个任务。
  工作者模式是将任务分配给一个或者多个远程的进程去执行。

类Engine的继承关系






参考资料:
Engines
AImperative vs Declarative Programming