Tartós időzítők implementálása késésekhez és időtúllépésekhez

Durable Functionsdurable időzítőket biztosít a vezénylési függvényekben a késések implementálásához vagy az aszinkron műveletekhez való időkorlátok beállításához. Használjon tartós időzítőket a vezénylési sleepdelay függvényekben a nyelvbe beépített API-k helyett.

A Durable Task SDK-k tartós időzítőket biztosítanak a vezénylésekhez a késések megvalósításához vagy az aszinkron műveletek időkorlátjának beállításához. Használjon tartós időzítőket a vezénylésekhez a nyelvbe beépített sleep vagy delay API-k helyett.

Fontos

A PowerShell Durable Task SDK jelenleg nem érhető el.

A tartós időzítők a megadott nyelvhez megfelelő create timer API-val létrehozott feladatok, ahogyan az az alábbi példákban is látható, és argumentumként a határidőt vagy az időtartamot is figyelembe veszik.

// Put the orchestrator to sleep for 72 hours
DateTime dueTime = context.CurrentUtcDateTime.AddHours(72);
await context.CreateTimer(dueTime, CancellationToken.None);
// Put the orchestration to sleep for 72 hours
await context.CreateTimer(TimeSpan.FromHours(72), CancellationToken.None);

await Az időzítőfeladatnál a vezénylő függvény a megadott lejárati időig alszik.

Amikor elindítja az időzítő feladatot, az orkesztráció a megadott lejárati időig szünetel.

Megjegyzés:

Az orkesztrációk továbbra is feldolgozzák a többi bejövő eseményt, miközben egy időzítő feladat lejáratára várnak.

Tartós időzítő korlátozásai

Amikor létrehoz egy időzítőt, amely 16:30 (UTC) időpontban lejár, a mögöttes Durable Task Framework egy üzenetet küld, amely csak 16:30-kor (UTC) válik láthatóvá. Ha a függvényalkalmazás addig is nullára van skálázva, az újonnan látható időzítőüzenet biztosítja, hogy a függvényalkalmazás ismét aktiválódjon egy megfelelő virtuális gépen.

Megjegyzés:

  • JavaScript-, Python- és PowerShell-alkalmazások esetén a tartós időzítők legfeljebb hat napig használhatók. A korlátozás megkerüléséhez használja az időzítő API-kat egy while ciklusban a hosszabb késleltetés szimulálásához. A naprakész .NET és Java alkalmazások tetszőlegesen hosszú időzítőket támogatnak.
  • A használt SDK-verziótól és a tárolószolgáltatótól függően előfordulhat, hogy a hosszú, hat napos vagy annál hosszabb időzítőket belsőleg rövidebb időzítők (például háromnapos időtartamok) használatával implementálják, amíg el nem éri a kívánt lejárati időt. Ez a viselkedés megfigyelhető a mögöttes adattárban, de nem befolyásolja a vezénylési viselkedést.
  • Ne használjon beépített dátum/idő API-kat az aktuális idő lekéréséhez. Az időzítő lejáratának jövőbeli dátumának kiszámításakor mindig használja a vezénylő függvény aktuális idő API-ját. További információkért tekintse meg a vezénylő függvénykód korlátozásait ismertető cikket.

Amikor létrehoz egy időzítőt, amely 16:30 (UTC) időpontban lejár, a mögöttes Durable Task Framework egy üzenetet küld, amely csak 16:30-kor (UTC) válik láthatóvá. Az időzítőüzenet biztosítja, hogy a munkavállaló újra aktiválódjön, amikor az időzítő lejár.

Megjegyzés:

  • Ha hosszú késleltetést (például néhány napos vagy több napos késést) ad meg, az több, belsőleg felügyelt tartós időzítő létrehozását eredményezheti. A vezénylési kódnak nem kell tisztában lennie ezzel a viselkedésével. Ez azonban látható lehet a keretrendszernaplókban és a tárolt előzmények állapotában.
  • Ne használjon beépített dátum- és idő API-kat az aktuális idő lekéréséhez. Az időzítő lejáratának jövőbeli dátumának kiszámításakor mindig használja a vezénylési környezet aktuális időtulajdonságát (például context.CurrentUtcDateTime .NET, ctx.current_utc_datetime Python vagy ctx.currentUtcDateTime JavaScriptben).

Tartós időzítők használata késésekhez

Az alábbi példa bemutatja, hogyan késleltetheti a végrehajtást tartós időzítőkkel. A példa 10 napig minden nap egy számlázási értesítést ad ki.

[FunctionName("BillingIssuer")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    for (int i = 0; i < 10; i++)
    {
        DateTime deadline = context.CurrentUtcDateTime.Add(TimeSpan.FromDays(1));
        await context.CreateTimer(deadline, CancellationToken.None);
        await context.CallActivityAsync("SendBillingEvent");
    }
}

Megjegyzés:

Az előző C# példa a 2.x Durable Functions célozza meg. Az 1.x Durable Functions esetében a DurableOrchestrationContext használatát IDurableOrchestrationContext helyett kell alkalmazni. A verziók közötti különbségekről további információt a Durable Functions verzióiról szóló cikkben talál.

