Azure Durable Functions编排实例手动停止与重试次数配置问题
Azure Durable Functions编排实例手动停止与重试次数配置问题
我来帮你解决这两个实际遇到的问题,结合你的代码场景一步步说明:
1. 手动停止编排实例的方法(无需停止整个Function App)
有两种实用的方式可以终止指定的编排实例:
- 通过代码新增终止接口:你可以在现有HTTP触发函数的基础上,加一个专门用来终止实例的接口。比如在你的代码里新增这样一个函数:
@app.route(route="orchestrators/terminate/{instanceId}") @app.durable_client_input(client_name="starter") async def terminate_orchestration(req: func.HttpRequest, starter: str) -> func.HttpResponse: instance_id = req.route_params["instanceId"] # 调用Durable Client的terminate方法终止实例 await starter.terminate(instance_id, "手动终止:停止无限重试") return func.HttpResponse(f"编排实例 {instance_id} 已成功终止")
部署后,你只需要调用这个接口并传入目标实例ID,就能直接停止对应的编排执行。
- 通过Azure门户可视化操作:进入你的Function App后台,找到左侧菜单的「Durable Task Hub」(或者直接找到你的编排函数,点击「Monitor」进入实例监控页面),在实例列表里筛选出那些处于重试/挂起状态的实例,选中后点击顶部的「Terminate」按钮,就能手动停止它们。
2. 设置重试次数为0的方法
这里要分已存在的重试实例和新创建的实例两种情况处理:
- 对于已经在重试的旧实例:这些实例的重试策略已经生效,没办法直接修改它们的重试次数,只能用上面的手动终止方法来停止它们的重试循环。
- 对于新创建的编排实例,有两种配置方式可以让重试次数变为0:
- 全局配置(应用到所有编排):修改Function App根目录下的
host.json文件,添加或更新Durable Task的全局重试策略:
保存并重新部署后,所有新启动的编排实例都会遵循这个策略,失败后不再重试。{ "version": "2.0", "extensions": { "durableTask": { "orchestrationRetryPolicy": { "maxNumberOfAttempts": 0, "firstRetryIntervalInMilliseconds": 5000 } } } }
2. 单个编排实例级别配置:如果你只想针对特定启动的实例设置0重试,可以在启动编排时指定重试选项。修改你CleanMatchEnrichParcel函数里的启动代码:
这样每次通过这个接口启动的编排实例,失败后都不会进行重试。import azure.functions as func import azure.durable_functions as df from azure.durable_functions.models import RetryOptions, StartOrchestrationOptions import logging app = df.DFApp(http_auth_level=func.AuthLevel.FUNCTION) # ... 保留原有代码 ... async def CleanMatchEnrichParcel(req: func.HttpRequest, starter: str) -> func.HttpResponse: logging.info("CleanMatchEnrichParcel HTTP trigger function processed a request.") fname = req.route_params["functionName"] stateabbr = req.route_params["stateabbr"] county = req.route_params["county"] fparams = {"stateabbr": stateabbr, "county": county} # 配置重试次数为0 retry_options = RetryOptions(first_retry_interval_in_milliseconds=5000, max_number_of_attempts=0) start_options = StartOrchestrationOptions(retry_policy=retry_options) instance_id = await starter.start_new(fname, None, fparams, start_options=start_options) logging.info(f"Started orchestration with ID = '{instance_id}'.") response = starter.create_check_status_response(req, instance_id) return(response) - 全局配置(应用到所有编排):修改Function App根目录下的
备注:内容来源于stack exchange,提问作者anilcreates
相关产品推荐
相关产品推荐

