Megosztás a következőn keresztül:


Örök vezénylések Durable Functions (Azure Functions)

Az örök vezénylés olyan vezénylési függvények, amelyek soha nem érnek véget. Ezek akkor hasznosak, ha Durable Functions szeretne használni az összesítőkhöz és minden olyan forgatókönyvhöz, amely végtelen hurkot igényel.

Vezénylési előzmények

A vezénylési előzményekről szóló témakörben leírtak szerint a Durable Task Framework nyomon követi az egyes függvényvezénylések előzményeit. Ez az előzmény folyamatosan növekszik, amíg a vezénylő függvény továbbra is új munkát ütemez. Ha a vezénylő függvény végtelen hurokba kerül, és folyamatosan ütemezi a munkát, ez az előzmények kritikusan nagyok lehetnek, és jelentős teljesítményproblémákat okozhatnak. Az örök vezénylési koncepció úgy lett kialakítva, hogy enyhítse a végtelen hurkokat igénylő alkalmazások ilyen jellegű problémáit.

Alaphelyzetbe állítás és újraindítás

Végtelen hurkok használata helyett a vezénylési függvények alaphelyzetbe állítják az állapotukat a vezénylési trigger kötésénekújként történő meghívásával. Ez a metódus egy JSON-szerializálható paramétert használ, amely a következő vezénylőfüggvény-generáció új bemenete lesz.

Ha a folytatás újként van meghívva, a vezénylési példány újraindul az új bemeneti értékkel. A rendszer megőrzi ugyanazt a példányazonosítót, de a vezénylő függvény előzményei alaphelyzetbe lesznek állítva.

Megjegyzés

A Durable Task Framework ugyanazt a példányazonosítót tartja fenn, de belsőleg létrehoz egy új végrehajtási azonosítót a vezénylő függvényhez, amely a folytatással alaphelyzetbe áll. Ez a végrehajtási azonosító külsőleg nem érhető el, de hasznos lehet tudni a vezénylés végrehajtásának hibakereséséről.

Példa időszakos munkavégzésre

Az örök vezénylések egyik felhasználási esete az a kód, amely korlátlan ideig rendszeres munkát végez.

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

Megjegyzés

Az előző C#-példa a Durable Functions 2.x. Az 1.x Durable Functions helyett a parancsot kell használnia DurableOrchestrationContextIDurableOrchestrationContext. A verziók közötti különbségekről a verziók Durable Functions című cikkben talál további információt.

A példa és az időzítő által aktivált függvény közötti különbség az, hogy a törlési eseményindítók időpontjai itt nem ütemezésen alapulnak. Például egy CRON-ütemezés, amely óránként hajt végre egy függvényt, 1:00-kor, 2:00-kor, 3:00-kor stb. hajtja végre, és átfedési problémákba ütközhet. Ebben a példában azonban, ha a törlés 30 percet vesz igénybe, akkor 1:00-ra, 2:30-ra, 4:00-ra stb. lesz ütemezve, és nincs esély az átfedésre.

Egy örök vezénylés indítása

A start-new vagy schedule-new durable client metódussal elindíthat egy örök vezénylést, ugyanúgy, mint bármely más vezénylési függvényt.

Megjegyzés

Ha meg kell győződnie arról, hogy egyetlen örök vezénylés fut, fontos, hogy a vezénylés indításakor ugyanazt a példányt id tartsa fenn. További információ: Példánykezelés.

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

Megjegyzés

Az előző kód a Durable Functions 2.x-hez készült. Az 1.x Durable Functions esetében attribútumot kell használnia OrchestrationClient az DurableClient attribútum helyett, és a DurableOrchestrationClient paramétertípust kell használnia a IDurableOrchestrationClienthelyett. A verziók közötti különbségekről a verziók Durable Functions című cikkben talál további információt.

Kilépés az örök vezénylésből

Ha egy vezénylőfüggvénynek végül be kell fejeződnie, csak annyit kell tennie, hogy nem hívja ContinueAsNew meg, és hagyja, hogy a függvény kilépjen.

Ha egy vezénylőfüggvény végtelen hurokban van, és le kell állítani, a vezénylési ügyfélkötésleállítási API-ját használva állítsa le. További információ: Példánykezelés.

Következő lépések