Partilhar via


Ligações para funções duráveis (Azure Functions)

A extensão Durable Functions introduz três associações de disparador que controlam a execução de funções de orquestrador, entidade e atividade. Ele também introduz uma vinculação de saída que atua como um cliente para o runtime das Durable Functions.

Este artigo discute o uso dessas quatro associações e fornece exemplos de código. Ele também fornece informações sobre as propriedades de configuração de Funções Duráveis em host.json, o arquivo de metadados que contém configurações que afetam todas as funções em um aplicativo de função.

Certifique-se de selecionar sua linguagem de desenvolvimento Durable Functions na parte superior do artigo.

Ambas as versões do modelo de programação Python para Azure Functions são suportadas pelo Durable Functions. Como o Python v2 é a versão recomendada, os exemplos neste artigo apresentam exclusivamente essa versão.

Pré-requisitos

  • Durable Functions SDK, que é o pacote Python Package Index (PyPI) azure-functions-durable, versão 1.2.2 ou uma versão posterior
  • Pacote de extensão versão 4.x (ou uma versão posterior), que é definido no arquivo host.json do projeto

Você pode fornecer comentários e sugestões no repositório Durable Functions SDK for Python.

Gatilho de orquestração

Você pode usar o gatilho de orquestração para desenvolver funções duráveis do orquestrador. Esse gatilho é executado quando uma nova instância de orquestração é agendada e quando uma instância de orquestração existente recebe um evento. Exemplos de eventos que podem acionar funções do orquestrador incluem expirações duráveis do temporizador, respostas da função de atividade e eventos gerados por clientes externos.

Ao desenvolver funções no .NET, você usa o atributo OrchestrationTriggerAttribute .NET para configurar o gatilho de orquestração.

Use a anotação @DurableOrchestrationTrigger para configurar o gatilho de orquestração para Java.

Quando você usa a versão 4 do modelo de programação Node.js para desenvolver funções, você importa o app objeto do @azure/functions npm módulo. Em seguida, você chama o app.orchestration método da API de funções duráveis diretamente em seu código de função. Esse método registra sua função de orquestrador com a estrutura Durable Functions.

Ao escrever funções de orquestrador, você define o gatilho de orquestração usando o seguinte objeto JSON na bindings matriz do arquivo function.json :

{
    "name": "<name-of-input-parameter-in-function-signature>",
    "orchestration": "<optional-name-of-orchestration>",
    "type": "orchestrationTrigger",
    "direction": "in"
}

O valor orchestration representa o nome da orquestração que os clientes devem usar quando desejam iniciar novas instâncias da função orquestrador. Esta propriedade é opcional. Se você não especificá-lo, o nome da função será usado.

Quando você usa o modelo de programação Python v2, você pode definir um gatilho de orquestração usando o orchestration_trigger decorador diretamente em seu código de função Python.

No modelo v2, você acessa os triggers e bindings de Durable Functions a partir de uma instância de DFApp. Você pode usar essa subclasse de FunctionApp para exportar decoradores específicos para funções duráveis.

Internamente, essa vinculação de gatilho sonda o armazenamento durável configurado para novos eventos de orquestração. Exemplos de eventos incluem eventos de início de orquestração, eventos de expiração de temporizador durável, eventos de resposta de funções de atividade, e eventos externos criados por outras funções.

Comportamento do acionador

Aqui estão algumas notas sobre o gatilho de orquestração:

  • Single-threading: Um único thread do dispatcher é usado para toda a execução da função do orchestrator em uma única instância de host. Por esse motivo, é importante garantir que o código de função do orquestrador seja eficiente e não execute nenhuma operação de E/S. Também é importante garantir que esse thread não faça nenhum trabalho assíncrono, exceto quando estiver aguardando tipos de tarefas específicos para funções duráveis.
  • Tratamento de mensagens venenosas: não há suporte para mensagens venenosas em gatilhos de orquestração.
  • Visibilidade da mensagem: as mensagens de gatilho de orquestração são retiradas da fila e mantidas invisíveis por uma duração configurável. A visibilidade dessas mensagens é renovada automaticamente desde que a aplicação de função esteja em execução e a funcionar corretamente.
  • Valores de retorno: os valores de retorno são serializados para JSON e persistem na tabela de histórico de orquestração no Armazenamento de Tabela do Azure. Esses valores de retorno podem ser consultados pela associação do cliente de orquestração, descrita posteriormente.

Advertência

As funções do orquestrador nunca devem usar nenhuma ligação de entrada ou saída além da ligação do gatilho de orquestração. O uso de outras ligações pode causar problemas com a extensão Tarefa Durável, porque essas ligações podem não obedecer às regras de monothreading e de entrada/saída (E/S). Se você quiser usar outras associações, adicione-as a uma função de atividade chamada a partir da sua função de orquestrador. Para obter mais informações sobre restrições de codificação para funções do orchestrator, consulte Restrições de código de função do orchestrator.

