Поделиться через


Масштабирование на основе целевого показателя

Масштабирование на основе целевого объекта обеспечивает быструю и интуитивно понятную модель масштабирования для клиентов и в настоящее время поддерживается для этих расширений привязки:

Масштабирование на основе цели заменяет предыдущую модель добавочного масштабирования Azure Functions по умолчанию для данных типов расширений. Инкрементальное масштабирование добавляет или удаляет максимум одного рабочего на каждый новый уровень частоты экземпляров, со сложными решениями о том, когда масштабировать. В отличие от этого, масштабирование на основе целевых объектов позволяет масштабировать четыре экземпляра одновременно, а решение масштабирования основано на простом целевом уравнении:

Иллюстрация уравнения: требуемые экземпляры = длина источника события / целевые выполнения на экземпляр.

В этом уравнении длина источника событий относится к числу событий, которые должны обрабатываться. Значения целевых выполнений на один экземпляр по умолчанию определяются пакетами SDK, используемыми расширениями Azure Functions. Для работы масштабирования на основе целевых целей не требуется вносить никаких изменений.

Рекомендации

При использовании масштабирования на основе целевого объекта применяются следующие рекомендации.

  • Масштабирование на основе целевого назначения по умолчанию включено для приложений-функций в плане потребления, плане потребления Flex и планах Elastic Premium. Масштабирование на основе событий не поддерживается в выделенных планах (Служба приложений).
  • Масштабирование на основе целевого объекта по умолчанию включено начиная с версии 4.19.0 среды выполнения Функций.
  • При использовании масштабирования на основе целевого объекта ограничения масштабирования по-прежнему учитываются. Дополнительные сведения см. в разделе "Ограничение масштабирования".
  • Чтобы добиться максимально точного масштабирования на основе метрик, используйте только одну целевую активируемую функцию для каждого приложения-функции. Кроме того, следует рассмотреть возможность работы в плане потребления Flex, который предлагает масштабирование для каждой функции.
  • Если несколько функций в одном приложении-функции запрашивают горизонтальное масштабирование одновременно, сумма между этими функциями используется для определения изменения в нужных экземплярах. Функции, запрашивающие увеличение масштаба, имеют преимущество над функциями, запрашивающими уменьшение масштаба.
  • При наличии запросов на уменьшение масштаба без запросов на увеличение масштаба используется максимальное значение уменьшения масштаба.

Отказ

Масштабирование, основанное на показателях, по умолчанию включено для функций-приложений, размещенных в плане потребления или в планах Premium. Чтобы отключить масштабирование на основе целевого объекта и вернуться к добавочному масштабированию, добавьте следующий параметр приложения в приложение-функцию:

Настройки приложения Значение
TARGET_BASED_SCALING_ENABLED 0

Настройка масштабирования на основе целевого показателя

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

В этой таблице суммированы значения host.json, используемые для значений выполнения на экземпляр, и значения по умолчанию:

Расширение значения host.json Значение по умолчанию
Центры событий (расширение версии 5.x+) extensions.eventHubs.maxEventBatchSize 100*
Центры событий (расширение версии 3.x+) extensions.eventHubs.eventProcessorOptions.maxBatchSize 10
Центры событий (если определено) extensions.eventHubs.targetUnprocessedEventThreshold Н/Д
служебная шина (расширение версии 5.x+, одна диспетчеризация) extensions.serviceBus.maxConcurrentCalls 16
служебная шина (расширение версии 5.x+, на основе отдельных сеансов отправки) extensions.serviceBus.maxConcurrentSessions 8
служебная шина (расширение версии 5.x+, пакетная обработка) extensions.serviceBus.maxMessageBatchSize (максимальный размер пакета сообщений) 1000
служебная шина (Функции версии 2.x+, одна отправка) параметры обработчика сообщений extensions.serviceBus.messageHandlerOptions.maxConcurrentCalls 16
служебная шина (Функции версии 2.x+, на основе отдельных сеансов отправки) extensions.serviceBus.sessionHandlerOptions.maxConcurrentSessions 2000
служебная шина (Функции версии 2.x+, пакетная обработка) extensions.serviceBus.batchOptions.maxMessageCount 1000
Очередь хранилища extensions.queues.batchSize 16

* Значение по умолчанию maxEventBatchSize изменилось в версии 6.0.0Microsoft.Azure.WebJobs.Extensions.EventHubs пакета. В более ранних версиях это значение равно 10.

Для некоторых расширений привязки конфигурация целевой частоты выполнения на экземпляр устанавливается с помощью атрибута функции:

Расширение Настройка триггера функции Значение по умолчанию
Apache Kafka lagThreshold 1000
Azure Cosmos DB maxItemsPerInvocation 100

Дополнительные сведения см. в примерах конфигураций поддерживаемых расширений.

План "Премиум" с включенным мониторингом масштабирования среды выполнения

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

Имя расширения Минимальная версия, необходимая
Apache Kafka 3.9.0
Azure Cosmos DB 4.1.0
Event Hubs 5.2.0
Cлужебная шина 5.9.0
Очередь хранилища 5.1.0

Поддержка динамического параллелизма

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

Поддерживаемые расширения

Способ настройки масштабирования на основе целевого объекта в файле host.json зависит от конкретного типа расширения. В этом разделе приведены сведения о конфигурации расширений, которые в настоящее время поддерживают масштабирование на основе целевого объекта.

Очереди и разделы служебной шины Azure

Расширение шины службы поддерживает три модели выполнения, определяемые атрибутами IsBatched и IsSessionsEnabled триггера шины службы. Значение по умолчанию для IsBatched и IsSessionsEnabled имеет значение false.

Модель выполнения IsBatched IsSessionsEnabled Настройка, применяемая для задания количества выполнений на один экземпляр
Одноразовая обработка отправки ложь ложь maxConcurrentCalls
Одиночная обработка диспетчеризации (на основе сеансов) ложь true максимальное количество одновременных сессий
Пакетная обработка true ложь maxMessageBatchSize или maxMessageCount

Примечание.

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

Одноразовая обработка отправки

В этой модели каждый вызов функции обрабатывает одно сообщение. Параметр maxConcurrentCalls управляет запланированным количеством выполнений на экземпляр. Конкретная настройка зависит от версии расширения Service Bus.

Измените host.json параметр maxConcurrentCalls, как показано в следующем примере:

{
    "version": "2.0",
    "extensions": {
        "serviceBus": {
            "maxConcurrentCalls": 16
        }
    }
}

Единая обработка диспетчера (на основе сеансов)

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

Измените параметрhost.json, чтобы задать целевые maxConcurrentSessions выполнения для каждого экземпляра, как показано в следующем примере:

{
    "version": "2.0",
    "extensions": {
        "serviceBus": {
            "maxConcurrentSessions": 8
        }
    }
}

Пакетная обработка

В этой модели каждый вызов функции обрабатывает пакет сообщений. Конкретный параметр зависит от версии расширения Служебной шины.

Измените host.json параметр maxMessageBatchSize, чтобы задать целевые выполнения на экземпляр, как показано в следующем примере:

{
    "version": "2.0",
    "extensions": {
        "serviceBus": {
            "maxMessageBatchSize": 1000
        }
    }
}

Event Hubs

Для Центров событий Azure масштабирование функций Azure происходит на основе количества необработанных событий, которые должны быть распределены по всем разделам в концентраторе событий в пределах списка допустимого количества экземпляров. По умолчанию атрибуты, используемые для целевых выполнений для каждого экземпляраhost.json, — это maxEventBatchSize и maxBatchSize. Однако если вы решили точно настроить масштабирование на основе целевых параметров, можно определить отдельный параметр targetUnprocessedEventThreshold, который позволяет задать целевое количество выполнений на экземпляр без изменения параметров пакетной обработки. Если targetUnprocessedEventThreshold задано, общее количество необработанных событий делится на это значение, чтобы определить количество экземпляров, которое затем округляется до числа рабочих экземпляров, создающих сбалансированное распределение секций.

Предупреждение

Установка batchCheckpointFrequency выше 1 для планов размещения, поддерживаемых масштабированием на основе целевых показателей, может привести к неправильному поведению масштабирования. Платформа вычисляет необработанные события как "текущая позиция — контрольная точка", которая может неправильно указывать на необработанные сообщения при обработке пакетов, но еще не контрольных точек, предотвращая надлежащее масштабирование при отсутствии сообщений.

Масштабирование поведения и стабильности

Для Event Hubs частое масштабирование внутрь и наружу может активировать перебалансировку разделов, что приводит к задержкам обработки и увеличению латентности. Чтобы устранить эту проблему, выполните указанные ниже действия.

  • Платформа использует предопределенный список допустимых количеств работников для принятия решений по масштабированию.
  • Платформа гарантирует, что масштабирование стабильно и намеренно, избегая нарушений назначений секций.
  • Если требуемое количество работников отсутствует в допустимом списке, например 17, система автоматически выбирает следующее наименьшее допустимое число, которое в данном случае равно 32. Кроме того, чтобы предотвратить быстрое повторное масштабирование, запросы масштабирования регулируются в течение 3 минут после последнего масштабирования. Эта задержка помогает сократить ненужные перебалансирование и способствует поддержанию эффективности пропускной способности.

Допустимое количество экземпляров для Event Hubs

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

