Share via


Orquestradores singleton em Funções Duráveis (Azure Functions)

Para trabalhos em segundo plano, normalmente, é preciso garantir que apenas uma instância de determinado orquestrador seja executada por vez. Para garantir esse tipo de comportamento singleton em Durable Functions, atribua um ID de instância específico a um orquestrador durante a criação.

Exemplo de singleton

O exemplo a seguir mostra uma função de gatilho HTTP que cria uma orquestração singleton de trabalho em segundo plano. O código garante que apenas uma instância exista para uma ID de instância especificada.

[FunctionName("HttpStartSingle")]
public static async Task<HttpResponseMessage> RunSingle(
    [HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}/{instanceId}")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient starter,
    string functionName,
    string instanceId,
    ILogger log)
{
    // Check if an instance with the specified ID already exists or an existing one stopped running(completed/failed/terminated).
    var existingInstance = await starter.GetStatusAsync(instanceId);
    if (existingInstance == null 
    || existingInstance.RuntimeStatus == OrchestrationRuntimeStatus.Completed 
    || existingInstance.RuntimeStatus == OrchestrationRuntimeStatus.Failed 
    || existingInstance.RuntimeStatus == OrchestrationRuntimeStatus.Terminated)
    {
        // An instance with the specified ID doesn't exist or an existing one stopped running, create one.
        dynamic eventData = await req.Content.ReadAsAsync<object>();
        await starter.StartNewAsync(functionName, instanceId, eventData);
        log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
        return starter.CreateCheckStatusResponse(req, instanceId);
    }
    else
    {
        // An instance with the specified ID exists or an existing one still running, don't create one.
        return new HttpResponseMessage(HttpStatusCode.Conflict)
        {
            Content = new StringContent($"An instance with ID '{instanceId}' already exists."),
        };
    }
}

Observação

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

Por padrão, IDs de instância são GUIDs gerados aleatoriamente. No exemplo anterior, no entanto, o ID da instância é transmitido nos dados de rota a partir da URL. Em seguida, o código busca os metadados da instância de orquestração para verificar se uma instância com a ID especificada já está em execução. Se essa instância não estiver em execução, uma nova instância será criada com esse ID.

Observação

Há uma condição de corrida potencial neste exemplo. Se duas instâncias de HttpStartSingle forem executadas simultaneamente, as chamadas de função relatarão êxito, mas somente uma instância de orquestração será realmente iniciada. Dependendo dos seus requisitos, isso pode ter efeitos colaterais indesejáveis.

Os detalhes da implementação da função de orquestrador não importam, na realidade. Poderia ser uma função de orquestrador regular que é iniciada e concluída ou poderia ser uma que é executada eternamente (ou seja, um Orquestração Eterna). O aspecto importante é que há somente uma instância em execução por vez.

Próximas etapas