Advertência

As funções do orquestrador nunca devem ser declaradas async.

Ativação do uso

A ligação do gatilho de orquestração suporta entradas e saídas. Aqui estão algumas notas sobre o tratamento de entrada e saída:

  • Entradas: Você pode invocar gatilhos de orquestração que tenham entradas. As entradas são acessadas através do objeto de entrada de contexto. Todas as entradas devem ser serializáveis em JSON.
  • Saídas: Os gatilhos de orquestração suportam valores de saída e entrada. O valor de retorno da função é usado para atribuir o valor de saída. O valor de retorno deve ser JSON-serializable.

Amostra de disparador

O código a seguir fornece um exemplo de uma função básica do orquestrador Hello World . Este exemplo de orquestrador não agenda nenhuma tarefa.

O atributo que você usa para definir o gatilho depende se você executa suas funções C# no mesmo processo que o processo de host Functions ou em um processo de trabalho isolado.

[FunctionName("HelloWorld")]
public static string RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
{
    string name = context.GetInput<string>();
    return $"Hello {name}!";
}

Observação

O código anterior é para Durable Functions 2.x. Para Durable Functions 1.x, você deve usar DurableOrchestrationContext em vez de IDurableOrchestrationContext. Para obter mais informações sobre as diferenças entre versões, consulte Visão geral das versões do Durable Functions.

const { app } = require('@azure/functions');
const df = require('durable-functions');

df.app.orchestration('helloOrchestrator', function* (context) {
    const name = context.df.getInput();
    return `Hello ${name}`;
});

Observação

A durable-functions biblioteca chama o método síncrono context.done quando a função do gerador é encerrada.

import azure.functions as func
import azure.durable_functions as df

myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)

@myApp.orchestration_trigger(context_name="context")
def my_orchestrator(context):
    result = yield context.call_activity("Hello", "Tokyo")
    return result
param($Context)

$InputData = $Context.Input
$InputData
@FunctionName("HelloWorldOrchestration")
public String helloWorldOrchestration(
        @DurableOrchestrationTrigger(name = "ctx") TaskOrchestrationContext ctx) {
    return String.format("Hello %s!", ctx.getInput(String.class));
}

A maioria das funções do orquestrador chama funções de atividade. O código a seguir fornece um exemplo Hello World que demonstra como chamar uma função de atividade:

[FunctionName("HelloWorld")]
public static async Task<string> RunOrchestrator(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    string name = context.GetInput<string>();
    string result = await context.CallActivityAsync<string>("SayHello", name);
    return result;
}

Observação

O código anterior é para Durable Functions 2.x. Para Durable Functions 1.x, você deve usar DurableOrchestrationContext em vez de IDurableOrchestrationContext. Para obter mais informações sobre as diferenças entre versões, consulte Visão geral das versões do Durable Functions.

const { app } = require('@azure/functions');
const df = require('durable-functions');

const activityName = 'hello';

df.app.orchestration('helloOrchestrator', function* (context) {
    const name = context.df.getInput();
    const result = yield context.df.callActivity(activityName, name);
    return result;
});
@FunctionName("HelloWorld")
public String helloWorldOrchestration(
        @DurableOrchestrationTrigger(name = "ctx") TaskOrchestrationContext ctx) {
    String input = ctx.getInput(String.class);
    String result = ctx.callActivity("SayHello", input, String.class).await();
    return result;
}

Desencadeador de atividade

Você pode usar o gatilho de atividade para desenvolver funções conhecidas como funções de atividade que são chamadas por funções de orquestração.

Use o atributo .NET ActivityTriggerAttribute para configurar o gatilho de atividade.

Você utiliza a anotação @DurableActivityTrigger para configurar o gatilho de atividade.

Para registrar sua função de atividade, importe o app objeto do @azure/functions npm módulo. Em seguida, você chama o app.activity método da API de funções duráveis diretamente em seu código de função.

Para definir o gatilho de atividade, use o seguinte objeto JSON na bindings matriz de function.json:

{
    "name": "<name-of-input-parameter-in-function-signature>",
    "activity": "<optional-name-of-activity>",
    "type": "activityTrigger",
    "direction": "in"
}

O activity valor é o nome da atividade. Esse valor é o nome que as funções do orquestrador usam para invocar essa função de atividade. Esta propriedade é opcional. Se você não especificá-lo, o nome da função será usado.

Você pode definir um gatilho de atividade usando o decorador activity_trigger diretamente em seu código de função Python.

Internamente, esta ligação de trigger interroga o armazenamento configurado como durável para novos eventos de execução de atividade.

Comportamento do acionador