Число разделов Допустимое количество экземпляров
1 [1]
2 [1, 2]
4 [1, 2, 4]
8 [1, 2, 3, 4, 8]
10 [1, 2, 3, 4, 5, 10]
16 [1, 2, 3, 4, 5, 6, 8, 16]
32 [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 16, 32]

Эти предопределенные количества помогают обеспечить равномерное распределение экземпляров между разделами с целью минимизации простоя и перегрузки рабочих.

Примечание.

Примечание: Для уровней концентратора событий Premium и Dedicated количество разделов может превышать 32, что позволяет использовать более крупные допустимые наборы экземпляров. Эти уровни поддерживают более высокую пропускную способность и масштабируемость, а допустимый список рабочих ролей расширяется соответствующим образом, чтобы равномерно распределять секции концентратора событий между экземплярами. Кроме того, так как центры событий являются партиционированной рабочей нагрузкой, количество партиций в центре событий является ограничением для максимального количества целевых случаев.

Параметры Центров событий

Конкретный параметр зависит от версии расширения Центров событий.

Измените host.json параметр maxEventBatchSize, чтобы задать целевые выполнения на экземпляр, как показано в следующем примере:

{
    "version": "2.0",
    "extensions": {
        "eventHubs": {
            "maxEventBatchSize" : 100
        }
    }
}

При определении в host.json используется targetUnprocessedEventThreshold в качестве целевых выполнений на один экземпляр вместо maxEventBatchSize, как показано в следующем примере:

{
    "version": "2.0",
    "extensions": {
        "eventHubs": {
            "targetUnprocessedEventThreshold": 153
        }
    }
}

Очереди хранилища

Для расширения хранилища версии 2.x+ измените host.json параметр batchSize , чтобы задать целевое количество выполнений на экземпляр:

{
    "version": "2.0",
    "extensions": {
        "queues": {
            "batchSize": 16
        }
    }
}

Примечание.

Эффективность масштабирования: Для расширения очереди хранилища сообщения с visibilityTimeout по-прежнему учитываются в длине источника событий API очереди хранилища. Это может привести к чрезмерному масштабированию приложения-функции. Рассмотрите возможность использования очередей служебной шины для запланированных сообщений, ограничения масштабирования или не использования видимости Timeout для вашего решения.

Azure Cosmos DB

Azure Cosmos DB использует атрибут уровня функции. MaxItemsPerInvocation Способ установки этого атрибута уровня функции зависит от языка функции.

Для скомпилированной функции C# задайте MaxItemsPerInvocation в определении триггера, как показано в следующих примерах для функции C# в процессе:

namespace CosmosDBSamplesV2
{
    public static class CosmosTrigger
    {
        [FunctionName("CosmosTrigger")]
        public static void Run([CosmosDBTrigger(
            databaseName: "ToDoItems",
            collectionName: "Items",
            MaxItemsPerInvocation: 100,
            ConnectionStringSetting = "CosmosDBConnection",
            LeaseCollectionName = "leases",
            CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> documents,
            ILogger log)
        {
            if (documents != null && documents.Count > 0)
            {
                log.LogInformation($"Documents modified: {documents.Count}");
                log.LogInformation($"First document Id: {documents[0].Id}");
            }
        }
    }
}

Примечание.

Так как Azure Cosmos DB является секционированной рабочей нагрузкой, количество физических секций в контейнере является ограничением для количества целевых экземпляров. Дополнительные сведения о масштабировании Azure Cosmos DB см. в разделах физические секции и владению арендой.

Apache Kafka

Расширение Apache Kafka использует атрибут LagThresholdуровня функции. Для Kafka количество требуемых экземпляров вычисляется на основе общей задержки потребителей, разделенной на параметр LagThreshold. Для заданной задержки снижение порогового значения задержки увеличивает количество требуемых экземпляров.

Способ установки этого атрибута уровня функции зависит от языка функции. В этом примере задано пороговое значение 100.

Для скомпилированной функции C# задайте LagThreshold в определении триггера, как показано в следующих примерах для функции C# в процессе для триггера Центров событий Kafka:

[FunctionName("KafkaTrigger")]
public static void Run(
    [KafkaTrigger("BrokerList",
                  "topic",
                  Username = "$ConnectionString",
                  Password = "%EventHubConnectionString%",
                  Protocol = BrokerProtocol.SaslSsl,
                  AuthenticationMode = BrokerAuthenticationMode.Plain,
                  ConsumerGroup = "$Default",
                  LagThreshold = 100)] KafkaEventData<string> kevent, ILogger log)
{            
    log.LogInformation($"C# Kafka trigger function processed a message: {kevent.Value}");
}

Следующие шаги

Дополнительные сведения см. в следующих разделах: