Azure Durable Functions如何将活动函数输出作为另一活动的输入
Azure Durable Functions 活动函数顺序执行与参数传递解决方案
1. 顺序执行的实现逻辑
你当前使用yield context.call_activity的写法已经天然保证了执行顺序。yield关键字会让编排器暂停执行,直到对应的活动函数运行完成并返回结果后,才会继续执行后续代码,因此Goodbye活动必然会在第一个Hello活动执行完成后才启动,无需额外配置。
2. 将Hello活动输出传递给Goodbye活动
根据你使用src_client的不同需求,分为两种实现方式:
方式1:仅传递src_client的字符串标识
你当前Hello活动返回的是字符串格式的src_client,直接修改编排函数中Goodbye活动的入参为第一个Hello活动的返回值即可:
import logging import json import azure.functions as func import azure.durable_functions as df def orchestrator_function(context: df.DurableOrchestrationContext): # 第一个Hello执行完成后才会继续向下执行 result1 = yield context.call_activity('Hello', "bestday-demo") # 直接将Hello的返回值作为入参传给Goodbye result2 = yield context.call_activity('Goodbye', result1) result3 = yield context.call_activity('Hello', "London") return [result1, result2, result3] main = df.Orchestrator.create(orchestrator_function)
Goodbye活动代码无需修改,运行后会直接返回GoodBye <src_client字符串内容>!
方式2:在Goodbye中使用src_client实例的方法
你当前Hello活动中将src_client转为了字符串返回,会丢失实例的可调用方法,需要调整返回内容为可序列化的配置结构:
- 调整Hello活动代码:
import logging from myownsdk import myClient def main(projectname: str) -> dict: SRC_PROJECT_DAY = projectname src_client = myClient( api_key= "Myapikey", client_name= "Proj-DEMO_CLIENT", project = SRC_PROJECT_DAY, debug=False ) # 返回可序列化的客户端配置,也可直接返回myClient实例(需确保实例支持JSON序列化) return { "api_key": "Myapikey", "client_name": "Proj-DEMO_CLIENT", "project": SRC_PROJECT_DAY, "debug": False }
- 调整Goodbye活动代码,初始化客户端后调用对应方法:
import logging from myownsdk import myClient def main(client_config: dict) -> str: src_client = myClient(**client_config) # 此处可调用src_client的方法获取业务数据 return f"GoodBye {src_client.project}!"
注意事项
- Durable Functions所有活动的输入、输出都必须是JSON可序列化的,不可直接传递无法序列化的自定义对象,否则会出现运行时报错。
- 编排函数需要保证确定性执行,不要在编排函数中编写随机数生成、实时时间获取等非确定性逻辑,这类逻辑需要放到活动函数中执行。
内容的提问来源于stack exchange,提问作者ZZZSharePoint
相关产品推荐
相关产品推荐

