Используйте функцию SubOrchestratorFunction

#azure-durable-functions

Вопрос:

Я пытаюсь понять, как работает распараллеливание в долговременной функции. У меня есть надежная функция со следующим кодом (следуйте этому руководству: https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-sub-orchestrations?tabs=csharp#example)

         [FunctionName(nameof(OrchestratorFunction))]
        public async Task RunOrchestrator(
            [OrchestrationTrigger] IDurableOrchestrationContext context,
            ILogger log)
        {           
            var items = await context.CallActivityAsync<List<Item>>(nameof(GetItemFunction), null);
            if (items != null amp;amp; items .Count > 0)
            {
                var processingTasks = new List<Task>();
                foreach (var item in items)
                {
                    Task processTask = context.CallSubOrchestratorAsync(nameof(SubOrchestratorFunction), item);
                    processingTasks.Add(processTask);
                }
                await Task.WhenAll(processingTasks);               
            }
        }

        [FunctionName(nameof(SubOrchestratorFunction))]
        public async Task RunSubOrchestrator(
            [OrchestrationTrigger] IDurableOrchestrationContext context,
            ILogger log)
        {
            var item = context.GetInput<Item>();            
            var name = await context.CallActivityAsync<Item>(nameof(GetNameFunction), item);
            var age = await context.CallActivityAsync(nameof(GetAgeFunction), item);
            var address = await context.CallActivityAsync(nameof(GetAddressFunction), item);            
            var state = await context.CallActivityAsync(nameof(GetStateFunction), item);
            var country = await context.CallActivityAsync(nameof(GetCountryFunction), item);            
        }  
 

Что я хотел сделать, так это получить все элементы, и все элементы должны выполняться параллельно.

Выполняет ли этот код все элементы параллельно? Это означает, что время, затраченное на 10 предметов и 10000 предметов, будет одинаковым? При тестировании я вижу разницу во времени, затраченном на 10 предметов и 10000 предметов. Я что-то упускаю?

Ответ №1:

Существует множество факторов, влияющих на время выполнения надежных функций, которые, вероятно, значительно изменят время выполнения для очень больших рабочих нагрузок по сравнению с меньшими. Одним из таких случаев является время для масштабирования от 1 до 200 экземпляров.

Существует также тот факт, что функции активности основаны на триггерах очереди, которые, я думаю, ждут в течение 30 секунд, прежде чем снова масштабироваться, у каждого также есть время прогрева. (Может быть особенным для действий по сравнению с обычными очередями)

Я не знаю точной логики масштабирования, но он может не захотеть этого делать, если контрольная очередь не увеличивается. Вы можете через портал посмотреть, сколько у вас запущено экземпляров и потоков. Для ОЧЕНЬ больших задач он также может регулироваться очередью или таблицами, которые используются внутри.

Это также зависит от ваших зависимостей в вашей деятельности. Если вы совершаете вызовы API или отправляете электронные письма, то эти службы также должны быть способны обрабатывать 10000 одновременных запросов.

Существует также тот факт, что вы ограничены ядрами для каждого экземпляра. Скажем, 4. Что дает вам 800 ядер. Я думаю, что каждый запускает не более 10 потоков для действий, что означает, что он может пытаться обрабатывать только 8000 действий одновременно (может быть где-то от 800 до 8000 в зависимости от вычислительной работы).

Вот некоторые причины, которые я могу придумать, которые, возможно, ограничили бы более крупные процессы. Вероятно, есть больше информации о том, как все это работает. Некоторые вещи также можно настроить. Как распараллеливание сравнивается с последовательным выполнением всего?

Документы: https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-perf-and-scale

https://joonasw.net/view/how-azure-durable-functions-scale

https://github.com/Azure/azure-functions-durable-extension/issues/1686

https://github.com/Azure/azure-functions-durable-extension/issues/1686

Отнеситесь к моим догадкам о причинах с долей скептицизма. Я не знаю точных деталей и цифр внутренней работы, но даю некоторые идеи, которые можно расширить. В любом случае ожидать, что они закончат в одно и то же время, крайне неразумно. Важным моментом является то, что общее время выполнения значительно меньше, чем при отсутствии распараллеливания.

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

1. Спасибо! Что это значит, когда «Принудительное ограничение масштабирования» установлено в «Нет»?

2. Кроме того, что займет меньше времени — установить «ограничение на принудительное масштабирование» на Нет или установить 200 экземпляров?

3. Принудительное ограничение масштабирования-это просто переключатель, если вы хотите ограничить максимальное количество экземпляров. Если нет, он может масштабироваться от 0 до 200, если да, то он может масштабироваться от 0 до(опция максимального ограничения масштабирования). Если вам действительно нужно, чтобы он работал быстрее, чем за 10 минут, я бы предложил отладить количество экземпляров и то, как это меняется, а также найти узкие места в вашей деятельности.