修改Azure Durable Functions示例代码以测量活动函数数量对链式调用响应时间的影响
修改Azure Durable Functions示例代码以测量活动函数数量对链式调用响应时间的影响
没问题,我帮你调整代码,让你能灵活控制链式调用里的活动函数数量,从而精准测量不同数量下的响应时间。下面是修改后的完整代码,我会把关键改动和使用说明都讲清楚:
关键改动思路
- 去掉硬编码的固定活动函数调用,改为通过请求参数动态指定活动函数数量,方便快速测试不同场景
- 合并重复的活动函数为一个通用函数,确保每个活动的耗时完全一致(都是10秒),避免测试偏差
- 修正编排器里的时间计算逻辑:原来的代码没有等待活动函数执行完成就计算耗时,结果会完全不准,现在改为等待所有链式活动执行完毕后再统计总耗时
修改后的完整代码
import azure.functions as func import azure.durable_functions as df import logging import time from typing import Optional app = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS) # 客户端函数:支持传入活动函数数量参数 @app.route(route="orchestrators/client_function") @app.durable_client_input(client_name="client") async def client_function(req: func.HttpRequest, client: df.DurableOrchestrationClient) -> func.HttpResponse: # 从请求获取活动函数数量,默认值为2 try: # 优先从query参数获取 num_activities = int(req.params.get("num_activities", 2)) # 如果是POST请求,也可以从JSON body获取 if req.method == "POST": req_body = await req.get_json() num_activities = int(req_body.get("num_activities", num_activities)) except ValueError: return func.HttpResponse("Invalid 'num_activities' parameter, must be an integer", status_code=400) # 启动编排器,传入活动数量参数 instance_id = await client.start_new("orchestrator", None, {"num_activities": num_activities}) logging.info(f"Started orchestration with ID = '{instance_id}' and {num_activities} activities.") # 等待编排完成并返回结果 status = await client.get_status(instance_id) runtime = status.runtime_status output = status.output return func.HttpResponse(f"Runtime status: {runtime}\n\nTotal response time (seconds): {output}") # 编排器函数:根据传入的数量顺序调用活动函数 @app.orchestration_trigger(context_name="context") def orchestrator(context: df.DurableOrchestrationContext) -> float: # 获取传入的活动函数数量参数 input_data = context.get_input() num_activities = input_data.get("num_activities", 2) # 记录链式调用开始时间 start_time = time.time() # 顺序调用指定数量的活动函数(链式执行,前一个完成才开始下一个) for i in range(num_activities): # 调用通用活动函数,传入标识参数方便日志追踪 await context.call_activity("sleep_activity", f"activity_{i+1}") # 计算总耗时:从第一个活动开始到最后一个活动结束的时间 total_time = time.time() - start_time return round(total_time, 2) # 通用活动函数:统一的sleep逻辑,确保每个活动耗时一致 @app.activity_trigger(input_name="activity_name") def sleep_activity(activity_name: str): logging.info(f"Executing {activity_name}") # 每个活动固定sleep 10秒 time.sleep(10) return f"{activity_name} completed"
使用说明
- 测试不同数量的活动函数:
- 用GET请求:访问
http://localhost:7071/api/orchestrators/client_function?num_activities=5,就能测试5个活动函数链式调用的响应时间 - 用POST请求:发送JSON body
{"num_activities": 3}到同一个地址,同样可以指定数量
- 用GET请求:访问
- 验证结果:返回的响应里会显示总响应时间,你可以对比不同数量下的结果,比如2个活动理论上耗时约20秒,3个约30秒(实际会有少量Durable Functions的调度开销)
注意事项
- 确保本地运行Durable Functions的环境正常,或者部署到Azure后测试
- 日志里会显示每个活动的执行情况,方便排查问题
- 如果需要调整活动函数的耗时,只需要修改
sleep_activity里的time.sleep(10)即可
备注:内容来源于stack exchange,提问作者TY00
相关产品推荐
相关产品推荐

