bravo3/workflow

工作流决策引擎

1.1.3 2016-02-14 23:19 UTC

This package is not auto-updated.

Last update: 2024-09-24 02:44:15 UTC


README

此库的目的是创建一个决策引擎,以增强如Amazon SWF等工作流服务。

决策引擎允许您为工作流创建一个简单的模式,并最小化程序性业务逻辑或决策和工作流处理的暴露。

示例

要快速创建一个基于SWF的基于模式的流程(请参阅构建工作流),您可以使用提供的工厂

$factory = new SchemaWorkflowFactory(
    'Path/To/Schema.yml',
    $aws_config,    // AWS config
    $redis_config,  // Redis config
    3600,           // Redis key timeout - should be longer than the workflow start-to-close timeout
    'workflows'     // Redis namespace - used to isolate workflow activity on the server
);

此工厂拥有您的工作流组件所需的所有内容。要创建一个新的工作流

$factory->getWorkflowEngine()->createWorkflow('sample-workflow-name');

在守护进程端,监听决策

$factory->getDecisionEngine()->daemonise();

并监听工作任务

$factory->getWorkerEngine()->daemonise();

#daemonise() 函数无限循环运行。要终止此循环,您可以传递一个终止标志(FlagInterface),使用 MemoryFlag 将允许您在流程中根据条件终止。

如果您不想循环,只需调用 #checkForTask()

$factory->getWorkerEngine()->checkForTask();

临时调度

任务在成功(或以任何方式操作工作流)后可以安排额外的任务。这种性质在决策级别控制,因此任务必须首先成功,然后它的 onSuccess() 函数将由决策者执行。您将收到一个 Decision 对象,然后您可以使用它向决策者添加决策以执行(失败执行、安排任务等),并使用您的任务由工作者执行的 execute() 函数的结果。

向工作者任务传递数据

工作者和决策者类具有辅助数据,可以通过调用 setAuxPayload() 来设置。如果您正在使用工厂,工厂的 $payload 参数将设置由它创建的任何工作者/决策者类上的辅助有效载荷。

在任务中,您可以引用此数据(如果使用抽象任务,则为 getAuxPayload()) - 这对于给任务提供对更大的应用程序引擎的访问非常有用。有用的有效载荷可能是DI容器。

应用程序结构

最低级别的组件是在 Drivers 命名空间中找到的决策或工作者引擎。一旦创建了一个引擎,就必须将适当的决策者或工作者服务(Services 命名空间)作为订阅者添加。

当引擎接收到决策或工作任务时,引擎类将触发事件。然后服务将使用工作流和工作流历史记录实体执行任务。您可以添加多个决策和工作者服务,每个服务都有自己的逻辑。捆绑的类将遵循任务要求,并在没有更多任务运行或安排时关闭工作流,但可以完全重写此逻辑。

任务是工作流的工作组件 - 这些由工作者服务执行,并独立于决策服务运行。

内存服务是数据库平台的接口,用于存储工作者任务创建的元数据。

内存池

此工作流引擎使用键值内存池来存储状态和短暂的工作流信息。Task 类有责任根据需要持久化数据。

Redis 是理想的内存池。

构建工作流

要运行工作流,您需要一个工作流控制器,一个SaaS服务(如Amazon SWF)作为您的工作流引擎,它控制哪些活动需要执行,以及通过与此决策接口交谈来查询决策。

在工作流控制器中,您需要定义一个域,这是一个简单的名称,用于定义您的工作流环境——您可能希望为测试和生产使用不同的域。在该域内部,您需要定义一个工作流执行。这包含一个默认的任务列表,这个任务列表是您的“决策任务列表”,必须在您的工作流模式中定义。

定义任务

在您的工作流控制器中,您还必须将活动定义为工作流执行步骤。一个活动需要一个活动名称和一个活动版本。您可以在SWF(或等效提供者)处分配默认的超时值,尽管您也可以在模式级别覆盖这些值。