Azure Длительная работа функции, кажется, выполняется несколько раз и не завершена - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть шаблон Durable Function Fan Out и In, который не работает надежно. Оркестровка вызывается из функции Timer каждые 10 минут, но с тех пор она увеличилась до 20. Функция Activity вызывается с помощью context.CallActivityAsyn c и возвращает целое число (количество обработанных строк). В настоящее время переданные рабочие элементы должны содержать только 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 Ответ

1 голос
/ 13 февраля 2020

Для дополнительной регистрации вам нужно добавить это перед вашим журналом. Операции с журналом ***:

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" (ie. Ваши записи журнала), но о тех, которые выполняет среда выполнения функций. В ваших журналах appinsights запустите «union traces | union exceptions» с соответствующим периодом времени, чтобы увидеть, что делает среда выполнения функций.
  3. Попробуйте добавить задачу тайм-аута, чтобы ваш оркестратор завершил работу sh, даже если один из ваши задачи не завершены. См. https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-error-handling?tabs=csharp#function - тайм-ауты .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...