Dapr Workflow构建块的.NET Demo

Dapr 1.10版本中 带来了最有亮点的特性就是工作流构建块的的发布,虽然是Alpha 阶段,可以让我们尽早在应用系统中规划工作流, 在使用Dapr的系统中更好的编写负责的分布式应用系统。Dapr 工作流使你能够生成跨多个应用的长时间运行的持久进程或数据流。Dapr 工作流可以与其他 Dapr API 构建基块结合使用。例如,工作流可以通过服务调用调用另一个服务、触发绑定或检索机密,从而使您能够编排和构建复杂的应用程序方案。.

Dapr 工作流构建块的提案早在2022年的5月份提出,计划在 Dapr Runtime 中构建工作流引擎,社区反映非常积极。这个提案(https://github.com/dapr/dapr/issues/4576)内容比较长 ,敖小剑 有一个翻译的中文版:[译] Dapr 工作流提案。在Alpha版本里完成了以下内容:

  • 内置工作流引擎将作为初始预览功能提供 ,这个内置工作流引擎是Azure 上的 持久任务框架 (DTF),在在Azure 基础设施有大量的应用,它是用.NET 编写的。Dapr团队正在把这个实践抽象成工作流构建块,基于Dapr Actor构建块来实现。Beta 版本会实现 Logic Apps 作为工作流引擎,当然还有更多的工作流引擎可以集成进入Dapr Workflow构建块里。

  • API 将支持 3 种方法(启动、停止、获取状态)的工作流管理

  • API 将作为 alpha 版发布

  • 内置引擎的 API 支持

  • 创作 SDK 将支持:.NET

  • 管理 API SDK 将支持:.NET

  • 文档,详细的介绍了Dapr Workflow构建块的工作原理等,推荐大家详细的看一看:https://docs.dapr.io/developing-applications/building-blocks/workflow/workflow-overview/

  • 代码示例(.NET ),快速入门文档里包含了。

Dapr 工作流构建块目前是alpha版本,自然是有很多限制的,不推荐应用于生产环境中,至少等到beta版本时再考虑应用于生产,通常应用于生产环境的组件都是stable 版本的。Dapr Workflow 构建块让我们看到了他的潜力,Dapr Actor 模块基本上.NET圈子用的多,在其他java,go等用的很少,工作流模块组合上 Actor 构建块会让Dapr 上一个台阶,和其他类似框架的领先度进一步加大。我们常说“ 技术总是在短期内被高估,但是在长期又被低估。” 再来看看这句话,短期内被高估是因为在短期内的需求所迫,长期内被低估是因为技术的隐形需求要比实际上的业务务求多得多。

作为开发者,你需要考虑你将要投身的技术领域长期的隐形成本与试错成本。再者,投入到某个技术领域中其实不能走马观花,而要长期以往的进行深入研究与学习,才能获取更高的技术视野。Dapr 作为云原生时代的开发框架值得投入进去深入研究和学习。

在Dapr的 components-contrib 仓库里 也有一个 https://github.com/dapr/components-contrib/tree/master/workflows ,其中包含了一个分布式调度框架

Temporal https://github.com/temporalio/temporal 的一个组件实现。

现在 可以使用 .NET SDK 体验 Dapr 工作流,在Dapr 工作流的快速入门文档里包含了.NET 的示例,创建一个简单的控制台应用程序来演示 Dapr 的工作流编程模型和工作流管理 API。Dapr Workflow构建块的.NET Demo

控制台应用order-processor 启动并管理在状态存储中存储和检索数据的工作流的生命周期。工作流OrderProcessingWorkflow 由四个工作流活动或任务组成:

  • NotifyActivity:利用记录器在整个工作流程中打印出消息

  • ReserveInventoryActivity:检查状态存储以确保有足够的库存供购买

  • ProcessPaymentActivity:处理和授权付款

  • UpdateInventoryActivity:从状态存储中删除请求的物料,并使用新的剩余库存值更新存储

快速入门存储库中提供的示例代码。仓库地址:https://github.com/dapr/quickstarts.git ,我们把它克隆到本地,进入到示例代码目录 order-processor:

cd workflows/csharp/sdk/order-processor

在终端中,与 Dapr Sidecar 一起启动订单处理器应用:dapr run --app-id order-processor dotnet run ,下面是一次完整运行的输出:

Dapr Workflow构建块的.NET Demo

Dapr Workflow构建块的.NET Demo

Dapr Workflow构建块的.NET Demo

这里面发生的事情大概如下:

  1. 为工作流生成唯一的订单 ID(在上面的示例中为49caa2d7 ),并启动工作流。

  2. 工作流活动NotifyActivity发送一条通知,指出已收到 10 辆汽车的订单。

  3. 工作流活动ReserveInventoryActivity检查库存数据,确定您是否可以提供订购的物料,并使用库存中的汽车数量进行响应。

  4. 您的工作流将启动并通知您其状态。

  5. 工作流活动ProcessPaymentActivity开始处理订单49caa2d7 付款并确认是否成功。

  6. 处理订单后,工作流活动UpdateInventoryActivity使用当前可用汽车更新库存。

  7. 工作流活动NotifyActivity发送一条通知,指出订单 49caa2d7 已完成。

  8. 工作流在完成时终止。