A Durable Functions hibáinak kezelése (Azure Functions)

A durable function vezénylések kódban vannak implementálva, és használhatják a programozási nyelv beépített hibakezelési funkcióit. A hibák kezelésének és a kompenzációnak a vezénylésekhez való hozzáadásához nincs szükség új fogalmakra. Vannak azonban olyan viselkedések, amelyeket érdemes figyelembe vennie.

Megjegyzés

A Azure Functions Node.js programozási modelljének 4. verziója általánosan elérhető. Az új v4-modell rugalmasabb és intuitívabb felhasználói élményt nyújt JavaScript- és TypeScript-fejlesztők számára. A migrálási útmutatóban további információt talál a v3 és a v4 közötti különbségekről.

A következő kódrészletekben a JavaScript (PM4) az új V4 programozási modellt jelöli.

Tevékenységfüggvények hibái

A tevékenységfüggvényekben megjelenő kivételeket a rendszer visszaállítja a vezénylő függvénybe, és egyként FunctionFailedExceptiondobja ki. A vezénylő függvényben az igényeinek megfelelő hibakezelési és kompenzációs kódot írhat.

Vegyük például a következő vezénylő függvényt, amely az egyik fiókból a másikba utal át pénzt:

[FunctionName("TransferFunds")]
public static async Task Run([OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var transferDetails = context.GetInput<TransferOperation>();

    await context.CallActivityAsync("DebitAccount",
        new
        {
            Account = transferDetails.SourceAccount,
            Amount = transferDetails.Amount
        });

    try
    {
        await context.CallActivityAsync("CreditAccount",
            new
            {
                Account = transferDetails.DestinationAccount,
                Amount = transferDetails.Amount
            });
    }
    catch (Exception)
    {
        // Refund the source account.
        // Another try/catch could be used here based on the needs of the application.
        await context.CallActivityAsync("CreditAccount",
            new
            {
                Account = transferDetails.SourceAccount,
                Amount = transferDetails.Amount
            });
    }
}

Megjegyzés

Az előző C#-példák a 2.x Durable Functions. Az 1.x Durable Functions helyett a következőt kell használnia DurableOrchestrationContextIDurableOrchestrationContext: . A verziók közötti különbségekről további információt a Durable Functions verziókról szóló cikkben talál.

Ha az első CreditAccount függvényhívás meghiúsul, a vezénylő függvény kompenzálja az összeget a forrásfiókba történő jóváírással.

Automatikus újrapróbálkozás hiba esetén

Amikor tevékenységfüggvényeket vagy alvezénylési függvényeket hív meg, megadhat egy automatikus újrapróbálkozási szabályzatot. Az alábbi példa legfeljebb háromszor próbál meghívni egy függvényt, és minden újrapróbálkozás között 5 másodpercet vár:

[FunctionName("TimerOrchestratorWithRetry")]
public static async Task Run([OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var retryOptions = new RetryOptions(
        firstRetryInterval: TimeSpan.FromSeconds(5),
        maxNumberOfAttempts: 3);

    await context.CallActivityWithRetryAsync("FlakyFunction", retryOptions, null);

    // ...
}

Megjegyzés

Az előző C#-példák a 2.x Durable Functions. Az 1.x Durable Functions helyett a következőt kell használnia DurableOrchestrationContextIDurableOrchestrationContext: . A verziók közötti különbségekről további információt a Durable Functions verziókról szóló cikkben talál.

Az előző példában a tevékenységfüggvény hívása egy paramétert vesz igénybe az automatikus újrapróbálkozási szabályzat konfigurálásához. Az automatikus újrapróbálkozási szabályzat testreszabására több lehetőség is van:

  • Kísérletek maximális száma: A kísérletek maximális száma. Ha az 1 értékre van állítva, nem lesz újrapróbálkozás.
  • Első újrapróbálkozási időköz: Az első újrapróbálkozási kísérlet előtti várakozási idő.
  • Visszalépési együttható: A visszalépés növekedésének mértékének meghatározására használt együttható. Alapértelmezés szerint 1.
  • Maximális újrapróbálkozási időköz: Az újrapróbálkozási kísérletek közötti várakozás maximális időtartama.
  • Újrapróbálkozás időtúllépése: Az újrapróbálkozással töltött idő maximális száma. Az alapértelmezett viselkedés az újrapróbálkozás határozatlan ideig.

Egyéni újrapróbálkozás-kezelők

A .NET vagy a Java használatakor lehetősége van újrapróbálkozás-kezelők implementálására is a kódban. Ez akkor hasznos, ha a deklaratív újrapróbálkozási szabályzatok nem elég kifejezőek. Az egyéni újrapróbálkozási kezelőket nem támogató nyelvek esetében továbbra is alkalmazhat újrapróbálkozási szabályzatokat hurkok, kivételkezelés és időzítők használatával az újrapróbálkozások közötti késések injektálására.

RetryOptions retryOptions = new RetryOptions(
    firstRetryInterval: TimeSpan.FromSeconds(5),
    maxNumberOfAttempts: int.MaxValue)
    {
        Handle = exception =>
        {
            // True to handle and try again, false to not handle and throw.
            if (exception is TaskFailedException failure)
            {
                // Exceptions from TaskActivities are always this type. Inspect the
                // inner Exception to get more details.
            }

            return false;
        };
    }

await ctx.CallActivityWithRetryAsync("FlakeyActivity", retryOptions, null);

Függvény időtúllépései

Előfordulhat, hogy egy vezénylőfüggvényen belül fel szeretné hagyni a függvényhívást, ha az túl sokáig tart. Ennek ma a megfelelő módja egy tartós időzítő létrehozása egy "bármely" feladatválasztóval, az alábbi példához hasonlóan:

[FunctionName("TimerOrchestrator")]
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("FlakyFunction");
        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éldák a 2.x Durable Functions. Az 1.x Durable Functions helyett a következőt kell használnia DurableOrchestrationContextIDurableOrchestrationContext: . A verziók közötti különbségekről további információt a Durable Functions verziókról szóló cikkben talál.

Megjegyzés

Ez a mechanizmus valójában nem állítja le a folyamatban lévő tevékenységfüggvények végrehajtását. 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. További információt az Időzítők dokumentációjában talál.

Nem kezelt kivételek

Ha egy vezénylőfüggvény kezeletlen kivétellel meghiúsul, a rendszer naplózza a kivétel részleteit, és a példány állapottal Failed fejeződik be.

Következő lépések