Это поведение совершенно нормально - именно так Durable Functions работает по своему замыслу.
У вас есть следующая оркестровка:
[FunctionName("OrchestratorFunc")]
public static async Task<string> TransformOrchestration([OrchestrationTrigger] DurableOrchestrationContext context, TraceWriter log)
{
var dataList = context.GetInput<List<OrchestrationModel>>();
var tasks = new List<Task>();
foreach (var data in dataList)
{
tasks.Add(context.CallActivityAsync<string>("TransformToSql", new TransformModel(data));
}
await Task.WhenAll(tasks);
}
Когда вызывается действие, поток возвращается кКонцепция под названием Диспетчер - это внутреннее существо Durable Functions, отвечающее за поддержание потока вашей оркестровки.Поскольку он ожидает, пока задача не будет завершена, оркестровка временно отменяется.Как только задача завершена, вся оркестровка воспроизводится до тех пор, пока не произойдет следующее await
.
Важная вещь, хотя при воспроизведении оркестрации, действие не вызывается еще раз - его результат выбирается изхранение и использование.Для большей ясности рассмотрим следующий пример:
[FunctionName("OrchestratorFunc")]
public static async Task<string> TransformOrchestration([OrchestrationTrigger] DurableOrchestrationContext context, TraceWriter log)
{
var dataList = context.GetInput<List<OrchestrationModel>>();
var tasks = new List<Task>();
foreach (var data in dataList)
{
await context.CallActivityAsync<string>("TransformToSql1", new TransformModel(data);
await context.CallActivityAsync<string>("TransformToSql2", new TransformModel(data);
}
}
Когда ожидается TransformToSql1
, оркестрация освобождается, и весь поток ожидает завершения этой операции.Затем оркестровка воспроизводится - она еще раз ожидает TransformToSql1
, но поскольку ее результат сохраняется, она просто возвращается к оркестровке и ожидает TransformToSql2
- затем процесс повторяется.