Delen via


Eeuwige indelingen in Durable Functions (Azure Functions)

Eeuwige indelingen zijn orchestratorfuncties die nooit eindigen. Ze zijn handig als u Durable Functions wilt gebruiken voor aggregators en elk scenario waarvoor een oneindige lus is vereist.

Indelingsgeschiedenis

Zoals uitgelegd in het onderwerp Indelingsgeschiedenis , houdt het Durable Task Framework de geschiedenis van elke functieindeling bij. Deze geschiedenis groeit voortdurend zolang de orchestratorfunctie nieuw werk blijft plannen. Als de orchestratorfunctie in een oneindige lus komt en continu werk plant, kan deze geschiedenis aanzienlijk toenemen en aanzienlijke prestatieproblemen veroorzaken. Het concept van de eeuwige indeling is ontworpen om dit soort problemen te verhelpen voor toepassingen die oneindige lussen nodig hebben.

Opnieuw instellen en opnieuw opstarten

In plaats van oneindige lussen te gebruiken, stellen orchestratorfuncties hun status opnieuw in door de continue-as-new-methode van de orchestration-triggerbinding aan te roepen. Deze methode gebruikt een JSON-serialiseerbare parameter, die de nieuwe invoer wordt voor de volgende orchestratorfunctiegeneratie.

Wanneer doorgaan als nieuw wordt aangeroepen, wordt het orchestration-exemplaar opnieuw opgestart met de nieuwe invoerwaarde. Dezelfde exemplaar-id wordt bewaard, maar de geschiedenis van de orchestrator-functie wordt opnieuw ingesteld.

Notitie

Het Durable Task Framework behoudt dezelfde exemplaar-id, maar maakt intern een nieuwe uitvoerings-id voor de orchestrator-functie die opnieuw wordt ingesteld door doorgaan als nieuw. Deze uitvoerings-id wordt niet extern weergegeven, maar het kan handig zijn om op de hoogte te zijn bij het opsporen van foutopsporing bij het uitvoeren van indelingen.

Voorbeeld van periodiek werk

Een gebruiksvoorbeeld voor eeuwige indelingen is code die voor onbepaalde tijd periodiek werk moet uitvoeren.

[FunctionName("Periodic_Cleanup_Loop")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    await context.CallActivityAsync("DoCleanup", null);

    // sleep for one hour between cleanups
    DateTime nextCleanup = context.CurrentUtcDateTime.AddHours(1);
    await context.CreateTimer(nextCleanup, CancellationToken.None);

    context.ContinueAsNew(null);
}

Notitie

Het vorige C#-voorbeeld is voor Durable Functions 2.x. Voor Durable Functions 1.x moet u gebruiken DurableOrchestrationContext in plaats van IDurableOrchestrationContext. Zie het artikel Durable Functions versies voor meer informatie over de verschillen tussen versies.

Het verschil tussen dit voorbeeld en een door een timer geactiveerde functie is dat de tijden van de opschoontrigger hier niet zijn gebaseerd op een schema. Een CRON-planning die elk uur een functie uitvoert, voert deze bijvoorbeeld uit om 1:00, 2:00, 3:00, enzovoort, en kan mogelijk overlappende problemen ondervinden. Als het opschonen in dit voorbeeld echter 30 minuten duurt, wordt deze gepland om 1:00, 2:30, 4:00, enzovoort en is er geen kans op overlapping.

Een eeuwige indeling starten

Gebruik de duurzame clientmethode start-new of schedule-new om een eeuwige indeling te starten, net zoals elke andere indelingsfunctie.

Notitie

Als u ervoor wilt zorgen dat een eeuwige singletonindeling wordt uitgevoerd, is het belangrijk om hetzelfde exemplaar id te behouden wanneer u de indeling start. Zie Exemplaarbeheer voor meer informatie.

[FunctionName("Trigger_Eternal_Orchestration")]
public static async Task<HttpResponseMessage> OrchestrationTrigger(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage request,
    [DurableClient] IDurableOrchestrationClient client)
{
    string instanceId = "StaticId";

    await client.StartNewAsync("Periodic_Cleanup_Loop", instanceId); 
    return client.CreateCheckStatusResponse(request, instanceId);
}

Notitie

De vorige code is voor Durable Functions 2.x. Voor Durable Functions 1.x moet u het kenmerk gebruiken OrchestrationClient in plaats van het DurableClient kenmerk en moet u het DurableOrchestrationClient parametertype gebruiken in plaats van IDurableOrchestrationClient. Zie het artikel Durable Functions versies voor meer informatie over de verschillen tussen versies.

Verlaat een eeuwige indeling

Als een orchestratorfunctie uiteindelijk moet worden voltooid, hoeft u alleen maar aan te roepen ContinueAsNew en de functie af te sluiten.

Als een orchestratorfunctie zich in een oneindige lus bevindt en moet worden gestopt, gebruikt u de beëindigings-API van de orchestration-clientbinding om deze te stoppen. Zie Exemplaarbeheer voor meer informatie.

Volgende stappen