Udostępnij za pośrednictwem


Orkiestratory jednotonowe w Durable Functions (Azure Functions)

W przypadku zadań w tle często trzeba upewnić się, że tylko jedno wystąpienie określonego orkiestratora jest uruchamiane jednocześnie. Tego rodzaju jednotonowe zachowanie w Durable Functions można zapewnić, przypisując określony identyfikator wystąpienia do orkiestratora podczas jego tworzenia.

Przykład pojedynczego elementu

W poniższym przykładzie pokazano funkcję wyzwalacza HTTP, która tworzy pojedynczą aranżację zadań w tle. Kod zapewnia, że istnieje tylko jedno wystąpienie dla określonego identyfikatora wystąpienia.

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

Uwaga

Poprzedni kod języka C# jest przeznaczony dla Durable Functions 2.x. W przypadku Durable Functions 1.x należy użyć OrchestrationClient atrybutu zamiast atrybutu DurableClient i należy użyć typu parametru DurableOrchestrationClientIDurableOrchestrationClientzamiast . Aby uzyskać więcej informacji na temat różnic między wersjami, zobacz artykuł Durable Functions versions (Wersje Durable Functions).

Domyślnie identyfikatory wystąpień są losowo generowane identyfikatory GUID. W poprzednim przykładzie identyfikator wystąpienia jest jednak przekazywany w danych trasy z adresu URL. Następnie kod pobiera metadane wystąpienia orkiestracji, aby sprawdzić, czy wystąpienie o określonym identyfikatorze jest już uruchomione. Jeśli takie wystąpienie nie jest uruchomione, zostanie utworzone nowe wystąpienie z tym identyfikatorem.

Uwaga

W tym przykładzie istnieje potencjalny stan wyścigu. Jeśli dwa wystąpienia metody HttpStartSingle są wykonywane współbieżnie, oba wywołania funkcji będą zgłaszać powodzenie, ale tylko jedno wystąpienie orkiestracji rzeczywiście zostanie uruchomione. W zależności od wymagań może to mieć niepożądane skutki uboczne.

Szczegóły implementacji funkcji orkiestratora nie mają znaczenia. Może to być zwykła funkcja orkiestratora, która uruchamia się i kończy, lub może to być taka, która działa na zawsze (czyli wieczna orkiestracja). Ważnym punktem jest to, że w danym momencie jest uruchomione tylko jedno wystąpienie.

Następne kroki