Aqui estão algumas notas sobre o gatilho de atividade:

  • Encadeamento: Ao contrário do gatilho de orquestração, os gatilhos de atividade não têm restrições em operações de encadeamento ou E/S. Eles podem ser tratados como funções regulares.
  • Tratamento de mensagens suspeitas: não há suporte para mensagens suspeitas em gatilhos de atividade.
  • Visibilidade da mensagem: as mensagens de ativação de atividades são retiradas da fila e mantidas invisíveis por uma duração configurável. A visibilidade dessas mensagens é renovada automaticamente desde que a aplicação de função esteja em execução e a funcionar corretamente.
  • Valores de retorno: Os valores de retorno são serializados para JSON e persistem para o armazenamento durável configurado.

Ativação do uso

A vinculação do gatilho de atividade suporta entradas e saídas, assim como o gatilho de orquestração. Aqui estão algumas notas sobre o tratamento de entrada e saída:

  • Entradas: Os gatilhos de atividade podem ser invocados com entradas de uma função orquestradora. Todas as entradas devem ser serializáveis em JSON.
  • Saídas: As funções de atividade suportam valores de saída e entrada. O valor de retorno da função é usado para atribuir o valor de saída e deve ser serializável por JSON.
  • Metadados: as funções de atividade do .NET podem se vincular a um string instanceId parâmetro para obter a ID da instância da orquestração de chamada.

Amostra de disparador

O código a seguir fornece um exemplo de uma função de atividade Hello World básica.

[FunctionName("SayHello")]
public static string SayHello([ActivityTrigger] IDurableActivityContext helloContext)
{
    string name = helloContext.GetInput<string>();
    return $"Hello {name}!";
}

O tipo de parâmetro padrão para a associação .NET ActivityTriggerAttribute é IDurableActivityContext (ou DurableActivityContext para Durable Functions 1.x). No entanto, os gatilhos de atividade do .NET também oferecem suporte à vinculação direta a tipos serializáveis por JSON (incluindo tipos primitivos), portanto, você também pode usar a seguinte versão simplificada da função:

[FunctionName("SayHello")]
public static string SayHello([ActivityTrigger] string name)
{
    return $"Hello {name}!";
}
const { app } = require('@azure/functions');
const df = require('durable-functions');
const activityName = 'hello';
df.app.activity(activityName, {
    handler: (input) => {
        return `Hello, ${input}`;
    },
});
import azure.functions as func
import azure.durable_functions as df

myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)

@myApp.activity_trigger(input_name="myInput")
def my_activity(myInput: str):
    return "Hello " + myInput
param($name)

"Hello $name!"
@FunctionName("SayHello")
public String sayHello(@DurableActivityTrigger(name = "name") String name) {
    return String.format("Hello %s!", name);
}

Usar ligações de entrada e saída

Além da vinculação de gatilho de atividade, você também pode usar ligações regulares de entrada e saída.

Por exemplo, uma função de atividade pode receber entrada de uma função de orquestração. A função activity pode enviar essa entrada como uma mensagem para os Hubs de Eventos do Azure.

const { app } = require('@azure/functions');
const df = require('durable-functions');

df.app.orchestration('helloOrchestrator', function* (context) {
    const input = context.df.getInput();
    yield context.df.callActivity('sendToEventHub', input);
    return `Message sent: ${input}`;
});

const { EventHubProducerClient } = require("@azure/event-hubs");
const connectionString = process.env.EVENT_HUB_CONNECTION_STRING;
const eventHubName = process.env.EVENT_HUB_NAME;

df.app.activity("sendToEventHub", {
    handler: async (message, context) => {
        const producer = new EventHubProducerClient(connectionString, eventHubName);
        try {
            const batch = await producer.createBatch();
            batch.tryAdd({ body: message });
            await producer.sendBatch(batch);
            context.log(`Message sent to Event Hubs: ${message}`);
        } catch (err) {
            context.log.error("Failed to send message to Event Hubs:", err);
            throw err;
        } finally {
            await producer.close();
        }
    },
});

app.storageQueue('helloQueueStart', {
    queueName: 'start-orchestration',
    extraInputs: [df.input.durableClient()],
    handler: async (message, context) => {
        const client = df.getClient(context);
        const orchestratorName = message.orchestratorName || 'helloOrchestrator';
        const input = message.input || null;
        const instanceId = await client.startNew(orchestratorName, { input });
        context.log(`Started orchestration with ID = '${instanceId}'`);
    },
});

Cliente de orquestração

Você pode usar a vinculação do cliente de orquestração para escrever funções que interagem com as funções do orquestrador. Estas funções são muitas vezes referidas como funções de cliente. Por exemplo, você pode agir em instâncias de orquestração das seguintes maneiras:

  • Inicie-os.
  • Consulte o seu estado.
  • Termine-os.
  • Envie eventos para eles enquanto eles estão em execução.
  • Purgue o histórico da instância.

