Hibakezelés és újrapróbálkozások az Azure Functionsben
Az Azure Functions hibáinak kezelése fontos az elveszett adatok elkerüléséhez, a kihagyott események elkerüléséhez és az alkalmazás állapotának figyeléséhez. Fontos módszer az eseményalapú eseményindítók újrapróbálkozási viselkedésének megértésére is.
Ez a cikk a hibakezelés általános stratégiáit és az elérhető újrapróbálkozési stratégiákat ismerteti.
Fontos
Az előzetes verziójú újrapróbálkozási szabályzat bizonyos eseményindítók esetében 2022 decemberében el lett távolítva. A támogatott eseményindítókra vonatkozó újrapróbálkozási szabályzatok már általánosan elérhetők (GA). Az újrapróbálkozási szabályzatokat jelenleg támogató bővítmények listáját az Újrapróbálkozások szakaszban találja.
Hibák kezelése
Az Azure-függvényekben előforduló hibák a következő esetekben fordulhatnak elő:
- Beépített Functions-triggerek és kötések használata.
- A mögöttes Azure-szolgáltatások API-jainak hívásai.
- A REST-végpontokra irányuló hívások.
- Ügyfélkódtárak, csomagok vagy külső API-k hívása.
Az adatvesztés vagy az elmulasztott üzenetek elkerülése érdekében fontos a helyes hibakezelés gyakorlata. Ez a táblázat néhány ajánlott hibakezelési eljárást ismertet, és további információkra mutató hivatkozásokat tartalmaz.
Ajánlás | Részletek |
---|---|
Az Application Insights engedélyezése | Az Azure Functions integrálható az Application Insights szolgáltatással a hibaadatok, a teljesítményadatok és a futásidejű naplók gyűjtéséhez. Az Application Insights használatával felderítheti és jobban megértheti a függvényvégrehajtásokban előforduló hibákat. További információ: Az Azure Functions monitorozása. |
Strukturált hibakezelés használata | A rögzítési és naplózási hibák kritikus fontosságúak az alkalmazás állapotának monitorozásához. A függvénykódok legfelső szintjének tartalmaznia kell egy próba-/fogási blokkot. A fogási blokkban rögzítheti és naplózhatja a hibákat. A kötések által esetlegesen felmerülő hibákról további információt a Kötés hibakódok című témakörben talál. Az adott újrapróbálkozási stratégiától függően új kivételt is jelenthet a függvény ismételt futtatásához. |
Az újrapróbálkozás stratégiájának megtervezve | Számos Functions-kötésbővítmény beépített támogatást nyújt az újrapróbálkozásokhoz, míg mások lehetővé teszik újrapróbálkozási szabályzatok meghatározását, amelyeket a Functions-futtatókörnyezet implementál. Az újrapróbálkozási viselkedést nem biztosító eseményindítók esetében érdemes megfontolni a saját újrapróbálkozási séma implementálását. További információ: Újrapróbálkozás. |
Idempotencia tervezése | Az adatok feldolgozásakor előforduló hibák problémát jelenthetnek a függvények számára, különösen akkor, ha üzeneteket dolgoz fel. Fontos megfontolni, hogy mi történik a hiba bekövetkezésekor, és hogyan kerülheti el a duplikált feldolgozást. További információ: Az Azure Functions tervezése azonos bemenethez. |
Tipp.
Kimeneti kötések használatakor nem tudja kezelni a távoli szolgáltatás elérésekor előforduló hibákat. Emiatt ellenőriznie kell a kimeneti kötéseknek átadott összes adatot, hogy ne merüljenek fel ismert kivételek. Ha képesnek kell lennie az ilyen kivételek kezelésére a függvénykódban, akkor a kimeneti kötések helyett az ügyfél SDK-val kell elérnie a távoli szolgáltatást.
Újrapróbálkozások
A függvényekhez kétféle újrapróbálkozás érhető el:
- Az egyes triggerbővítmények beépített újrapróbálkozási viselkedése
- A Functions-futtatókörnyezet által biztosított újrapróbálkozási szabályzatok
Az alábbi táblázat azt jelzi, hogy mely eseményindítók támogatják az újrapróbálkozásokat, és hol van konfigurálva az újrapróbálkozási viselkedés. A mögöttes szolgáltatásokból származó hibákra vonatkozó további információkra is hivatkozik.
Trigger/kötés | Újrapróbálkozás forrása | Konfiguráció |
---|---|---|
Azure Cosmos DB | Újrapróbálkozás szabályzatai | Függvényszint |
Blob Storage | Kötésbővítmény | host.json |
Event Grid | Kötésbővítmény | Esemény-előfizetés |
Event Hubs | Újrapróbálkozás szabályzatai | Függvényszint |
Kafka | Újrapróbálkozás szabályzatai | Függvényszint |
Queue Storage | Kötésbővítmény | host.json |
RabbitMQ | Kötésbővítmény | Kézbesítetlen levelek üzenetsora |
Service Bus | Kötésbővítmény | host.json* |
Időzítő | Újrapróbálkozás szabályzatai | Függvényszint |
*Az Azure Service Bus bővítmény 5.x-es verziójára van szükség. A régebbi bővítményverziókban az újrapróbálkozási viselkedéseket a Service Bus kézbesítetlen levelek üzenetsora valósítja meg.
Újrapróbálkozási szabályzatok
Az Azure Functions lehetővé teszi az újrapróbálkozási szabályzatok definiálását bizonyos triggertípusokhoz, amelyeket a futtatókörnyezet kényszerít. Az alábbi triggertípusok jelenleg támogatják az újrapróbálkozási szabályzatokat:
Az újrapróbálkozás támogatása ugyanaz a v1 és v2 Python programozási modellek esetében is.
Az újrapróbálkozási szabályzatok nem támogatottak a Functions-futtatókörnyezet 1.x-es verziójában.
Az újrapróbálkozási szabályzat arra utasítja a futtatókörnyezetet, hogy futtassa újra a sikertelen végrehajtást, amíg el nem éri a sikeres teljesítést, vagy el nem éri az újrapróbálkozások maximális számát.
Az újrapróbálkozási szabályzat akkor lesz kiértékelve, ha egy támogatott eseményindító-típus által végrehajtott függvény váratlan kivételt eredményez. Ajánlott eljárásként a kódban szereplő összes kivételt ki kell fognia, és új kivételeket kell létrehoznia az újrapróbálkozást eredményező hibák esetén.
Fontos
Az Event Hubs-ellenőrzőpontok írása csak a végrehajtás újrapróbálkozási szabályzatának befejeződése után lesz megírva. Emiatt a folyamat az adott partíción szünetel, amíg az aktuális köteg feldolgozásra nem kerül.
Az Event Hubs bővítmény 5.x-es verziója további újrapróbálkozási képességeket támogat a Functions-gazdagép és az eseményközpont közötti interakciókhoz. További információ clientRetryOptions
: Event Hubs host.json referencia.
Újrapróbálkozási stratégiák
A szabályzat által támogatott két újrapróbálkozési stratégiát konfigurálhat:
Az egyes újrapróbálkozások között meghatározott idő telik el.
Használatalapú csomagban való futtatáskor a rendszer csak a függvénykód végrehajtásának idejére számláz. Ezen újrapróbálkozási stratégiák egyikében sem kell fizetnie a végrehajtások közötti várakozási időre.
Újrapróbálkozások maximális száma
Konfigurálhatja, hogy a függvények végrehajtása a végleges hiba előtt legfeljebb hány alkalommal legyen újrapróbálkozva. Az újrapróbálkozás aktuális száma a példány memóriájában van tárolva.
Előfordulhat, hogy egy példánynál hiba történt az újrapróbálkozási kísérletek között. Ha egy példány meghiúsul egy újrapróbálkozási szabályzat során, az újrapróbálkozási szám elveszik. Példányhibák esetén az Event Hubs-eseményindító folytathatja a feldolgozást, és újrapróbálkozza a köteget egy új példányon, és az újrapróbálkozások száma nullára állítható vissza. Az időzítő eseményindítója nem folytatódik egy új példányon.
Ez a viselkedés azt jelenti, hogy az újrapróbálkozás maximális száma a legjobb megoldás. Bizonyos ritka esetekben a végrehajtás a kért maximális számnál több alkalommal is újrapróbálkozott. Időzítő eseményindítók esetén az újrapróbálkozások kisebbek lehetnek a kért maximális számnál.
Példák újrapróbálkozása
A rögzített késleltetési és exponenciális visszalépési stratégiákra is van példa. Egy adott stratégiára vonatkozó példák megtekintéséhez először ki kell választania ezt a stratégiát az előző lapon.
A függvényszintű újrapróbálkozásokat a következő NuGet-csomagok támogatják:
- Microsoft.Azure.Functions.Worker.Sdk>= 1.9.0
- Microsoft.Azure.Functions.Worker.Extensions.EventHubs>= 5.2.0
- Microsoft.Azure.Functions.Worker.Extensions.Kafka>= 3.8.0
- Microsoft.Azure.Functions.Worker.Extensions.Timer>= 4.2.0
[Function(nameof(TimerFunction))]
[FixedDelayRetry(5, "00:00:10")]
public static void Run([TimerTrigger("0 */5 * * * *")] TimerInfo timerInfo,
FunctionContext context)
{
var logger = context.GetLogger(nameof(TimerFunction));
logger.LogInformation($"Function Ran. Next timer schedule = {timerInfo.ScheduleStatus?.Next}");
}
Tulajdonság | Leírás |
---|---|
MaxRetryCount | Szükséges. A függvényvégrehajtásonként engedélyezett újrapróbálkozések maximális száma.
-1 azt jelenti, hogy határozatlan időre újrapróbálkoznak. |
DelayInterval | Az újrapróbálkozások közötti késés. Adja meg sztringként a formátumot HH:mm:ss . |
Íme egy példa a function.json fájlban definiált újrapróbálkozési szabályzatra:
{
"disabled": false,
"bindings": [
{
....
}
],
"retry": {
"strategy": "fixedDelay",
"maxRetryCount": 4,
"delayInterval": "00:00:10"
}
}
Ezeket a tulajdonságokat újrapróbálkozási szabályzatdefiníciókon állíthatja be:
Tulajdonság | Leírás |
---|---|
stratégia | Szükséges. A használt újrapróbálkozási stratégia. Az érvényes értékek a következők: fixedDelay vagy exponentialBackoff . |
maxRetryCount | Szükséges. A függvényvégrehajtásonként engedélyezett újrapróbálkozések maximális száma.
-1 azt jelenti, hogy határozatlan időre újrapróbálkoznak. |
delayInterval | A stratégia használatakor fixedDelay az újrapróbálkozások közötti késés. Adja meg sztringként a formátumot HH:mm:ss . |
minimumInterval | A minimális újrapróbálkozás késleltetése egy stratégia használatakor exponentialBackoff . Adja meg sztringként a formátumot HH:mm:ss . |
maximumInterval | A maximális újrapróbálkozás késleltetése a stratégia használatakor exponentialBackoff . Adja meg sztringként a formátumot HH:mm:ss . |
Az eseményindító újrapróbálkozási szabályzatának definiálása a Node.js verziójától függ.
Íme egy példa egy időzítő triggerfüggvényre, amely rögzített késleltetési újrapróbálkozási stratégiát használ:
const { app } = require('@azure/functions');
app.timer('timerTriggerWithRetry', {
schedule: '0 */5 * * * *',
retry: {
strategy: 'fixedDelay',
delayInterval: {
seconds: 10,
},
maxRetryCount: 4,
},
handler: (myTimer, context) => {
if (context.retryContext?.retryCount < 2) {
throw new Error('Retry!');
} else {
context.log('Timer function processed request.');
}
},
});
Az eseményindító újrapróbálkozási szabályzatának definiálása a Node.js verziójától függ.
Íme egy példa egy időzítő triggerfüggvényre, amely rögzített késleltetési újrapróbálkozási stratégiát használ:
import { app, InvocationContext, Timer } from '@azure/functions';
export async function timerTriggerWithRetry(myTimer: Timer, context: InvocationContext): Promise<void> {
if (context.retryContext?.retryCount < 2) {
throw new Error('Retry!');
} else {
context.log('Timer function processed request.');
}
}
app.timer('timerTriggerWithRetry', {
schedule: '0 */5 * * * *',
retry: {
strategy: 'fixedDelay',
delayInterval: {
seconds: 10,
},
maxRetryCount: 4,
},
handler: timerTriggerWithRetry,
});
Ezeket a tulajdonságokat újrapróbálkozási szabályzatdefiníciókon állíthatja be:
Tulajdonság | Leírás |
---|---|
stratégia | Szükséges. A használt újrapróbálkozási stratégia. Az érvényes értékek a következők: fixedDelay vagy exponentialBackoff . |
maxRetryCount | Szükséges. A függvényvégrehajtásonként engedélyezett újrapróbálkozések maximális száma.
-1 azt jelenti, hogy határozatlan időre újrapróbálkoznak. |
delayInterval | A stratégia használatakor fixedDelay az újrapróbálkozások közötti késés. Adja meg sztringként a formátumot HH:mm:ss . |
minimumInterval | A minimális újrapróbálkozás késleltetése egy stratégia használatakor exponentialBackoff . Adja meg sztringként a formátumot HH:mm:ss . |
maximumInterval | A maximális újrapróbálkozás késleltetése a stratégia használatakor exponentialBackoff . Adja meg sztringként a formátumot HH:mm:ss . |
Íme egy példa egy időzítő triggerfüggvényre, amely rögzített késleltetési újrapróbálkozási stratégiát használ:
import logging
from azure.functions import AuthLevel, Context, FunctionApp, TimerRequest
app = FunctionApp(http_auth_level=AuthLevel.ANONYMOUS)
@app.timer_trigger(schedule="*/1 * * * * *", arg_name="mytimer",
run_on_startup=False,
use_monitor=False)
@app.retry(strategy="fixed_delay", max_retry_count="3",
delay_interval="00:00:01")
def mytimer(mytimer: TimerRequest, context: Context) -> None:
logging.info(f'Current retry count: {context.retry_context.retry_count}')
if context.retry_context.retry_count == \
context.retry_context.max_retry_count:
logging.info(
f"Max retries of {context.retry_context.max_retry_count} for "
f"function {context.function_name} has been reached")
else:
raise Exception("This is a retryable exception")
Ezeket a tulajdonságokat újrapróbálkozási szabályzatdefiníciókon állíthatja be:
Tulajdonság | Leírás |
---|---|
stratégia | Szükséges. A használt újrapróbálkozási stratégia. Az érvényes értékek a következők: fixed_delay vagy exponential_backoff . |
max_retry_count | Szükséges. A függvényvégrehajtásonként engedélyezett újrapróbálkozések maximális száma.
-1 azt jelenti, hogy határozatlan időre újrapróbálkoznak. |
delay_interval | A stratégia használatakor fixed_delay az újrapróbálkozások közötti késés. Adja meg sztringként a formátumot HH:mm:ss . |
minimum_interval | A minimális újrapróbálkozás késleltetése egy stratégia használatakor exponential_backoff . Adja meg sztringként a formátumot HH:mm:ss . |
maximum_interval | A maximális újrapróbálkozás késleltetése a stratégia használatakor exponential_backoff . Adja meg sztringként a formátumot HH:mm:ss . |
@FunctionName("TimerTriggerJava1")
@FixedDelayRetry(maxRetryCount = 4, delayInterval = "00:00:10")
public void run(
@TimerTrigger(name = "timerInfo", schedule = "0 */5 * * * *") String timerInfo,
final ExecutionContext context
) {
context.getLogger().info("Java Timer trigger function executed at: " + LocalDateTime.now());
}
Kötési hibakódok
Az Azure-szolgáltatásokkal való integráció során a hibák a mögöttes szolgáltatások API-jaiból eredhetnek. A kötésspecifikus hibákra vonatkozó információk a következő cikkek "Kivételek és visszatérési kódok" szakaszában érhetők el:
- Azure Cosmos DB
- Blob Storage
- Event Grid
- Event Hubs
- IoT hub
- Értesítési központ
- Queue Storage
- Szolgáltatásbusz
- Table Storage