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
Ha ez a funkció általánosan elérhetővé válik, eltávolítjuk az újrapróbálkozási szabályzat támogatását a futtatókörnyezetben az Időzítő, a Kafka és az Event Hubs kivételével. 2022 decemberében az előzetes verzió újrapróbálkozó házirend-támogatása az Időzítő és az Event Hubs kivételével minden eseményindító esetében el lett távolítva. További információ: Újrapróbálkozás szakasz.
Hibák kezelése
Az Azure-függvényekben előforduló hibák az alábbiak bármelyikéből eredhetnek:
- Beépített Azure Functions-eseményindítók és kötések használata
- Az alapul szolgáló Azure-szolgáltatások API-jainak hívásai
- REST-végpontokra irányuló hívások
- Ügyfélkódtárakra, csomagokra vagy külső API-kra irányuló hívások
Az adatvesztés vagy az elmulasztott üzenetek elkerülése érdekében fontos a helyes hibakezelés gyakorlata. Ez a szakasz néhány ajánlott hibakezelési eljárást ismertet, és további információkra mutató hivatkozásokat tartalmaz.
Az Application Insights engedélyezése
Az Azure Functions integrálható az Application Elemzések szolgáltatással a hibaadatok, a teljesítményadatok és a futásidejű naplók gyűjtéséhez. Az Application Elemzések 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 újrapróbálkozás stratégiájának megtervezve
Számos Functions-kötésbővítmény nyújt beépített támogatást az újrapróbálkozásokhoz. Emellett a futtatókörnyezet lehetővé teszi újrapróbálkozási szabályzatok meghatározását az Időzítő, a Kafka és az Event Hubs által aktivált függvényekhez. További információ: Újrapróbálkozás. Az újrapróbálkozási viselkedést nem biztosító eseményindítók esetében érdemes lehet saját újrapróbálkozási sémát implementálni.
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.
Ú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 |
Azure Blob Storage | Kötésbővítmény | host.json |
Azure Event Grid | Kötésbővítmény | Esemény-előfizetés |
Azure-eseményközpontok | Újrapróbálkozás szabályzatai | Függvényszint |
Azure Queue Storage | Kötésbővítmény | host.json |
RabbitMQ | Kötésbővítmény | Kézbesítetlen levelek üzenetsora |
Azure Service Bus | Kötésbővítmény | Kézbesítetlen levelek üzenetsora |
Időzítő | Újrapróbálkozás szabályzatai | Függvényszint |
Kafka | Újrapróbálkozás szabályzatai | Függvényszint |
Újrapróbálkozási szabályzatok
Az Azure Functions-futtatókörnyezet 3.x verziójától kezdve definiálhat újrapróbálkozási szabályzatokat az Időzítő, a Kafka, az Event Hubs és az Azure Cosmos DB-eseményindítókhoz, amelyeket a Functions-futtatókörnyezet kényszerít.
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ásokra vonatkozó szabályzat akkor lesz kiértékelve, ha egy Időzítő, Kafka, Event Hubs vagy Azure Cosmos DB által aktivált függvény váratlan kivételt eredményez. Ajánlott eljárásként minden kivételt ki kell szűrnie a kódból, és újra kell tapasztalnia az újrapróbálkozást eredményező hibákat.
Fontos
Az Event Hubs ellenőrzőpontjai csak akkor lesznek megírva, ha a végrehajtás újrapróbálkozási szabályzata befejeződött. Emiatt a folyamat az adott partíción szünetel, amíg az aktuális köteg be nem fejeződik.
Az Event Hubs v5 bővítmény 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óért tekintse meg a clientRetryOptions
host.json fájl Event Hubs szakaszát.
Ú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.
Ú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 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 . |
A function.json fájlban az újrapróbálkozás szabályzata a következő :
{
"disabled": false,
"bindings": [
{
....
}
],
"retry": {
"strategy": "fixedDelay",
"maxRetryCount": 4,
"delayInterval": "00:00:10"
}
}
function.json 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 Python-minta, amely az újrapróbálkozás kontextusát használja egy függvényben:
import azure.functions
import logging
def main(mytimer: azure.functions.TimerRequest, context: azure.functions.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.warn(
f"Max retries of {context.retry_context.max_retry_count} for "
f"function {context.function_name} has been reached")
@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