Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
whileciklusban 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_datetimePython vagyctx.currentUtcDateTimeJavaScriptben).
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.