我一直在寻找比AxonFramework的Saga更复杂的工作流程 - 我们目前正在使用它 - 我在Netflix Conductor中找到了一个。可悲的是,我在互联网上搜索了一个像样的例子,但无济于事。
我的问题是,在 Netflix Conductor 中,如何定义和创建任务或工作流任务,最重要的是,将微服务链接到它?以下是来自github的Netflix Conductor代码:
WorkflowDef def = new WorkflowDef();
def.setName("test");
WorkflowTask t0 = new WorkflowTask();
t0.setName("t0");
t0.setType(Type.SIMPLE);
t0.setTaskReferenceName("t0");
WorkflowTask t1 = new WorkflowTask();
t1.setName("t1");
t1.setType(Type.SIMPLE);
t1.setTaskReferenceName("t1");
def.getTasks().add(t0);
def.getTasks().add(t1);
请原谅我的困惑,因为我是 Netflix 指挥家的新手。
假设微服务具有基于 HTTP 的 REST 端点。在这种情况下,您必须使用HttpTask,这是一个系统任务。Httptask 进行 Http 调用,响应可用作任务输出。请参考以下链接:HttpTask
请记住将包含 HttpTask 的 WorkflowDef 的 SchemaVersion 设置为 2。您还需要注册相应的任务类型。
(免责声明:我没有尝试过,我只是看了文档...
- 实现您自己的工作流系统任务
- 重写 start()/execute() 方法来调用微服务
- 根据 https://netflix.github.io/conductor/intro/concepts/#worker-taks 将任务类型设置为简单
- 定义工作线程类的任务客户端 Bean 和覆盖执行方法。
- 将任务客户端和工作线程 bean 传递给 TaskRunnerConfigurer
@Configuration
public class Configuration {
@Bean
public TaskClient taskClient(@Value("${conductor url}") String conductorServerURL) {
TaskClient taskClient = new TaskClient();
taskClient.setRootURI(conductorServerURL);
return taskClient;
}
@Bean
public TaskRunnerConfigurer taskRunnerConfigurer(
@Autowired final TaskClient taskClient,
@Autowired final List<Worker> workers) {
final TaskRunnerConfigurer taskRunnerConfigurer = new TaskRunnerConfigurer.Builder(taskClient, workers)
.withThreadCount(3)
.build();
taskRunnerConfigurer.init();
return taskRunnerConfigurer;
}
}
此工作线程将从指挥服务器轮询到任务
现在有许多 SDK 可以将微服务工作线程连接到 Conductor: https://github.com/conductor-sdk/
您可以在 Conductor 中创建 SIMPLE 任务(使用 API 端点,这些参数 https://conductor.netflix.com/configuration/taskdef.html。
工作人员在指挥中轮询您的任务。当任务作为要运行的工作时,它会将其分配给工作人员。完成后,任务将工作人员的结果带回导体工作流程。
这是 Go 中的一位工人:https://github.com/conductor-sdk/conductor-examples/tree/main/go-samples
还有一个Java示例:https://github.com/orkes-io/orkesworkers
最后 - 现在有一个免费的云游乐场供 Netflix 售票员在 https://play.orkes.io