#.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 КБ.
Для получения дополнительной информации обратитесь к Функции долговечности