调试启动时Durable Functions编排器自动触发问题咨询
问题背景
开发包含多个顺序执行、并行执行活动函数的Durable Function(持久函数),编写的Orchestrator(编排器)函数代码如下:
[FunctionName("Orchestration")] public static async Task<List<string>> RunOrchestrator( [OrchestrationTrigger] IDurableOrchestrationContext context) { var outputs = new List<string>(); var data = context.GetInput<OrchestrationInput>(); // Replace "hello" with the name of your Durable Activity Function. outputs.Add(await context.CallActivityAsync<string>("ConfigMetadata", data.Payload)); outputs.Add(await context.CallActivityAsync<string>("ObjectMetadata", "Seattle")); outputs.Add(await context.CallActivityAsync<string>("Versioning", "London")); // returns ["Hello Tokyo!", "Hello Seattle!", "Hello London!"] return outputs; }
初始阶段通过Postman调用对应的HTTP触发器函数时可正常触发业务流程,某次运行因出现错误停止调试后,后续每次启动调试时,上述编排器函数都会自动触发并调用关联的活动函数,无需手动发起HTTP触发请求。经排查推测该问题由存储中残留的历史队列记录导致,需要可行方案实现每次启动调试时清空残留队列数据,获得全新的干净运行环境,避免旧的编排实例自动执行。
可行解决方案
- 重置本地仿真存储
本地调试Durable Function默认使用Azurite(原Azure Storage Emulator)作为持久化存储,残留的编排记录全部存储在本地仿真存储实例中。每次启动调试前先停止正在运行的Azurite进程,执行重置命令清空所有存储数据即可:azurite --reset
重置完成后再启动Azurite和函数调试进程,即可获得完全干净的运行环境。 - 调用内置API清除残留实例历史
Durable Functions内置了实例历史清理能力,有两种实现方式:- 启动调试后调用本地管理端点清理:向
http://localhost:7071/admin/functions/Orchestration/purge发送POST请求,即可清除该编排器下所有残留的实例记录、队列消息。 - 在调试初始化逻辑中添加自动清理代码:通过
IDurableOrchestrationClient的PurgeInstanceHistoryAsync方法,批量清除指定时间范围内(比如调试启动时间之前的所有实例)的历史数据,无需手动调用接口。
- 启动调试后调用本地管理端点清理:向
- 调试环境使用动态任务中心名称
Durable Functions通过*任务中心(Task Hub)*名称隔离不同环境的编排存储资源,所有队列、表、Blob资源都会以任务中心名称作为前缀。可以在本地调试配置中,为每次启动生成带随机后缀的任务中心名称,从根源上避免读取到历史运行的残留数据,配置示例如下:{ "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "DurableTask:HubName": "DebugHub_{随机生成的字符串后缀}" } } - 手动删除存储中的Durable Task相关资源
打开存储资源管理器连接本地Azurite实例,找到对应任务中心前缀的所有队列、实例表、历史记录表、相关Blob容器,手动删除后重启函数宿主即可,该方式无需修改任何代码或配置,适合临时清理场景。
内容的提问来源于stack exchange,提问作者Sandeep Thomas
相关产品推荐
相关产品推荐

