Dimensionamento baseado em destino

O dimensionamento baseado em destino fornece um modelo de dimensionamento rápido e intuitivo para os clientes e atualmente é suportado para as seguintes extensões:

O dimensionamento baseado em destino substitui o modelo de escalonamento incremental anterior do Azure Functions como o padrão para esses tipos de extensão. O dimensionamento incremental adicionou ou removeu um máximo de um trabalhador em cada nova taxa de instância, com decisões complexas sobre quando dimensionar. Por outro lado, o dimensionamento baseado no destino permite o aumento da escala de quatro instâncias de cada vez, e a decisão de dimensionamento é baseada em uma equação simples baseada no destino:

Illustration of the equation: desired instances = event source length / target executions per instance.

As execuções de destino padrão por valores de instância vêm dos SDKs usados pelas extensões do Azure Functions. Não é necessário fazer alterações para que o dimensionamento baseado em destino funcione.

Considerações

As seguintes considerações se aplicam ao usar o dimensionamento baseado em destino:

  • O dimensionamento baseado em destino está habilitado por padrão para aplicativos de função no plano de consumo ou para planos Premium, mas você pode desativar. O dimensionamento controlado por eventos não é suportado quando executado em planos Dedicados (Serviço de Aplicativo).
  • O Target Based Scaling é habilitado por padrão no tempo de execução do aplicativo de função 4.19.0 ou em uma versão posterior.
  • Ao usar o dimensionamento baseado em destino, a configuração do functionAppScaleLimit site ainda é respeitada. Para obter mais informações, consulte Limitar a expansão.
  • Para obter o dimensionamento mais preciso com base em métricas, use apenas uma função acionada baseada em destino por aplicativo de função.
  • Quando várias funções no mesmo aplicativo de função estão todas solicitando a expansão ao mesmo tempo, uma soma entre essas funções é usada para determinar a alteração nas instâncias desejadas. Funções que solicitam dimensionamento, substituem funções que solicitam dimensionamento.
  • Quando há solicitações de expansão sem nenhuma solicitação de expansão, a escala máxima no valor é usada.

Optar por não participar

O dimensionamento baseado em destino é habilitado por padrão para aplicativos de função hospedados em um plano de consumo ou em um plano Premium. Para desativar o dimensionamento baseado em destino e voltar ao dimensionamento incremental, adicione a seguinte configuração de aplicativo ao seu aplicativo de função:

Definição da Aplicação valor
TARGET_BASED_SCALING_ENABLED 0

Personalizando o dimensionamento baseado em destino

Você pode tornar o comportamento de dimensionamento mais ou menos agressivo com base na carga de trabalho do seu aplicativo ajustando as execuções de destino por instância. Cada extensão tem configurações diferentes que você pode usar para definir execuções de destino por instância.

Esta tabela resume os host.json valores usados para as execuções de destino por valores de instância e os padrões:

Extensão host.json valores Valor Predefinido
Hubs de Eventos (Extensão v5.x+) extensões.eventHubs.maxEventBatchSize 100*
Hubs de Eventos (Extensão v3.x+) extensões.eventHubs.eventProcessorOptions.maxBatchSize 10
Hubs de Eventos (se definidos) extensions.eventHubs.targetUnprocessedEventThreshold n/d
Service Bus (Extensão v5.x+, Despacho Único) extensions.serviceBus.maxConcurrentCalls 16
Service Bus (extensão v5.x+, baseada em sessões de despacho único) extensions.serviceBus.maxConcurrentSessions 8
Service Bus (extensão v5.x+, processamento em lote) extensions.serviceBus.maxMessageBatchSize 1000
Service Bus (Funções v2.x+, Despacho Único) extensions.serviceBus.messageHandlerOptions.maxConcurrentCalls 16
Service Bus (funções v2.x+, baseadas em sessões de despacho único) extensions.serviceBus.sessionHandlerOptions.maxConcurrentSessions 2000
Service Bus (Funções v2.x+, processamento em lote) extensions.serviceBus.batchOptions.maxMessageCount 1000
Fila de Armazenamento extensions.queues.batchSize 16

* O padrão maxEventBatchSize foi alterado na v6.0.0 do Microsoft.Azure.WebJobs.Extensions.EventHubs pacote. Nas versões anteriores, esse valor era 10.

Para algumas extensões de vinculação, as execuções de destino por instância são definidas usando um atributo de função:

Extensão Configuração do gatilho de função Valor Predefinido
Apache Kafka lagThreshold 1000
BD do Cosmos para o Azure maxItemsPerInvocation 100

Para saber mais, consulte os exemplos de configurações para as extensões suportadas.

Plano Premium com monitoramento de escala de tempo de execução habilitado

Quando o monitoramento da escala de tempo de execução está habilitado, as próprias extensões lidam com o dimensionamento dinâmico. Isso ocorre porque o controlador de escala não tem acesso a serviços protegidos por uma rede virtual. Depois de habilitar o monitoramento da escala de tempo de execução, você precisará atualizar seus pacotes de extensão para estas versões mínimas para desbloquear a funcionalidade extra de dimensionamento baseada em destino:

Nome da Extensão Versão mínima necessária
Apache Kafka 3.9.0
BD do Cosmos para o Azure 4.1.0
Event Hubs 5.2.0
Service Bus 5.9.0
Fila de Armazenamento 5.1.0

Suporte de simultaneidade dinâmica

O dimensionamento baseado em destino introduz um dimensionamento mais rápido e usa padrões para execuções de destino por instância. Ao usar o Service Bus, filas de armazenamento ou Kafka, você também pode habilitar a simultaneidade dinâmica. Nessa configuração, as execuções de destino por valor de instância são determinadas automaticamente pelo recurso de simultaneidade dinâmica. Começa com simultaneidade limitada e identifica a melhor configuração ao longo do tempo.

