Compartilhar via


Ligações para Durable Functions ​​(Azure Functions)

A extensão Durable Functions introduz três vinculações de gatilho 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 tempo de execução do 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 do Durable Functions em host.json, o arquivo de metadados que contém configurações que afetam todas as funções em um aplicativo de funções.

Selecione sua linguagem de desenvolvimento de Funções Duráveis na parte superior do artigo.

Ambas as versões do modelo de programação python para o Azure Functions têm suporte do Durable Functions. Como o Python v2 é a versão recomendada, os exemplos neste artigo apresentam exclusivamente essa versão.

Pré-requisitos

  • SDK do Durable Functions, que é o pacote PyPI (Python Package Index) 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 de projeto host.json

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

Gatilho de orquestração

Você pode usar o gatilho de orquestração para desenvolver funções de orquestrador duráveis. 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 de temporizador duráveis, respostas de 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.

Para Java, use a @DurableOrchestrationTrigger anotação para configurar o gatilho de orquestração.

Quando você usa a versão 4 do modelo de programação Node.js para desenvolver funções, 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 o framework 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 é o nome da orquestração que os clientes devem usar quando desejam iniciar novas instâncias da função de orquestrador. Esta propriedade é opcional. Se você não especificá-la, o nome da função será usado.

Ao usar 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 gatilhos e associações do Durable Functions de uma instância de DFApp. Você pode usar essa subclasse de FunctionApp para exportar decoradores específicos para Durable Functions.

Internamente, essa vinculação de gatilho verifica o repositório 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ção de atividade e eventos externos gerados por outras funções.

Comportamento desencadeador

Aqui estão algumas anotações sobre o gatilho de orquestração:

  • Threading único: um único thread dispatcher é usado para toda a execução de função de orquestrador 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 ao aguardar tipos de tarefa específicos do Durable Functions.
  • Tratamento de mensagens envenenadas: não há suporte para mensagens envenenadas em gatilhos de orquestração.
  • Visibilidade da mensagem: as mensagens de orquestração são desencadeadas e mantidas invisíveis por uma duração configurável. A visibilidade dessas mensagens é renovada automaticamente enquanto o aplicativo de função estiver em execução e íntegro.
  • Valores de retorno: os valores retornados são serializados para JSON e mantidos na tabela de histórico de orquestração no Armazenamento de Tabelas do Azure. Esses valores retornados podem ser consultados pela associação de cliente de orquestração, descrita posteriormente.

Aviso

As funções de orquestrador nunca devem usar associações de entrada ou saída diferentes da associação de gatilho de orquestração. O uso de outras associações pode causar problemas com a extensão Durable Task, pois essas associações podem não seguir as regras de encadeamento único e E/S. Se você quiser usar outras associações, adicione-as a uma função de atividade chamada de sua função de orquestrador. Para obter mais informações sobre restrições de codificação para funções de orquestrador, consulte restrições de código de função orchestrator.

Aviso

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

Uso de gatilho

A vinculação do gatilho de orquestração suporta entradas e saídas. Aqui estão algumas anotações sobre o tratamento de entrada e saída:

  • Entradas: você pode invocar gatilhos de orquestração que têm entradas. As entradas são acessadas por meio do objeto de entrada de contexto. Todas as entradas devem ser serializáveis em JSON.
  • Saídas: os gatilhos de orquestração dão suporte a valores de saída e de entrada. O valor retornado da função é usado para atribuir o valor de saída. O valor retornado deve ser serializável em JSON.

Exemplo de gatilho

O código a seguir fornece um exemplo de uma função básica do orquestrador Hello World . Este orquestrador de exemplo 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 do 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 o Durable Functions 1.x, você deve usar DurableOrchestrationContext em vez de IDurableOrchestrationContext. Para obter mais informações sobre as diferenças entre as versões, consulte a 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 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 o Durable Functions 1.x, você deve usar DurableOrchestrationContext em vez de IDurableOrchestrationContext. Para obter mais informações sobre as diferenças entre as versões, consulte a 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;
}

Gatilho 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 orquestradoras.

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

