Zeebe服务学习5-多实例特性实践
一、背景
在0.21版本之前,Zeebe不支持多实例元素,在2019年10月9号发布的0.21版本中,加入这一特性,
主要是体现在Zeebe Modeler 0.7.0以及之后的版本中。
二、特性介绍
我对这个多实例比较好奇,研究了一下,它最终是解决了什么问题,在官方文档中介绍如下:
A multi-instance activity is executed multiple times – once for each element of a given collection (like a foreach loop in a programming language).
翻译一下:多实例流程会被执行多次——给定的集合中的每个元素都被执行一次(类似编程语言中的foreach循环)
对于这句话,我们可以理解成,你现在有个微服务接口是执行单个操作的,现在有个场景需要对它进行批量的操作,
而且批量执行之后或许需要用到返回值,那么我们可以使用这个特性。
三、Demo 演示
我在本机部署了Zeebe 0.21版本的服务,然后下载了Zeebe Modeler 0.7.0建模工具
1.建模
流程描述:外部传入参数data,这个参数结构如下:
public class Order { public string Id { get; set; } public string Code { get; set; } public string Name { get; set; } public List<OrderItem> OrderItems { get; set; } } public class OrderItem { public string Id { get; set; } public string OrderId { get; set; } public string Code { get; set; } public string Name { get; set; } public int Count { get; set; } }
第一步先根据参数创建主单信息,第二步通过拿到主单Id去批量创建明细单的信息,最后一步是观察一下最终可以拿到什么返回值(观察Zeebe Variables的值)
2.执行代码
public static async Task Main(string[] args) { // create zeebe client _client = ZeebeClient.NewZeebeClient(ZeebeUrl); // deploy var deployResponse = await _client.NewDeployCommand().AddResourceFile(DemoProcessPath).Send(); // create workflow instance var workflowKey = deployResponse.Workflows[0].WorkflowKey; // 发起调用 var workflowInstance = await _client .NewCreateWorkflowInstanceCommand() .WorkflowKey(workflowKey) .Variables(JsonConvert.SerializeObject(WorkflowInstanceVariables)) .Send(); // 模拟JobWorkers监听 Initial(); }
其实结果是失败的,因为我们没有配置多实例的inputCollection,补充上这块的配置
配置完成后,再去执行,结果如下:
这是按照顺序执行的规则来的也就是,C#的foreach使用的方法,顺序执行每个元素。
在Zeebe Variables里面会有一个responses字段(这是我们定义的Output Collection),里面包含着这两次执行后的结果列表。
另外还有一种并行执行的,类似于C#中的Parallel.ForEach(),在此不作赘述。
四、总结
这个特性其实是Zeebe对于微服务接口的扩展,将执行单个的接口扩展成批量接口,执行逻辑上支持顺序执行与并发执行。
参考:
【1】https://docs.zeebe.io/bpmn-workflows/multi-instance/multi-instance.html