Você pode vincular a um cliente de orquestração usando o atributo DurableClientAttribute (OrchestrationClientAttribute em Durable Functions 1.x).

Você pode vincular a um cliente de orquestração usando a @DurableClientInput anotação.

Para registrar sua função de cliente, importe o app objeto do @azure/functions npm módulo. Em seguida, você chama um método de API de funções duráveis que é específico para o seu tipo de gatilho. Por exemplo, para um gatilho HTTP, você chama o app.http método. Para um gatilho de fila, você chama o app.storageQueue método.

Para definir o gatilho durável do cliente, use o objeto JSON seguinte na matriz bindings de function.json:

{
    "name": "<name-of-input-parameter-in-function-signature>",
    "taskHub": "<optional-name-of-task-hub>",
    "connectionName": "<optional-name-of-connection-string-app-setting>",
    "type": "orchestrationClient",
    "direction": "in"
}
  • A taskHub propriedade é usada quando vários aplicativos de função compartilham a mesma conta de armazenamento, mas precisam ser isolados uns dos outros. Se você não especificar essa propriedade, o valor padrão de host.json será usado. Esse valor deve corresponder ao valor que as funções do orquestrador de destino usam.
  • O connectionName valor é o nome de uma configuração de aplicativo que contém uma cadeia de conexão de conta de armazenamento. A conta de armazenamento representada por essa cadeia de conexão deve ser a mesma que as funções do orquestrador de destino usam. Se você não especificar essa propriedade, a cadeia de conexão de conta de armazenamento padrão para o aplicativo de função será usada.

Observação

Na maioria dos casos, recomendamos que você omita essas propriedades e confie no comportamento padrão.

Você pode definir um gatilho de cliente durável usando o decorador durable_client_input diretamente no seu código de função Python.

Utilização do cliente

Você normalmente se associa a uma implementação de IDurableClient (DurableOrchestrationClient in Durable Functions 1.x), que lhe dá acesso total a todas as APIs de cliente de orquestração suportadas pelo Durable Functions.

Normalmente, você se liga à classe DurableClientContext.

Você deve usar o SDK específico do idioma para obter acesso a um objeto cliente.

O código a seguir fornece um exemplo de uma função acionada por fila que inicia uma orquestração Hello World .

[FunctionName("QueueStart")]
public static Task Run(
    [QueueTrigger("durable-function-trigger")] string input,
    [DurableClient] IDurableOrchestrationClient starter)
{
    // Orchestration input comes from the queue message content.
    return starter.StartNewAsync<string>("HelloWorld", input);
}

Observação

O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, você deve usar o OrchestrationClient atributo em vez do DurableClient atributo e deve usar o DurableOrchestrationClient tipo de parâmetro em vez de IDurableOrchestrationClient. Para obter mais informações sobre as diferenças entre versões, consulte Visão geral das versões do Durable Functions.

const { app } = require('@azure/functions');
const df = require('durable-functions');

app.storageQueue('helloQueueStart', {
    queueName: 'start-orchestration',
    extraInputs: [df.input.durableClient()],
    handler: async (message, context) => {
        const client = df.getClient(context);
        const orchestratorName = message.orchestratorName || 'helloOrchestrator';
        const input = message.input || null;
        const instanceId = await client.startNew(orchestratorName, { input });
        context.log(`Started orchestration with ID = '${instanceId}' from queue message.`);
    },
});
import azure.functions as func
import azure.durable_functions as df

myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)

@myApp.queue_trigger(
    arg_name="msg",
    queue_name="start-orchestration",
    connection="AzureWebJobsStorage"
)
@myApp.durable_client_input(client_name="client")
async def client_function(msg: func.QueueMessage, client: df.DurableOrchestrationClient):
    input_data = msg.get_body().decode("utf-8")
    await client.start_new("my_orchestrator", None, input_data)
    return None

function.json

{
  "bindings": [
    {
      "name": "InputData",
      "type": "queueTrigger",
      "queueName": "durable-function-trigger",
      "direction": "in"
    },
    {
      "name": "starter",
      "type": "durableClient",
      "direction": "in"
    }
  ]
}

run.ps1

param([string]$InputData, $TriggerMetadata)

$InstanceId = Start-DurableOrchestration -FunctionName 'HelloWorld' -Input $InputData
@FunctionName("QueueStart")
public void queueStart(
        @QueueTrigger(name = "input", queueName = "durable-function-trigger", connection = "Storage") String input,
        @DurableClientInput(name = "durableContext") DurableClientContext durableContext) {
    // Orchestration input comes from the queue message content.
    durableContext.getClient().scheduleNewOrchestrationInstance("HelloWorld", input);
}

Para obter informações detalhadas sobre como iniciar instâncias, consulte Gerenciar instâncias em funções duráveis no Azure.

