Share via


Időzítők a Durable Functionsben (Azure Functions)

A Durable Functions tartós időzítőket biztosít a vezénylő függvényekben a késések megvalósításához vagy az aszinkron műveletekhez való időkorlátok beállításához. A tartós időzítőket az "alvó" vagy a "késleltetési" API-k helyett a vezénylési funkciókban kell használni, amelyek beépíthetők a nyelvbe.

A tartós időzítők olyan feladatok, amelyek a megadott nyelv megfelelő "időzítő" API-jának használatával jönnek létre, ahogyan az alább látható, és argumentumként egy határidőt vagy időtartamot vesznek igénybe.

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

Amikor "várja" az időzítőfeladatot, a vezénylő függvény a megadott lejárati időig alvó állapotba kerül.

Megjegyzés:

A vezénylések továbbra is feldolgozzák a többi bejövő eseményt, miközben az időzítőfeladat lejáratára várnak.

Időzítő korlátozásai

Amikor létrehoz egy időzítőt, amely 16:30 -kor (UTC) 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 gondoskodik arról, hogy a függvényalkalmazás ismét aktiválva legyen 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álhatja az időzítő API-kat egy while ciklusban, hogy hosszabb késleltetést szimuláljon. 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 a 6 napos vagy annál hosszabb hosszú időzítők belsőleg, rövidebb időzítők (például 3 napos időtartamok) használatával implementálhatók, amíg el nem éri a kívánt lejárati időt. Ez 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.

Használat késleltetéshez

Az alábbi példa bemutatja, hogyan használhat tartós időzítőket a végrehajtás késleltetéséhez. A példa egy 10 napig naponta megjelenő számlázási értesítés.

[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 Durable Functions 2.x-et célozza meg. A Durable Functions 1.x esetén a helyett IDurableOrchestrationContexta DurableOrchestrationContext . 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.

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.

Időtúllépési használat

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 Durable Functions 2.x-et célozza meg. A Durable Functions 1.x esetén a helyett IDurableOrchestrationContexta DurableOrchestrationContext . 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.

Figyelmeztetés

A .NET-ben, a JavaScriptben, a Pythonban és a PowerShellben le kell mondania a létrehozott tartós időzítőket, ha a kód nem várja meg, hogy befejeződjenek. Tekintse meg a fenti példákat a függőben lévő időzítők megszakításához. A Durable Task Framework mindaddig nem módosítja a vezénylés állapotát "Befejezve" értékre, amíg az összes befejezetlen tevékenység, beleértve a tartós időzítőfeladatokat is, nem fejeződik be vagy nem fejeződik be.

Ez a bármikori mintát használó lemondási mechanizmus nem szünteti meg a folyamatban lévő tevékenységfüggvényeket vagy az al-vezénylési végrehajtásokat. Ehelyett egyszerűen lehetővé teszi, hogy a vezénylő függvény figyelmen kívül hagyja az eredményt, és továbblépjen. Ha a függvényalkalmazás a Használat csomagot használja, a rendszer továbbra is a felhagyott tevékenységfüggvény által felhasznált időért és memóriáért számláz. 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 újraindul az összes végrehajtás leállításához és az elszabadult számlázási helyzet megelőzéséhez. 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ó és időtúllépések – Telefon Ellenőrzés című cikkben találja.

További lépések