簡體   English   中英

Azure Durable Function Activity 似乎運行多次但未完成

[英]Azure Durable Function Activity seems to run multiple times and not complete

我有一個 Durable Function Fan Out 和 In 模式,它似乎無法可靠地工作。 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;

對於額外的日志,你需要在你的 log.Log*** 操作前面添加:

if (!context.IsReplaying) 

有關更多信息,請參閱https://docs.microsoft.com/en-us/sandbox/functions-recipes/durable-diagnostics#logging-in-orchestrator-functions

對於永遠看不到完成的問題,您可以執行以下操作:

  1. 您沒有錯誤處理。 如果您的活動函數拋出異常會發生什么? 您應該使用帶有日志的 Try/Catch 來讓您知道何時出現故障。
  2. 功能日志顯示什么? 請注意,我不是在談論 customDimensions.Category=="User"(即您的日志條目)的日志,而是函數運行時執行的日志。 在您的 appinsights 日志中,在適當的時間范圍內運行“union traces | union exceptions”以查看 Functions 運行時正在執行的操作。
  3. 嘗試添加超時任務,以便協調器即使您的任務之一未完成也能完成。 請參閱https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-error-handling?tabs=csharp#function-timeouts

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM