Sdílet prostřednictvím


Jednoúčelové orchestrátory v Durable Functions (Azure Functions)

U úloh na pozadí často potřebujete zajistit, aby najednou běžela jenom jedna instance konkrétního orchestrátoru. Tento druh jednoznačného chování v Durable Functions můžete zajistit přiřazením ID konkrétní instance orchestrátoru při jeho vytváření.

Příklad typu Singleton

Následující příklad ukazuje funkci HTTP-trigger, která vytvoří orchestraci úlohy na pozadí s jedním objektem. Kód zajišťuje, že pro zadané ID instance existuje pouze jedna instance.

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

Poznámka

Předchozí kód jazyka C# je určený pro Durable Functions 2.x. Pro Durable Functions 1.x musíte místo atributu DurableClient použít OrchestrationClient atribut a typ parametru DurableOrchestrationClientIDurableOrchestrationClientmísto . Další informace o rozdílech mezi verzemi najdete v článku Durable Functions verze.

VE výchozím nastavení jsou ID instancí náhodně generovaná identifikátory GUID. V předchozím příkladu se ale ID instance předává v datech směrování z adresy URL. Kód pak načte metadata instance orchestrace a zkontroluje, jestli je již spuštěná instance se zadaným ID. Pokud žádná taková instance není spuštěná, vytvoří se nová instance s tímto ID.

Poznámka

V této ukázce existuje potenciální konflikt časování. Pokud se současně spustí dvě instance HttpStartSingle , obě volání funkce budou hlásit úspěch, ale ve skutečnosti se spustí pouze jedna instance orchestrace. V závislosti na vašich požadavcích to může mít nežádoucí vedlejší účinky.

Na podrobnostech implementace funkce orchestrátoru ve skutečnosti nezáleží. Může to být běžná funkce orchestrátoru, která začíná a dokončuje, nebo to může být funkce, která běží napořád (tedy věčná orchestrace). Důležité je, že vždy je spuštěná vždy jen jedna instance.

Další kroky