bravo3 / workflow
工作流决策引擎
Requires
- php: >=5.5.0
- aws/aws-sdk-php: ~2.7
- eloquent/enumeration: ~5.1
- predis/predis: ~1.0
- psr/log: ~1.0
- symfony/event-dispatcher: >=2.5
- symfony/yaml: >=2.5
Requires (Dev)
- bravo3/properties: ~1.0
- phpunit/phpunit: >=4.1.0
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(或等效提供者)处分配默认的超时值,尽管您也可以在模式级别覆盖这些值。