Прочная функция переключается обратно в рабочее состояние после завершения

#.net-core #azure-functions #azure-durable-functions

Вопрос:

У меня есть надежная функция, которая, кажется, всегда находится в рабочем состоянии. Даже когда он успешно завершился.

Кажется, что он завершен, а затем RunningStatus Running по какой-то причине обновляет заднюю часть. Это конец моих журналов:

 [2021-07-22T08:52:59.211Z] Executing 'SavingsOrchestrator' (Reason='(null)', Id=36d509f3-4655-4382-9b72-ccb6fc39f413)
[2021-07-22T08:52:59.230Z] Executed 'SavingsOrchestrator' (Succeeded, Id=36d509f3-4655-4382-9b72-ccb6fc39f413, Duration=51ms)
[2021-07-22T08:53:02.206Z] SaveCustomerSavings stored 34 records.
[2021-07-22T08:53:02.210Z] Orechestrator_SaveCustomerSavings: Function 'SavingsOrchestrator (Orchestrator)' awaited. IsReplay: False. State: Awaited. HubName: TestHubName. AppName: . SlotName: . ExtensionVersion: 2.5.0. SequenceNumber: 24.
[2021-07-22T08:53:02.214Z] Orechestrator_SaveCustomerSavings: Function 'SavingsOrchestrator (Orchestrator)' completed. ContinuedAsNew: False. IsReplay: False. Output: (null). State: Completed. HubName: TestHubName. AppName: . SlotName: . ExtensionVersion: 2.5.0. SequenceNumber: 25. TaskEventId: -1
[2021-07-22T08:53:02.214Z] Orechestrator_SaveCustomerSavings: Orchestration 'SavingsOrchestrator' awaited and scheduled 0 durable operation(s).
[2021-07-22T08:53:02.254Z] Orechestrator_SaveCustomerSavings: Appended 3 new events to the history table in 35ms
[2021-07-22T08:53:02.290Z] Orechestrator_SaveCustomerSavings: Updated Instances table and set the runtime status to 'Running'
[2021-07-22T08:53:02.292Z] Orechestrator_SaveCustomerSavings: Deleting [TaskCompleted#3] message from testhubname-control-00
 

Что я в основном делаю в своем коде, это следующее:

Я начинаю свой Orchestrator (как синглтон):

 await client.StartNewAsync<Task>("SavingsOrchestrator", _instanceId, null);
 

Моя функция оркестратора в основном выглядит так:

 [FunctionName(nameof(SavingsOrchestrator))]
public async Task SavingsOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context, ILogger logger)
{
    var a1 = await context.CallActivityAsync<List<MyModel>>("Activity1", null);
    if (a1?.Any() != true)
    {
        return;
    }

    // Run as 4 parallel tasks.
    var batchSize = a1.Count / 4   1;
    var tasks = new List<Task<int>>();
    foreach (var batch in a1.Batch(batchSize))
    {
        tasks.Add(context.CallActivityAsync<int>("Activity2", batch));
    }

    await Task.WhenAll(tasks);
    var total = tasks.Sum(x => x.Result);

    logger.LogInformation($"Done: {total}");
}
 

Почему моя надежная функция все еще находится в рабочем состоянии, даже после того, как она успешно запущена?

Обновить

В моем коде я делаю «Веер», используя a Task.WhenAll . Когда я удаляю этот код и просто вызываю Activity2 одну строку, передавая в нее все элементы вместо пакетов:

 // Pass all items to the Activity function
var total = await context.CallActivityAsync<int>("Activity2", a1);
 

Затем он обновляет RunningStatus до Completed .

Кажется, есть проблема с использованием Task.WhenAll . Но я получил эту идею непосредственно из <a rel=»noreferrer noopener nofollow» href=»https:///context.CallActivityAsync(«Activity2″, batch)/» rel=»nofollow noreferrer»>документации Microsoft

Комментарии:

1. Похоже, что выполнение функции оркестратора переходит в недетерминированное состояние. Читайте об этом здесь и из-за чего он переходит в бесконечное рабочее состояние.

Ответ №1:

Это может быть связано с тем, что в сообщениях очереди может содержаться больший объем данных или возвращаемые значения сериализуются, а очереди хранилища Azure поддерживают только сообщения объемом 64 КБ.

Триггер оркестратора

Для получения дополнительной информации обратитесь к Функции долговечности