Gatilho da entidade

Você pode usar o gatilho de entidade para desenvolver uma função de entidade. Esse gatilho oferece suporte ao processamento de eventos para uma instância de entidade específica.

Observação

Os gatilhos de entidade estão disponíveis a partir do Durable Functions 2.x.

Internamente, esta associação de trigger verifica o armazenamento durável configurado para novas operações de entidade que devem ser executadas.

Use o atributo EntityTriggerAttribute do .NET para configurar o ativador de entidade.

Para registrar o gatilho de entidade, importe o objeto app do módulo @azure/functions npm. Em seguida, você chama o app.entity método da API de funções duráveis diretamente em seu código de função.

const df = require('durable-functions');
df.app.entity('counter', (context) => {
    const currentValue = context.df.getState(() => 0);
    switch (context.df.operationName) {
        case 'add':
            context.df.setState(currentValue + context.df.getInput());
            break;
        case 'reset':
            context.df.setState(0);
            break;
        case 'get':
            context.df.return(currentValue);
            break;
    }
});

Observação

Os gatilhos de entidade ainda não são suportados para Java.

Observação

Ainda não há suporte para gatilhos de entidade para o PowerShell.

Você pode definir um gatilho de entidade usando o decorador entity_trigger diretamente em seu código de função Python.

Comportamento do acionador

Aqui estão algumas notas sobre o gatilho da entidade:

  • Single-threading: Um único thread de dispatcher é usado para processar operações para uma entidade específica. Se várias mensagens forem enviadas para uma única entidade simultaneamente, as operações serão processadas uma de cada vez.
  • Tratamento de mensagens venenosas: não há suporte para mensagens venenosas em gatilhos de entidade.
  • Visibilidade da mensagem: As mensagens de ativação das entidades são retiradas da fila e mantidas invisíveis por uma duração configurável. A visibilidade dessas mensagens é renovada automaticamente desde que a aplicação de função esteja em execução e a funcionar corretamente.
  • Valores de retorno: as funções de entidade não suportam valores de retorno. Há APIs específicas que você pode usar para salvar o estado ou passar valores de volta para orquestrações.

Quaisquer alterações de estado feitas em uma entidade durante sua execução são automaticamente persistidas após a conclusão da execução.

Para obter mais informações e exemplos de definição e interação com gatilhos de entidade, consulte Funções de entidade.

Cliente da Entidade

Você pode usar a associação de cliente de entidade para acionar funções de entidade de forma assíncrona. Estas funções são por vezes referidas como funções de cliente.

Você pode vincular à entidade cliente usando o atributo DurableClientAttribute .NET em funções de biblioteca de classes .NET.

Observação

Você também pode usar o [DurableClientAttribute] para vincular ao cliente de orquestração.

Em vez de registar um cliente de entidade, utiliza signalEntity ou callEntity para chamar um método de gatilho de entidade a partir de qualquer função registada.

  • A partir de uma função acionada por fila, você pode usar client.signalEntity:

    const { app } = require('@azure/functions');
    const df = require('durable-functions');
    app.storageQueue('helloQueueStart', {
        queueName: 'start-orchestration',
        extraInputs: [df.input.durableClient()],
        handler: async (message, context) => {
            const client = df.getClient(context);
            const entityId = new df.EntityId('counter', 'myCounter');
            await client.signalEntity(entityId, 'add', 5);
        },
    });
    
  • A partir de uma função de orquestração, podes utilizar context.df.callEntity:

    const { app } = require('@azure/functions');
    const df = require('durable-functions');
    df.app.orchestration('entityCaller', function* (context) {
        const entityId = new df.EntityId('counter', 'myCounter');
        yield context.df.callEntity(entityId, 'add', 5);
        yield context.df.callEntity(entityId, 'add', 5);
        const result = yield context.df.callEntity(entityId, 'get');
        return result;
    });
    

Você pode definir um cliente de entidade usando o durable_client_input decorador diretamente em seu código de função Python.

Observação

As entidades cliente ainda não são suportadas para Java.

Observação

Os clientes de entidade ainda não têm suporte para o PowerShell.

Para obter mais informações e exemplos de interação com entidades como um cliente, consulte Entidades de acesso.

Configurações de funções duráveis no host.json

Esta seção fornece informações sobre as propriedades de configuração do Durable Functions no host.json. Para obter informações sobre configurações gerais no host.json, consulte host.json referência para o Azure Functions 1.x ou host.json referência para o Azure Functions 2.x e posterior.

Definições de configuração para Funções Duráveis.

Observação

Todas as versões principais do Durable Functions são suportadas em todas as versões do tempo de execução do Azure Functions. No entanto, o esquema da configuração do host.json difere ligeiramente dependendo da versão do tempo de execução do Azure Functions e da versão da extensão Durable Functions que você usa.

