你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Durable Functions 类型和功能
Durable Functions 是 Azure Functions 的一个扩展。 可将 Azure Functions 用于函数执行的有状态业务流程。 持久函数应用是由不同 Azure 函数构成的解决方案。 函数可在持久函数业务流程中扮演不同的角色。
Azure Functions 中目前有四种持久函数类型:活动、业务流程协调程序、实体和客户端。 此部分的其余内容详细介绍业务流程中涉及的函数类型。
业务流程协调程序函数
业务流程协调程序函数描述操作的执行方式和操作的执行顺序。 业务流程协调程序函数描述代码(C# 或 JavaScript)中的业务流程,如 Durable Functions 应用程序模式中所示。 业务流程可以包含许多不同类型的操作,包括活动函数、子业务流程、等待外部事件、HTTP 和计时器。 业务流程协调程序函数也可以与实体函数交互。
注意
业务流程协调程序函数使用常规代码编写,但对于如何编写代码存在严格的要求。 具体说来,业务流程协调程序函数代码必须是确定性的。 如果没有遵循这些确定性要求,则可能导致业务流程协调程序函数无法正确运行。 若要详细了解这些要求以及如何应对它们,可参阅代码约束主题。
若要更详细地了解业务流程协调程序函数及其功能,请参阅持久业务流程一文。
活动函数
活动函数是持久函数业务流程中的基本工作单元。 活动函数是在过程中协调的函数和任务。 例如,可以创建一个业务流程协调程序函数来处理订单。 任务涉及到检查库存、向客户收费和创建发货单。 每个任务都是一个单独的活动函数。 这些活动函数可以顺序执行,也可以并行执行,或按二者的某种组合来执行。
与业务流程协调程序函数不同,活动函数对于可在其中执行的工作类型没有限制。 活动函数频繁用于进行网络调用,或运行 CPU 密集型操作。 活动函数还可以将数据返回到业务流程协调程序函数。 Durable Task Framework 可保证在业务流程执行期间每个调用的活动函数至少执行一次。
注意
由于活动函数只保证至少执行一次,因此建议你尽可能将活动函数逻辑设置为幂等。
使用活动触发器定义活动函数。 .NET 函数以参数的形式接收 DurableActivityContext
。 还可以将触发器绑定到任何其他可进行 JSON 序列化的对象,将输入传递给函数。 在 JavaScript 中,可以通过 context.bindings
对象中的 <activity trigger binding name>
属性访问输入。 活动函数只能将单个值传递给它们。 若要传递多个值,必须使用元组、数组或复杂类型。
注意
只能从业务流程协调程序函数触发活动函数。
实体函数
实体函数定义用于读取和更新较小状态片段的操作。 我们通常将此类有状态实体称为“持久实体”。 与业务流程协调程序函数类似,实体函数是具有特殊触发器类型“实体触发器”的函数。 它们也可以从客户端函数或业务流程协调程序函数调用。 与业务流程协调程序函数不同,实体函数没有任何特定的代码约束。 实体函数还会显式管理状态,而不是通过控制流隐式表示状态。
注意
实体函数和相关功能仅在 Durable Functions 2.0 及更高版本中可用。
有关实体函数的详细信息,请参阅持久实体一文。
客户端函数
业务流程协调程序函数通过业务流程触发器绑定触发,实体函数通过实体触发器绑定触发。 这两个触发器在生效时,会响应在任务中心排队的消息。 若要传递这些消息,主要方式是在某个客户端函数中使用业务流程协调程序客户端绑定或实体客户端绑定。 任何非业务流程协调程序函数都可以是客户端函数。 例如,可以从 HTTP 触发的函数、Azure 事件中心触发的函数等触发业务流程协调程序。使一个函数成为客户端函数的原因是它使用了持久客户端输出绑定。
注意
与其他函数类型不同,业务流程协调程序函数和实体函数不能在 Azure 门户中使用按钮直接触发。 若要在 Azure 门户中测试某个业务流程协调程序函数或实体函数,必须改为运行一个客户端函数,该函数会在实现过程中启动业务流程协调程序函数或实体函数。 若要获取最简单的测试体验,建议使用手动触发器函数。
除了触发业务流程协调程序函数或实体函数,还可以使用持久客户端绑定与正在运行的业务流程和实体进行交互。 例如,业务流程可以查询、可以终止,还可以引发事件。 若要详细了解如何管理业务流程和实体,请参阅实例管理一文。
后续步骤
要开始体验,请在 C#、JavaScript、Python、PowerShell 或 Java 中创建第一个持久函数。