Dela via


Singleton-dirigerare i Durable Functions (Azure Functions)

För bakgrundsjobb behöver du ofta se till att endast en instans av en viss orkestrerare körs i taget. Du kan säkerställa den här typen av singleton-beteende i Durable Functions genom att tilldela ett specifikt instans-ID till en orkestrerare när du skapar det.

Singleton-exempel

I följande exempel visas en HTTP-utlösarfunktion som skapar en singleton-bakgrundsjobborkestrering. Koden säkerställer att endast en instans finns för ett angivet instans-ID.

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

Anteckning

Den tidigare C#-koden gäller för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient attributet i stället för DurableClient attributet och du måste använda DurableOrchestrationClient parametertypen i stället för IDurableOrchestrationClient. Mer information om skillnaderna mellan olika versioner finns i artikeln Durable Functions versioner.

Som standard är instans-ID:t slumpmässigt genererade GUID:ar. I föregående exempel skickas dock instans-ID:t i vägdata från URL:en. Koden hämtar sedan orchestration-instansens metadata för att kontrollera om en instans som har det angivna ID:t redan körs. Om ingen sådan instans körs skapas en ny instans med det ID:t.

Anteckning

Det finns ett potentiellt konkurrenstillstånd i det här exemplet. Om två instanser av HttpStartSingle körs samtidigt rapporterar båda funktionsanropen att det lyckades, men endast en orkestreringsinstans startar faktiskt. Beroende på dina krav kan detta ha oönskade biverkningar.

Implementeringsinformationen för orchestrator-funktionen spelar egentligen ingen roll. Det kan vara en vanlig orkestreringsfunktion som startar och slutförs, eller så kan det vara en som körs för evigt (dvs. en evig orkestrering). Det viktiga är att det bara körs en instans i taget.

Nästa steg