Параллелизм в функциях Azure: maxConcurrentRequests против FUNCTIONS_WORKER_PROCESS_COUNT

Как увидеть разницу между maxConcurrentRequests и FUNCTIONS_WORKER_PROCESS_COUNT с точки зрения параллелизма и ограничений для Функций Azure.

Некоторые определения можно найти на странице https://docs.microsoft.com/en-us/azure/azure-functions/functions-best-practices, которые я вставил ниже:

Используйте несколько рабочих процессов

По умолчанию любой экземпляр узла для функций использует один рабочий процесс. Чтобы повысить производительность, особенно с однопоточными средами выполнения, такими как Python, используйте FUNCTIONS_WORKER_PROCESS_COUNT, чтобы увеличить количество рабочих процессов на хост (до 10). Затем функции Azure пытаются равномерно распределить одновременные вызовы функций между этими рабочими.

FUNCTIONS_WORKER_PROCESS_COUNT применяется к каждому хосту, который Functions создает при масштабировании вашего приложения для удовлетворения спроса.

Настройте поведение хоста для лучшей обработки параллелизма

Файл host.json в приложении-функции позволяет настраивать среду выполнения хоста и поведение триггеров. В дополнение к пакетному поведению вы можете управлять параллелизмом для ряда триггеров. Часто настройка значений в этих параметрах может помочь каждому экземпляру масштабироваться в соответствии с требованиями вызываемых функций.

Настройки в файле host.json применяются ко всем функциям в приложении в пределах одного экземпляра функции. Например, если у вас есть приложение-функция с двумя функциями HTTP и запросами maxConcurrentRequests, установленными на 25, запрос к любому триггеру HTTP будет засчитываться в 25 общих одновременных запросов. Когда это приложение-функция масштабируется до 10 экземпляров, десять функций фактически разрешают 250 одновременных запросов (10 экземпляров * 25 одновременных запросов на экземпляр).

Другие параметры конфигурации хоста можно найти в статье о конфигурации host.json https://docs.microsoft.com/en-us/azure/azure-functions/functions-host-json.

{
    "extensions": {
        "http": {
            "routePrefix": "api",
            "maxOutstandingRequests": 200,
            "maxConcurrentRequests": 100,
            "dynamicThrottlesEnabled": true,
            "hsts": {
                "isEnabled": true,
                "maxAge": "10"
            },
            "customHeaders": {
                "X-Content-Type-Options": "nosniff"
            }
        }
    }
}

РЕДАКТИРОВАТЬ:

Это не связано с вопросом, но хорошо знать, что ›

Из https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=csharp#limits

Пределы

Длина HTTP-запроса ограничена 100 МБ (104 857 600 байтов), а длина URL ограничена 4 КБ (4096 байтами). Эти ограничения задаются элементом httpRuntime файла Web.config среды выполнения.

Если функция, использующая триггер HTTP, не завершится в течение 230 секунд, балансировщик нагрузки Azure истечет по тайм-ауту и ​​вернет ошибку HTTP 502. Функция продолжит работу, но не сможет вернуть ответ HTTP. Для долговременных функций мы рекомендуем следовать шаблонам асинхронности и возвращать местоположение, в котором вы можете проверить состояние запроса. Информацию о том, как долго может работать функция, см. В разделе Масштабирование и хостинг - план потребления.


person Jon Grey    schedule 04.02.2021    source источник
comment
В чем вопрос? Да maxConcurrentRequests и FUNCTIONS_WORKER_PROCESS_COUNT - разные вещи.   -  person Kashyap    schedule 06.02.2021
comment
Как увидеть эту разницу. Допустим, у меня есть приложение-функция с FUNCTIONS_WORKER_PROCESS_COUNT = 10 и maxConcurrentRequests = 100. Что тогда будет? Мое приложение примет до 100 запросов, но 90 будут поставлены в очередь, а 10 будут обработаны. Или это FUNCTIONS_WORKER_PROCESS_COUNT для количества асинхронных заданий, которые могут выполняться параллельно для одного запроса, равного 100.   -  person Jon Grey    schedule 07.02.2021
comment
Когда я пытался 30 раз запустить приложение-функцию, которое создает группу ресурсов и некоторые ресурсы, некоторые запросы были поставлены в очередь, и в конце концов не все группы ресурсов были созданы из-за 10-минутного тайм-аута.   -  person Jon Grey    schedule 07.02.2021
comment
В дополнение ко всем деталям в моем ответе ниже, в частности о тайм-ауте: не забывайте 230 секунд для HTTP-триггера   -  person Kashyap    schedule 12.02.2021


Ответы (2)


Как увидеть разницу между maxConcurrentRequests и FUNCTIONS_WORKER_PROCESS_COUNT с точки зрения параллелизма и ограничений для Функций Azure.

  • Оба параметра работают независимо.
  • Оба работают на уровне хоста. Не на функцию, не на приложение-функцию, а на хост.

Т.е. maxConcurrentRequests применяется при выполнении всех функций на хосте независимо от FUNCTIONS_WORKER_PROCESS_COUNT.

Несколько вещей на случай, если непонятно:

  • Если Azure решит, что ваше приложение необходимо масштабировать, и создаст новый хост, и скажет, что есть два хоста, тогда значения этих параметров применяются для каждого хоста, а не для хоста.
  • Если ваше приложение имеет несколько функций, то maxConcurrentRequests применяется ко всем функциям внутри этого хоста, а не к каждой функции.
  • Default and allowed value vary by plan/language-runtime:
    • maxConcurrentRequests: The default for a Consumption plan is 100. The default for a Dedicated plan is unbounded (-1).
    • FUNCTIONS_WORKER_PROCESS_COUNT: ... значение по умолчанию 1. Максимально допустимое значение - 10. ... Этот параметр применяется ко всем языкам, отличным от .NET.
person Kashyap    schedule 11.02.2021

Судя по описанию, кажется, что они похожи, но не совсем одинаковы. Вот еще один документ, описывающий функция FUNCTIONS_WORKER_PROCESS_COUNT в настройках приложения для справки.

введите описание изображения здесь

Если вы хотите узнать больше об этих двух свойствах, вы можете создать запрос в службу поддержки Azure на портале Azure, чтобы задать этот вопрос группе поддержки Azure. Они могут дать вам самое авторитетное объяснение.

person Hury Shen    schedule 05.02.2021
comment
two are similar - ›Нет. Один - увеличить параллелизм, другой - ограничить его. - person Kashyap; 06.02.2021