Azure Durable Function Activity 似乎运行多次且未完成

Posted

技术标签:

【中文标题】Azure Durable Function Activity 似乎运行多次且未完成【英文标题】:Azure Durable Function Activity seems to run multiple times and not complete 【发布时间】:2020-05-29 14:26:52 【问题描述】:

我有一个耐用的功能扇出和输入模式,它似乎不能可靠地工作。 Orchestration 每 10 分钟从 Timer 函数调用一次,但此后增加到 20。 Activity 函数使用 context.CallActivityAsync 调用并返回一个整数(处理的行数)。目前,传入的 workItems 应该只包含 2 个要处理的项目。第一项处理所有行并在日志中显示完整。第二项有时会显示正在处理的行,但在某些时候它只是停止了......没有其他活动被识别,并且“完成”永远不会出现在日志中。此外,第二个活动有时会显示它同时运行多次...... 我已经在我的开发机器上使用相同的数据尝试了这个确切的代码,它处理完成的时间不超过 5 分钟。我还将 hosts.json 文件设置为


  "version": "2.0",
  "functionTimeout": "00:10:00",
  "extensions": 
    "queues": 
      "maxPollingInterval": "00:00:05"
    
  

编排:

public static async void RunOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context, ILogger log)
        
            log.LogInformation($"************** Fanning out ********************");
            var parallelTasks = new List<Task<int>>();
            //object[] workBatch = await context.CallActivityAsync<object[]>("GETVendors", null);
            object[] workBatch = GETVendors(log); //work batch only has 2 items 
            for (int i = 0; i<workBatch.Length; i++)
            
                Task<int> task = context.CallActivityAsync<int>("SynchVendor", workBatch[i]);
                parallelTasks.Add(task);
            

            log.LogInformation($"************** 'Waiting' for parallel results ********************");
            await Task.WhenAll(parallelTasks);
            log.LogInformation($"************** All activity functions complete ********************");

            log.LogInformation($"************** fanning in ********************");
            int cnt = 0;
            foreach (var completedParallelActivity in parallelTasks)
            
                cnt += completedParallelActivity.Result;
            
            log.LogInformation($"Total Records Converted across all tasks = cnt");
            //return outputs;
        

活动功能

public static async Task<int> SynchVendor([ActivityTrigger] string vendor, ILogger log)
        
            log.LogInformation($"SynchVendor vendor");


            string sqlStr = Environment.GetEnvironmentVariable("Sqldb_Connection");
            bool dev = Convert.ToBoolean(Environment.GetEnvironmentVariable("Dev"));
            int totalCount = 0;

            using (SqlConnection conn = new SqlConnection(sqlStr))
            
                conn.Open();


                // lets synch the vendor


                Int32 limit = 200;
                bool initialLoad = false;
                int offset = 0;
                bool done = false;

                do
                

                    //synch logic...
                    // if there are rows found to have changed then send them to a queue for further processing

                 while (!done);

                // we are done syncing a vendor write out the vendorinfo


                conn.Close();
            
            log.LogInformation($"SynchVendor vendor Complete");
            return totalCount;

【问题讨论】:

【参考方案1】:

对于额外的日志记录,你需要在你的 log.Log*** 操作前添加这个:

if (!context.IsReplaying) 

更多信息请参见https://docs.microsoft.com/en-us/sandbox/functions-recipes/durable-diagnostics#logging-in-orchestrator-functions。

对于你永远看不到完成的问题,你可以做一些事情:

    您没有错误处理。如果您的活动函数抛出异常会发生什么?您应该使用带有日志的 Try/Catch 来让您知道什么时候失败了。 功能日志显示什么?请注意,我不是在谈论 customDimensions.Category=="User" 的日志(即您的日志条目),而是在 Functions 运行时执行的日志。在您的 appinsights 日志中,在适当的时间范围内运行“联合跟踪 | 联合异常”,以查看 Functions 运行时在做什么。 尝试添加一个超时任务,这样即使您的其中一项任务没有完成,您的协调器也能完成。见https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-error-handling?tabs=csharp#function-timeouts。

【讨论】:

谢谢 kwill,我确实有 Try/Catch 错误处理,在捕获时会创建一个带有 e.message 的日志。迄今为止,我没有收到任何错误日志。对日志的检查显示没有异常,但在处理重复条目的地方有大量跟踪:处理了 SynchVendor 800,毫秒后处理了 SynchVendor 800 ... 然后处理了另一组 SynchVendor 1000,处理了 SynchVendor 1000 ... 它应该大约5000 但它永远不会超过 1400 然后停止。 (它也不应该与相同的供应商 ID 并行运行)。

以上是关于Azure Durable Function Activity 似乎运行多次且未完成的主要内容,如果未能解决你的问题,请参考以下文章

如何将 POST 参数传递给 Durable Function,然后将此参数传递给 Timer Triggered 函数

Azure Durable 编排功能触发两次

Azure Durable Functions 无法将 HttpRequestMessage 作为 OrchestrationClient.StartNewAsync 的输入传递

使用 Durable Functions 推送到服务总线的消息计数不可靠

cassandra durable_writes = false,简单策略

Azure 流分析无法触发 Azure Function