Управление максимальной степенью параллелизма в шаблоне Fan-Out / Fan-In в Durable Functions - PullRequest
1 голос
/ 10 ноября 2019

Есть ли способ управления максимальной степенью параллелизма при реализации шаблона разветвления / разветвления в долговременных функциях Azure?

В настоящее время я внедряю этот шаблон для выполнения процесса загрузки данных, но я 'm превышение ограничений базы данных для DTU из-за того, что число операций слишком велико для обработки базой данных.

Решение, о котором я думаю, заключается в использовании следующих свойств:

  • maxConcurrentActivityFunctions
  • maxConcurrentOrchestratorFunctions

файла ( host.json ) в сочетании с:

Первые 2 свойства должны ограничивать количество параллельных выполнений функции для хоста, а WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT. Ограничивать число хостов 1027 * * 27 * хостов * 27 * хостов * 27 * хостов * 27 * хостов * 27 * хостов * 27 * хостов * 27 * хостов * 27 * хостов * 27 *.

Будет ли это правильным подходом для ограничения максимальной степени параллелизма?

1 Ответ

0 голосов
/ 11 ноября 2019

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

Это может не относиться к вашему случаю, но в интересах других читателей, которые находят этот вопрос, я добавил еще одну вещь для рассмотрения,Если у вас есть одна оркестровка, одна простая техника C #, которую вы можете использовать для ограничения максимального параллелизма, заключается в том, чтобы сделать что-то вроде этого:

static async Task FanOutFanInAsync(
    string functionName,
    object[] workItems,
    int maxParallelism)
{
    var inFlight = new HashSet<Task>();
    foreach (var item in workItems)
    {
        if (inFlight.Count > maxParallelism)
        {
            Task finished = await Task.WhenAny(inFlight);
            inFlight.Remove(finished);
        }

        inFlight.Add(ctx.CallActivityAsync(functionName, item));
    }

    await Task.WhenAll(inFlight);
}

Это позволит вам ограничить количество функций деятельности, которые вы разветвляете наодин раз для одного экземпляра оркестровки.

...