O código a seguir fornece dois exemplos de durableTask configurações em host.json: uma para Durable Functions 2.x e outra para Durable Functions 1.x. Você pode usar ambos os exemplos com o Azure Functions 2.0 e 3.0. Com o Azure Functions 1.0, as configurações disponíveis são as mesmas, mas a durableTask seção de host.json está localizada na raiz da configuração do host.json , em vez de ser um campo em extensions.

{
 "extensions": {
  "durableTask": {
    "hubName": "MyTaskHub",
    "defaultVersion": "1.0",
    "versionMatchStrategy": "CurrentOrOlder",
    "versionFailureStrategy": "Reject",
    "storageProvider": {
      "connectionStringName": "AzureWebJobsStorage",
      "controlQueueBatchSize": 32,
      "controlQueueBufferThreshold": 256,
      "controlQueueVisibilityTimeout": "00:05:00",
      "FetchLargeMessagesAutomatically": true,
      "maxQueuePollingInterval": "00:00:30",
      "partitionCount": 4,
      "trackingStoreConnectionStringName": "TrackingStorage",
      "trackingStoreNamePrefix": "DurableTask",
      "useLegacyPartitionManagement": false,
      "useTablePartitionManagement": true,
      "workItemQueueVisibilityTimeout": "00:05:00",
      "QueueClientMessageEncoding": "UTF8"
    },
    "tracing": {
      "traceInputsAndOutputs": false,
      "traceReplayEvents": false,
    },
    "httpSettings":{
      "defaultAsyncRequestSleepTimeMilliseconds": 30000,
      "useForwardedHost": false,
    },
    "notifications": {
      "eventGrid": {
        "topicEndpoint": "https://topic_name.westus2-1.eventgrid.azure.net/api/events",
        "keySettingName": "EventGridKey",
        "publishRetryCount": 3,
        "publishRetryInterval": "00:00:30",
        "publishEventTypes": [
          "Started",
          "Completed",
          "Failed",
          "Terminated"
        ]
      }
    },
    "maxConcurrentActivityFunctions": 10,
    "maxConcurrentOrchestratorFunctions": 10,
    "maxConcurrentEntityFunctions": 10,
    "extendedSessionsEnabled": false,
    "extendedSessionIdleTimeoutInSeconds": 30,
    "useAppLease": true,
    "useGracefulShutdown": false,
    "maxEntityOperationBatchSize": 50,
    "maxOrchestrationActions": 100000,
    "storeInputsInOrchestrationHistory": false
  }
 }
}
Propriedade Valor predefinido Descrição
Nome do Hub TestHubName (DurableFunctionsHub em v1.x) O nome do hub que armazena o estado atual de um aplicativo de função. Os nomes do hub de tarefas devem começar com uma letra e consistir apenas em letras e números. Se você não especificar um nome, o valor padrão será usado. Nomes alternativos de hub de tarefas podem ser usados para isolar vários aplicativos de Funções Duráveis uns dos outros, mesmo que eles usem o mesmo back-end de armazenamento. Para obter mais informações, consulte Hubs de tarefas.
defaultVersion A versão padrão a ser atribuída a novas instâncias de orquestração. Quando você especifica uma versão, novas instâncias de orquestração são permanentemente associadas a esse valor de versão. Essa configuração é usada pelo recurso de controle de versão de orquestração para habilitar cenários como implantações sem interrupção com alterações disruptivas. Você pode usar qualquer valor de cadeia de caracteres para a versão.
versãoMatchStrategy AtualOuMaisAntigo Um valor que especifica como as versões de orquestração são associadas quando as funções do orquestrador são carregadas. Os valores válidos são None, Stricte CurrentOrOlder. Para obter explicações detalhadas, consulte Versões da orquestração.
EstratégiaDeFalhaDaVersão Rejeitar Um valor que especifica o que acontece quando uma versão de orquestração não corresponde ao valor atual defaultVersion . Os valores válidos são Reject e Fail. Para obter explicações detalhadas, consulte Versões da orquestração.
controlQueueBatchSize 32 O número de mensagens a serem retiradas da fila de controle de cada vez.
controlQueueBufferThreshold Plano de consumo para Python: 32
Plano de consumo para outras línguas: 128
Plano Dedicado ou Premium: 256
O número de mensagens da fila de controle que podem ser armazenadas em buffer na memória simultaneamente. Quando o número especificado é atingido, o dispatcher aguarda antes de dequeuar quaisquer outras mensagens. Em algumas situações, reduzir esse valor pode reduzir significativamente o consumo de memória.
númeroDePartições 4 A contagem de partições para a fila de controle. Este valor deve ser um número inteiro positivo entre 1 e 16. A alteração desse valor requer a configuração de um novo hub de tarefas.
controloDoTempoDeVisibilidadeNaFila 00:05:00 O tempo limite de visibilidade das mensagens da fila de controle desfilada no formato hh:mm:ss .
tempoLimiteVisibilidadeFilaItemDeTrabalho 00:05:00 O tempo de visibilidade das mensagens da fila de itens de trabalho no formato hh:mm:ss.
BuscarMensagensGrandesAutomaticamente verdadeiro Um valor que especifica se as mensagens grandes devem ser recuperadas em consultas de status de orquestração. Quando essa configuração é true, mensagens grandes que excedem o limite de tamanho da fila são recuperadas. Quando essa configuração é false, uma URL de blob que aponta para cada mensagem grande é recuperada.
maxConcurrentActivityFunctions Plano de consumo: 10
Plano Dedicado ou Premium: 10 vezes o número de processadores na máquina atual
O número máximo de funções de atividade que podem ser processadas simultaneamente em uma única instância de host.
maxConcurrentOrchestratorFunctions Plano de consumo: 5
Plano Dedicado ou Premium: 10 vezes o número de processadores na máquina atual
O número máximo de funções do orchestrator que podem ser processadas simultaneamente em uma única instância de host.
Funções de Entidade Concorrente Máximas Plano de consumo: 5
Plano Dedicado ou Premium: 10 vezes o número de processadores na máquina atual
O número máximo de funções de entidade que podem ser processadas simultaneamente em uma única instância de host. Essa configuração é aplicável somente quando você usa o agendador de tarefas durável. Caso contrário, o número máximo de execuções simultâneas de entidade é limitado pelo valor maxConcurrentOrchestratorFunctions.
IntervaloMáximoDeInterrogaçãoDaFila 00:00:30 O intervalo máximo de controle e de sondagem da fila de itens de trabalho no formato hh:mm:ss. Valores mais altos podem resultar em latências de processamento de mensagens mais altas. Valores mais baixos podem resultar em custos de armazenamento mais altos devido ao aumento das transações de armazenamento.
maxOrchestrationActions 100,000 O número máximo de ações que uma função orquestradora pode executar durante um único ciclo de execução.
nomeDeConexão (v2.7.0 e posterior)
connectionStringName (v2.x)
azureStorageConnectionStringName (v1.x)
AzureWebJobsStorage O nome de uma configuração de aplicativo ou coleção de configurações que especifica como se conectar aos recursos subjacentes do Armazenamento do Azure. Quando você fornece uma única configuração de aplicativo, ela deve ser uma cadeia de conexão do Armazenamento do Azure.
trackingStoreConnectionName (v2.7.0 e posterior)
trackingStoreConnectionStringName
O nome de uma configuração de aplicativo ou coleção de configurações que especifica como se conectar às tabelas Histórico e Instâncias, que armazenam o histórico de execução e metadados sobre instâncias de orquestração. Quando você fornece uma única configuração de aplicativo, ela deve ser uma cadeia de conexão do Armazenamento do Azure. Se não especificar uma definição, a conexão connectionStringName (v2.x) ou azureStorageConnectionStringName (v1.x) será utilizada.
trackingStoreNamePrefix O prefixo a ser usado para as tabelas History e Instances quando trackingStoreConnectionStringName for especificado. Se você não especificar um prefixo, o valor padrão de DurableTask será usado. Se trackingStoreConnectionStringName não for especificado, as tabelas Histórico e Instâncias usarão o valor como prefixo hubName e a trackingStoreNamePrefix configuração será ignorada.
traceInputsAndOutputs falso Um valor que indica se as entradas e saídas de chamadas de função devem ser rastreadas. Quando os eventos de execução de função são rastreados, o comportamento padrão é incluir o número de bytes nas entradas e saídas serializadas para chamadas de função. Esse comportamento fornece informações mínimas sobre as entradas e saídas para que ele não inche os logs ou exponha inadvertidamente informações confidenciais. Quando essa propriedade é true, todo o conteúdo de entradas e saídas de função são registrados.
traceReplayEvents falso Um valor que indica se os eventos de repetição de orquestração devem ser gravados no Application Insights.
logReplayEvents falso Um valor que indica se as execuções repetidas devem ser registradas em logs de aplicativos.
eventGridTopicEndpoint O URL de um ponto de extremidade de um tópico personalizado do Azure Event Grid. Quando esta propriedade é definida, os eventos de notificação do ciclo de vida da orquestração são publicados neste endpoint. Esta propriedade suporta a resolução de configurações do aplicativo.
nomeDefinicaoChaveEventoGrid O nome da definição da aplicação que contém a chave usada para autenticar com o tópico personalizado da Grelha de Eventos na URL EventGridTopicEndpoint.
ContagemDeTentativasDePublicaçãoEventGrid (eventGridPublishRetryCount) 0 O número de vezes para repetir a tentativa se a publicação no tópico Event Grid falhar.
IntervaloDeReintentoDePublicaçãoDoEventGrid 00:05:00 O intervalo de publicação-repetição da Grade de Eventos no formato hh:mm:ss .
eventGridPublishEventTypes Uma lista de tipos de eventos a serem publicados na Grade de Eventos. Se você não especificar nenhum tipo, todos os tipos de evento serão publicados. Os valores permitidos incluem Started, Completed, Failed, e Terminated.
extendedSessionsEnabled (sessõesProlongadasAtivadas) falso Um valor que especifica se o orquestrador de sessão e as sessões de função de entidade são armazenadas em cache.
tempoLimiteExtensoDeSessaoInativaEmSegundos 30 O número de segundos que um orquestrador ocioso ou função de entidade permanece na memória antes de ser descarregado. Essa configuração só é usada quando a extendedSessionsEnabled configuração é true.
useAppLease verdadeiro Um valor que indica se as aplicações devem adquirir uma concessão de blob ao nível da aplicação antes de processar mensagens do hub de tarefas. Para obter mais informações, consulte Recuperação de desastres e distribuição geográfica em funções duráveis. Esta definição está disponível a partir da v2.3.0.
usarGestãoDePartiçãoLegada falso Um valor que especifica o tipo de algoritmo de gerenciamento de partição a ser usado. Quando esta configuração é false, é utilizado um algoritmo que reduz a possibilidade de execução duplicada de funções ao expandir a escala. Esta definição está disponível a partir da v2.3.0. Definir esse valor como true não é recomendado.
usarGestãoDePartiçõesDeTabela Na v3.x: true
Na v2.x: false
Um valor que especifica o tipo de algoritmo de gerenciamento de partição a ser usado. Quando essa configuração é true, é usado um algoritmo projetado para reduzir custos para contas do Armazenamento do Azure v2. Essa configuração está disponível a partir de WebJobs.Extensions.DurableTask v2.10.0. Usar essa configuração com uma identidade gerenciada requer WebJobs.Extensions.DurableTask v3.x ou posterior, ou Worker.Extensions.DurableTask v1.2.x ou posterior.
useGracefulShutdown falso (Pré-visualização) Um valor que indica se deve ser desligado normalmente para reduzir a chance de desligamentos de host causarem falhas nas execuções de funções em processo.
TamanhoMáximoLoteOperaçãoEntidade Plano de consumo: 50
Plano Dedicado ou Premium: 5.000
O número máximo de operações de entidade que são processadas como um lote. Se esse valor for 1, o envio em lote será desabilitado e uma invocação de função separada processará cada mensagem de operação. Esta definição está disponível a partir da v2.6.1.
armazenarEntradasNaHistóriaDeOrquestração falso Um valor que especifica como armazenar entradas. Quando esta configuração é true, o Durable Task Framework salva as entradas de atividade na tabela de Histórico, e as entradas das funções de atividade aparecem nos resultados da consulta do histórico da orquestração.
tamanhoMáximoDeMensagemGrpcEmBytes 4,194,304 Um valor inteiro que define o tamanho máximo, em bytes, das mensagens que o cliente gRPC (Chamada de Procedimento Remoto) genérico pode receber. A implementação de DurableTaskClient usa o cliente gRPC para gerir instâncias de orquestração. Esta configuração aplica-se ao .NET isolated worker de Durable Functions e a aplicativos Java.
grpcHttpClientTimeout 00:01:40 O tempo limite no formato hh:mm:ss para o cliente HTTP usado pelo cliente gRPC nas Durable Functions. Atualmente, o cliente é suportado para aplicativos de trabalho isolados do .NET (.NET 6 e versões posteriores) e para aplicativos Java.
QueueClientMessageEncoding UTF8 A estratégia de codificação para mensagens do Armazenamento de Filas do Azure. As estratégias válidas são Unicode Transformation Format–8-bit (UTF8) e Base64. Essa configuração se aplica quando você usa Microsoft.Azure.WebJobs.Extensions.DurableTask 3.4.0 ou posterior, ou Microsoft.Azure.Functions.Worker.Extensions.DurableTask 1.7.0 ou posterior.
defaultAsyncRequestSleepTimeMilliseconds 30000 O intervalo de sondagem predefinido, em milissegundos, para APIs HTTP assíncronas. Quando um cliente consulta o estado de uma orquestração de longa duração usando o endpoint de consulta de estado HTTP, este valor determina quanto tempo o cliente deve esperar antes de voltar a sondar.
useForwardedHost falso Quando definida como verdadeira, a extensão utiliza os cabeçalhos X-Forwarded-Host e X-Forwarded-Proto para construir URLs em respostas HTTP.

Muitas dessas configurações são para otimizar o desempenho. Para obter mais informações, consulte Desempenho e escala.

Próximos passos