public class BillingIssuer : TaskOrchestrator<object?, string>
{
    public override async Task<string> RunAsync(TaskOrchestrationContext context, object? input)
    {
        for (int i = 0; i < 10; i++)
        {
            await context.CreateTimer(TimeSpan.FromDays(1), CancellationToken.None);
            await context.CallActivityAsync("SendBillingEvent");
        }
        return "done";
    }
}

Figyelmeztetés

Kerülje a végtelen hurkokat a vezénylő függvényekben. A végtelen ciklusos forgatókönyvek biztonságos és hatékony implementálásáról további információt az Örök vezénylések című témakörben talál.

Figyelmeztetés

A vezénylések során kerülje a végtelen hurkokat. A végtelen ciklusos forgatókönyvek biztonságos és hatékony implementálásáról további információt az Örök vezénylések című témakörben talál.

Tartós időzítők használata időtúllépésekhez

Ez a példa bemutatja, hogyan lehet tartós időzítőket használni az időtúllépések implementálásához:

[FunctionName("TryGetQuote")]
public static async Task<bool> Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    TimeSpan timeout = TimeSpan.FromSeconds(30);
    DateTime deadline = context.CurrentUtcDateTime.Add(timeout);

    using (var cts = new CancellationTokenSource())
    {
        Task activityTask = context.CallActivityAsync("GetQuote");
        Task timeoutTask = context.CreateTimer(deadline, cts.Token);

        Task winner = await Task.WhenAny(activityTask, timeoutTask);
        if (winner == activityTask)
        {
            // success case
            cts.Cancel();
            return true;
        }
        else
        {
            // timeout case
            return false;
        }
    }
}

Megjegyzés:

Az előző C# példa a 2.x Durable Functions célozza meg. Az 1.x Durable Functions esetében a DurableOrchestrationContext használatát IDurableOrchestrationContext helyett kell alkalmazni. A verziók közötti különbségekről további információt a Durable Functions verzióiról szóló cikkben talál.

public class TryGetQuote : TaskOrchestrator<object?, bool>
{
    public override async Task<bool> RunAsync(TaskOrchestrationContext context, object? input)
    {
        using var cts = new CancellationTokenSource();

        Task<double> activityTask = context.CallActivityAsync<double>("GetQuote");
        Task timeoutTask = context.CreateTimer(TimeSpan.FromSeconds(30), cts.Token);

        Task winner = await Task.WhenAny(activityTask, timeoutTask);
        if (winner == activityTask)
        {
            // success case
            cts.Cancel();
            return true;
        }
        else
        {
            // timeout case
            return false;
        }
    }
}

Figyelmeztetés

.NET, JavaScript, Python és PowerShell esetén törölje a létrehozott tartós időzítőket, ha a kód nem várja meg, hogy befejeződjenek. Tekintse meg az előző példákat a függőben lévő időzítők megszakításához. A Durable Task Framework nem módosítja az orchestration állapotát "Befejezve" értékre, amíg minden hátralévő tevékenység, beleértve a tartós időzítőfeladatokat is, be nem fejeződik vagy törlésre nem kerül.

Figyelmeztetés

Ha az SDK támogatja az időzítő lemondását (például .NET), törölje a létrehozott tartós időzítőket, ha a kód nem várja meg, hogy befejeződjenek. Tekintse meg az előző példákat a függőben lévő időzítők megszakításához. A Durable Task Framework nem módosítja az orchestration állapotát "Befejezve" értékre, amíg minden hátralévő tevékenység, beleértve a tartós időzítőfeladatokat is, be nem fejeződik vagy törlésre nem kerül.

Ez a amikor-bármelyik mintát használó megszakítási mechanizmus nem állítja le a folyamatban lévő tevékenységi függvényeket vagy az al-vezénylési végrehajtást. Ehelyett egyszerűen lehetővé teszi, hogy a vezénylő függvény figyelmen kívül hagyja az eredményt, és továbblépjön. Ha a függvényalkalmazás a Használati csomagot használja, akkor továbbra is kiszámlázzuk az elhagyott tevékenységfüggvény által felhasznált időt és memóriát. A Használati tervben futó függvények alapértelmezés szerint öt perc időtúllépéssel rendelkeznek. Ha túllépi ezt a korlátot, az Azure Functions gazdagép újraindítása leállítja az összes végrehajtást, és megakadályozza az elszabadult számlázási problémát. A függvény időtúllépése konfigurálható.

Az időtúllépések vezénylési függvényekben való implementálásának részletesebb példáját az Emberi interakció című cikkben találja.

Ez a bármikori mintát használó lemondási mechanizmus nem szünteti meg az éppen folyamatban lévő tevékenységeket vagy az al-orkesztrációs futtatásokat. Ehelyett egyszerűen lehetővé teszi, hogy az orkesztráció figyelmen kívül hagyja az eredményt, és továbblépjen.

Következő lépések