Выдвижной вентилятор с надежной функцией Azure В предложении - PullRequest
0 голосов
/ 17 октября 2019

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

Я испробовал оба паттерна цепочек функций и разветвления / разветвления. Цепочка функций занимает больше времени для обработки и определенно выбрасывает время ожидания, если обработка занимает более 5 минут, что может произойти. Разветвление / Разветвление, с другой стороны, обрабатывает контакты параллельно, но он может обрабатывать только 100 записей на экземпляр [не уверен в причине]. Я не уверен на 100% о влиянии масштабируемости.

//Function Chaining
var contacts = context.CallActivityAsync<List<Contacts>>("GetContacts", null);
await context.CallActivityAsync("ProcessContacts", contacts);

//Fan-out/Fan-in pattern
var contacts = context.CallActivityAsync<List<Contacts>>("GetContacts", null);
foreach(var contact in contacts){
    await context.CallActivityAsync("ProcessContact", contact);
}

Я, честно говоря, хочу пойти с Fan-Out / Fan-In, но опять же, я не уверен насчет воздействия.

Я просто хочу узнать мнение о том, какой шаблон выбрать.

1 Ответ

0 голосов
/ 17 октября 2019

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

Попробуйте изменить свой код разветвления на что-то вроде этого:

var tasks = new List<Task>();
foreach (var contact in contacts)
{
    tasks.Add(context.CallActivityAsync("ProcessContact", contact));
}
await Task.WhenAll(tasks);

Это создает 1 задание для каждого действия. связаться и поместить их в очередь для функции для обработки;затем он ожидает их завершения.

Как только вы увидите этот запуск, вы захотите посмотреть maxConcurrentActivityFunctions , в зависимости от того, насколько интенсивен процессор и т. д. ваша обработка может потребоваться только для обработки. скажем, 5 контактов параллельно в одном экземпляре.

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

Я рекомендую вам подключить это к Application Insightsэкземпляр, а затем посмотрите на Живые метрики, которые покажут вам такие вещи, как использование ЦП / памяти и количество создаваемых экземпляров.

Надеюсь, это поможет.

...