Use 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 de orquestrador usam para invocar essa função de atividade. Esta propriedade é opcional. Se você não especificá-la, o nome da função será usado.

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

Internamente, essa vinculação de gatilho pesquisa o armazenamento durável configurado em busca de novos eventos de execução de atividade.

Comportamento desencadeador

Aqui estão algumas anotações sobre o gatilho de atividade:

  • Threading: ao contrário do gatilho de orquestração, os gatilhos de atividade não têm nenhuma restrição de threading ou operações de 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 do gatilho de atividade são removidas da fila e mantidas invisíveis por uma duração configurável. A visibilidade dessas mensagens é renovada automaticamente enquanto o aplicativo de função estiver em execução e íntegro.
  • Valores retornados: os valores retornados são serializados para JSON e mantidos no repositório durável configurado.

Uso de gatilho

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

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

Exemplo de gatilho

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

[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 for Durable Functions 1.x). No entanto, os gatilhos de atividade do .NET também dão suporte à associação diretamente a tipos serializáveis JSON (incluindo tipos primitivos), para que você também possa 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 associações de entrada e saída

Além do vínculo de gatilho de execução, você também pode usar vínculos regulares de entrada e saída.

Por exemplo, uma função de atividade pode receber entrada de uma função de orquestrador. A função de atividade 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 de cliente de orquestração para gravar funções que interagem com funções do orquestrador. Essas funções geralmente são conhecidas como funções de cliente. Por exemplo, você pode atuar em instâncias de orquestração das seguintes maneiras:

  • Iniciá-las.
  • Consulte o status deles.
  • Encerrá-las.
  • Enviar eventos a elas durante sua execução.
  • Limpe o histórico da instância.

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

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

Para registrar sua função 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 específico ao 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 método app.storageQueue.

Para definir o gatilho de cliente durável, use o seguinte objeto JSON na bindings matriz 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ções 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 de orquestrador de destino usam.
  • O connectionName valor é o nome de uma configuração de aplicativo que contém uma string 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 de orquestrador de destino usam. Se você não especificar essa propriedade, a cadeia de conexão da conta de armazenamento padrão para o aplicativo de funções 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 diretamente usando o decorador durable_client_input no código da função Python.

Uso do cliente

Normalmente, você se vincula a uma implementação de IDurableClient (DurableOrchestrationClient no Durable Functions 1.x), que fornece acesso total a todas as APIs de cliente de orquestração compatíveis com o Durable Functions.

Normalmente, você se vincula à 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 baseada em gatilho de fila que inicia uma orquestração Olá, Mundo.

[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 as versões, consulte a 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 no Durable Functions no Azure.

Gatilho de 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, essa vinculação de gatilho pesquisa o armazenamento durável configurado em busca de novas operações de entidade que precisam ser executadas.

Use o atributo .NET EntityTriggerAttribute para configurar o gatilho 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

Ainda não há suporte para os gatilhos de entidade em Java.

Observação

Os triggers de entidade ainda não são suportados no PowerShell.

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

Comportamento desencadeador

Veja algumas observações sobre o gatilho de entidade:

  • Threading único: 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 suspeitas: não há suporte para mensagens venenosas em gatilhos de entidade.
  • Visibilidade da mensagem: as mensagens do gatilho de entidade são removidas da fila e mantidas invisíveis por uma duração configurável. A visibilidade dessas mensagens é renovada automaticamente enquanto o aplicativo de função estiver em execução e íntegro.
  • Valores retornados: as funções de entidade não dão suporte a valores retornados. Há APIs específicas que você pode usar para salvar o estado ou passar valores de volta para orquestrações.

Todas as alterações de estado feitas em uma entidade durante sua execução são mantidas automaticamente 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 de entidade

Você pode usar a associação de cliente de entidade para disparar as funções de entidade de forma assíncrona. Essas funções às vezes são conhecidas como funções de cliente.

Você pode associar-se ao cliente da entidade usando o atributo DurableClientAttribute .NET em funções da biblioteca de classes do .NET.

Observação

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

Em vez de registrar um cliente de entidade, você usa signalEntity ou callEntity para chamar um método disparador de entidade de qualquer função registrada.

  • Em uma função disparada 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);
        },
    });
    
  • Em uma função de orquestrador, você pode usar 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 no código da função Python.

Observação

Os clientes de entidade ainda não têm suporte 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 cliente, consulte as entidades do Access.

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 a referência do host.json para o Azure Functions 1.x ou a referência do host.json para o Azure Functions 2.x e versões posteriores.

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

Observação

Todas as versões principais das Durable Functions são compatíveis com todas as versões do Azure Functions Runtime. No entanto, o esquema da configuração dehost.json difere ligeiramente dependendo da versão do runtime 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: um para Durable Functions 2.x e outro para Durable Functions 1.x. Você pode usar os dois 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 seção durableTask de host.json está localizada na raiz da configuração 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 padrão Descrição
nome do hub TestHubName (DurableFunctionsHub na v1.x) O nome do hub que armazena o estado atual de um aplicativo de funções. Nomes de hubs de tarefas devem começar com uma letra e devem ser compostos somente por letras e números. Se você não especificar um nome, o valor padrão será usado. Nomes alternativos do hub de tarefas podem ser usados para isolar vários aplicativos de Funções Duráveis uns dos outros, mesmo que 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 de tempo de inatividade zero com alterações interruptivas. Você pode usar qualquer valor de string para a versão.
versionMatchStrategy CurrentOrOlder Um valor que especifica como as versões de orquestração são correspondidas quando as funções do orquestrador são carregadas. Os valores válidos são None, Strict e CurrentOrOlder. Para obter explicações detalhadas, consulte Controle de versão de orquestração.
versionFailureStrategy 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 Controle de versão de orquestração.
controlQueueBatchSize 32 O número de mensagens para efetuar pull da fila de controle por vez.
controlQueueBufferThreshold Plano de consumo para Python: 32
Plano de consumo para outros idiomas: 128
Plano Dedicado ou Premium: 256
O número de mensagens de fila de controle que podem ser armazenadas em buffer na memória de uma só vez. Quando o número especificado é atingido, o dispatcher aguarda antes de desativar qualquer outra mensagem. Em algumas situações, reduzir esse valor pode reduzir significativamente o consumo de memória.
partitionCount 4 A contagem de partição para a fila de controle. Esse valor deve ser um inteiro positivo entre 1 e 16. Alterar esse valor requer a configuração de um novo hub de tarefas.
controlQueueVisibilityTimeout 00:05:00 O tempo limite de visibilidade das mensagens desencadeadas na fila de controle no formato hh:mm:ss.
workItemQueueVisibilityTimeout 00:05:00 O tempo limite de visibilidade de mensagens de fila de itens de trabalho desenfileiradas 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 no computador 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 no computador atual
O número máximo de funções do orquestrador que podem ser processadas simultaneamente em uma única instância do host.
maxConcurrentEntityFunctions Plano de Consumo: 5
Plano Dedicado ou Premium: 10 vezes o número de processadores no computador 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 ao valor maxConcurrentOrchestratorFunctions.
maxQueuePollingInterval 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 maiores devido a um maior número de transações de armazenamento.
maxOrchestrationActions 100,000 O número máximo de ações que uma função de orquestrador pode executar durante um único ciclo de execução.
connectionName (v2.7.0 e posterior)
connectionStringName (v2.x)
azureStorageConnectionStringName (v1.x)
AzureWebJobsStorage O nome de uma configuração de um aplicativo ou de uma 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 serviço de 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 de Histórico e Instâncias, que armazenam o histórico de execução e os 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 serviço de Armazenamento do Azure. Se você não especificar uma configuração, o valor de conexão connectionStringName (v2.x) ou azureStorageConnectionStringName (v1.x) será usado.
trackingStoreNamePrefix O prefixo a ser usado para as tabelas de histórico e instâncias quando trackingStoreConnectionStringName for especificado. Se você não especificar um prefixo, o valor padrão será DurableTask usado. Se trackingStoreConnectionStringName não for especificado, as tabelas Histórico e Instâncias usarão o hubName valor como prefixo 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 tem como objetivo fornecer informações mínimas sobre as entradas e saídas para que 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 reprodução da orquestração devem ser gravados no Application Insights.
logReplayEvents falso Um valor que indica se as execuções reproduzidas devem ser registradas em logs de aplicativos.
eventGridTopicEndpoint A URL de um ponto de extremidade de tópico personalizado do Grade de Eventos do Azure. Quando você configura essa propriedade, os eventos de notificação do ciclo de vida de orquestração são publicados neste endpoint. Essa propriedade dá suporte à resolução de configurações de aplicativo.
eventGridKeySettingName O nome da configuração do aplicativo que contém a chave usada para autenticar com o tópico personalizado da Grade de Eventos na URL EventGridTopicEndpoint.
eventGridPublishRetryCount 0 O número de vezes a tentar novamente se a publicação no tópico da Grade de Eventos falhar.
eventGridPublishRetryInterval 00:05:00 O intervalo de repetição de publicaçã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, Failede Terminated.
extendedSessionsEnabled falso Um valor que especifica se as sessões do orquestrador de sessão e da função de entidade são armazenadas em cache.
extendedSessionIdleTimeoutInSeconds 30 O número de segundos em que uma função de entidade ou orquestrador ocioso permanece na memória antes de ser descarregada. Essa configuração só é usada quando a extendedSessionsEnabled configuração é true.
useAppLease verdadeiro Um valor que indica se os aplicativos devem adquirir uma concessão de blob no nível do aplicativo antes de processar mensagens do hub de tarefas. Para obter mais informações, consulte Recuperação de desastre e distribuição geográfica em Durable Functions. Essa configuração está disponível a partir da v2.3.0.
useLegacyPartitionManagement falso Um valor que especifica o tipo de algoritmo de gerenciamento de partição a ser usado. Quando essa configuração for false, um algoritmo é usado que reduz a possibilidade de execução de função duplicada ao expandir. Essa configuração está disponível a partir da v2.3.0. Não é recomendável definir true esse valor.
useTablePartitionManagement Na v3.x: verdadeiro
Em v2.x: false
Um valor que especifica o tipo de algoritmo de gerenciamento de partição a ser usado. Quando essa configuração é true, um algoritmo é usado que é projetado para reduzir os 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 (Versão prévia) Um valor que indica se deve ser feito um desligamento de forma controlada para reduzir a chance de desligamentos do host, o que pode causar falhas nas execuções das funções em processo.
maxEntityOperationBatchSize 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. Essa configuração está disponível a partir da v2.6.1.
storeInputsInOrchestrationHistory falso Um valor que especifica como armazenar entradas. Quando essa configuração é true, o Framework de Tarefas Duráveis salva as entradas de atividade na tabela de Histórico, e as entradas da função de atividade aparecem nos resultados das consultas do histórico de orquestração.
maxGrpcMessageSizeInBytes 4,194,304 Um valor inteiro que define o tamanho máximo, em bytes, das mensagens que o cliente de chamada de procedimento remoto genérico (gRPC) pode receber. A implementação de DurableTaskClient usa o cliente gRPC para gerenciar instâncias de orquestração. Essa configuração se aplica a aplicativos Java e de trabalho isolados do .NET do Durable Functions.
grpcHttpClientTimeout 00:01:40 O tempo limite no formato hh:mm:ss para o cliente HTTP usado pelo cliente gRPC no Durable Functions. No momento, o cliente tem suporte 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 UTF8 (Formato de Transformação Unicode) 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 padrão, em milissegundos, para APIs HTTP assíncronas. Quando um cliente consulta o status de uma orquestração de longa duração usando o endpoint de consulta de status HTTP, esse valor determina quanto tempo o cliente deve esperar antes de consultar novamente.
useForwardedHost falso Quando definida como true, a extensão usa os cabeçalhos X-Forwarded-Host e X-Forwarded-Proto para construir URLs em respostas HTTP.

Muitas dessas configurações servem para otimizar o desempenho. Para obter mais informações, veja Desempenho e dimensionamento.

Próximas etapas