Extensões suportadas

A maneira como você configura o dimensionamento baseado em destino em seu arquivo host.json depende do tipo de extensão específico. Esta seção fornece os detalhes de configuração para as extensões que atualmente oferecem suporte ao dimensionamento baseado em destino.

Filas e tópicos do Barramento de Serviço

A extensão do Service Bus suporta três modelos de execução, determinados pelos atributos e IsSessionsEnabled do gatilho IsBatched do Service Bus. O valor padrão para IsBatched e IsSessionsEnabled é false.

Modelo de Execução IsBatched IsSessionsEnabled Configuração: Usado para execuções de destino por instância
Processamento de expedição única false false maxConcurrentCalls
Processamento de envio único (baseado em sessão) false verdadeiro maxConcurrentSessions
Processamento em lotes verdadeiro false maxMessageBatchSize ou maxMessageCount

Nota

Eficiência de escala: para a extensão do Service Bus, use Gerenciar direitos em recursos para obter o dimensionamento mais eficiente. Com os direitos de escuta, o dimensionamento reverte para a escala incremental porque o comprimento da fila ou do tópico não pode ser usado para informar decisões de dimensionamento. Para saber mais sobre como definir direitos nas políticas de acesso do Service Bus, consulte Política de autorização de acesso compartilhado.

Processamento de expedição única

Neste modelo, cada invocação da sua função processa uma única mensagem. A maxConcurrentCalls configuração rege as execuções de destino por instância. A configuração específica depende da versão da extensão do Service Bus.

Modifique a configuração maxConcurrentCalls, como no exemplo a host.json seguir:

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

Processamento de envio único (baseado em sessão)

Neste modelo, cada invocação da sua função processa uma única mensagem. No entanto, dependendo do número de sessões ativas para o tópico ou fila do Service Bus, cada instância aluga uma ou mais sessões. A configuração específica depende da versão da extensão do Service Bus.

Modifique a configuração maxConcurrentSessions para definir execuções de destino por instância, como no exemplo a host.json seguir:

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

Processamento em lotes

Neste modelo, cada invocação da sua função processa um lote de mensagens. A configuração específica depende da versão da extensão do Service Bus.

Modifique a configuração maxMessageBatchSize para definir execuções de destino por instância, como no exemplo a host.json seguir:

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

Event Hubs

Para Hubs de Eventos do Azure, o Azure Functions é dimensionado com base no número de eventos não processados distribuídos por todas as partições no hub de eventos. Por padrão, os host.json atributos usados para execuções de destino por instância são maxEventBatchSize e maxBatchSize. No entanto, se você optar por ajustar o dimensionamento baseado em destino, poderá definir um parâmetro targetUnprocessedEventThreshold separado que substituirá para definir execuções de destino por instância sem alterar as configurações de lote. Se targetUnprocessedEventThreshold for definido, a contagem total de eventos não processados será dividida por esse valor para determinar o número de instâncias, que será arredondado para uma contagem de instâncias de trabalho que cria uma distribuição de partição balanceada.

Nota

Como os Hubs de Eventos são uma carga de trabalho particionada, a contagem de instâncias de destino para Hubs de Eventos é limitada pelo número de partições no hub de eventos.

A configuração específica depende da versão da extensão Hubs de Eventos.

Modifique a configuração maxEventBatchSize para definir execuções de destino por instância, como no exemplo a host.json seguir:

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

Quando definido em host.json, é usado como execuções de destino por instância em vez de maxEventBatchSize, targetUnprocessedEventThreshold como no exemplo a seguir:

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

Filas de Armazenamento

Para v2.x+ da extensão Storage, modifique a host.json configuração batchSize para definir execuções de destino por instância:

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

Nota

Eficiência de escala: para a extensão da fila de armazenamento, as mensagens com visibilityTimeout ainda são contadas no comprimento da fonte do evento pelas APIs da fila de armazenamento. Isso pode causar o dimensionamento excessivo do seu aplicativo de função. Considere usar filas do Barramento de Serviço que mensagens agendadas, limitar a expansão ou não usar visibilityTimeout para sua solução.

BD do Cosmos para o Azure

O Azure Cosmos DB usa um atributo de nível de função, MaxItemsPerInvocation. A maneira como você define esse atributo de nível de função depende da linguagem da função.

Para uma função C# compilada, defina MaxItemsPerInvocation sua definição de gatilho, conforme mostrado nos exemplos a seguir para uma função C# em processo:

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}");
            }
        }
    }
}

Nota

Como o Azure Cosmos DB é uma carga de trabalho particionada, a contagem de instâncias de destino para o banco de dados é limitada pelo número de partições físicas em seu contêiner. Para saber mais sobre o dimensionamento do Azure Cosmos DB, consulte partições físicas e propriedade de locação.

Apache Kafka

A extensão Apache Kafka usa um atributo de nível de função, LagThreshold. Para Kafka, o número de instâncias desejadas é calculado com base no atraso total do consumidor dividido pela LagThreshold configuração. Para um determinado atraso, a redução do limite de atraso aumenta o número de instâncias desejadas.

A maneira como você define esse atributo de nível de função depende da linguagem da função. Este exemplo define o limite como 100.

Para uma função C# compilada, defina LagThreshold sua definição de gatilho, conforme mostrado nos exemplos a seguir para uma função C# em processo para um gatilho de Hubs de Eventos 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}");
}

Próximos passos

Para saber mais, leia os artigos seguintes: