Leverans av Event Grid-meddelanden och försök igen

Event Grid tillhandahåller varaktig leverans. Den försöker leverera varje meddelande minst en gång för varje matchande prenumeration omedelbart. Om en prenumerants slutpunkt inte bekräftar mottagandet av en händelse eller om det uppstår ett fel försöker Event Grid skicka leveransen igen baserat på ett fast återförsöksschema och återförsöksprincip. Som standard levererar Event Grid en händelse i taget till prenumeranten. Nyttolasten är dock en matris med en enda händelse.

Anteckning

Event Grid garanterar inte order för händelseleverans, så prenumeranter kan ta emot dem i fel ordning.

Schema för återförsök

När Event Grid får ett fel för ett händelseleveransförsök bestämmer Event Grid om det ska försöka leverera på nytt, skriva ett obeställbart meddelande om händelsen eller släppa händelsen baserat på typen av fel.

Om felet som returneras av den prenumererade slutpunkten är ett konfigurationsrelaterat fel som inte kan åtgärdas med återförsök (till exempel om slutpunkten tas bort) utför Event Grid antingen obeställbara bokstäver på händelsen eller släpper händelsen om obeställbara bokstäver inte har konfigurerats.

I följande tabell beskrivs de typer av slutpunkter och fel för vilka återförsök inte sker:

Typ av slutpunkt Felkoder
Azure-resurser 400 (felaktig begäran), 413 (begärandeentiteten är för stor)
Webhook 400 (felaktig begäran), 413 (begärandeentiteten är för stor), 401 (obehörig)

Anteckning

Om obeställbara meddelanden inte har konfigurerats för en slutpunkt tas händelser bort när ovanstående fel inträffar. Överväg att konfigurera obeställbara meddelanden om du inte vill att den här typen av händelser ska tas bort. Händelser med obeställbara bokstäver tas bort när målet med obeställbara meddelanden inte hittas.

Om felet som returneras av den prenumererade slutpunkten inte finns med i listan ovan utför Event Grid återförsöket med hjälp av principen som beskrivs nedan:

Event Grid väntar 30 sekunder på ett svar när ett meddelande har levererats. Om slutpunkten inte har svarat efter 30 sekunder placeras meddelandet i kö för återförsök. Event Grid använder en återförsöksprincip för exponentiell backoff för händelseleverans. Event Grid försöker skicka leveransen på nytt enligt följande schema efter bästa förmåga:

  • 10 sekunder
  • 30 sekunder
  • 1 minut
  • 5 minuter
  • 10 minuter
  • 30 minuter
  • 1 timme
  • 3 timmar
  • 6 timmar
  • Var 12:e timme upp till 24 timmar

Om slutpunkten svarar inom 3 minuter försöker Event Grid ta bort händelsen från kön för återförsök på bästa sätt, men dubbletter kan fortfarande tas emot.

Event Grid lägger till en liten slumpmässighet i alla återförsökssteg och kan opportunistiskt hoppa över vissa återförsök om en slutpunkt är konsekvent felfri, nere under en lång period eller verkar vara överbelastad.

Återförsöksprincip

Du kan anpassa återförsöksprincipen när du skapar en händelseprenumeration med hjälp av följande två konfigurationer. En händelse tas bort om någon av gränserna för återförsöksprincipen nås.

  • Maximalt antal försök – Värdet måste vara ett heltal mellan 1 och 30. Standardvärdet är 30.
  • Händelsetid till live (TTL) – Värdet måste vara ett heltal mellan 1 och 1440. Standardvärdet är 1440 minuter

Exempelkommandot CLI och PowerShell för att konfigurera de här inställningarna finns i Ange återförsöksprincip.

Anteckning

Om du anger både Event time to live (TTL) och Maximum number of attemptsanvänder Event Grid den första för att upphöra att gälla för att avgöra när händelseleveransen ska stoppas. Om du till exempel anger 30 minuter som TTL (time-to-live) och 5 maximala leveransförsök. När en händelse inte levereras efter 30 minuter (eller) inte levereras efter 5 försök, beroende på vilket som inträffar först, är händelsen obeställd. Om du anger maximalt antal leveransförsök till 10, med avseende på exponentiellt återförsöksschema, har maximalt 6 antal leveransförsök inträffat innan 30 minuter kommer TTL att nås, och därför har det maximala antalet försök till 10 ingen inverkan i det här fallet och händelser kommer att vara obemärkta efter 30 minuter.

Batchbearbetning av utdata

Event Grid skickar som standard varje händelse individuellt till prenumeranter. Prenumeranten tar emot en matris med en enda händelse. Du kan konfigurera Event Grid till batchhändelser för leverans för bättre HTTP-prestanda i scenarier med högt dataflöde. Batchbearbetning är inaktiverat som standard och kan aktiveras per prenumeration.

Batchbearbetningsprincip

Batchleverans har två inställningar:

  • Maximalt antal händelser per batch – Maximalt antal händelser som Event Grid levererar per batch. Det här antalet kommer aldrig att överskridas, men färre händelser kan levereras om inga andra händelser är tillgängliga vid publiceringstillfället. Event Grid fördröjer inte händelser för att skapa en batch om färre händelser är tillgängliga. Måste vara mellan 1 och 5 000.
  • Önskad batchstorlek i kilobyte – Måltak för batchstorlek i kilobyte. Precis som med maxhändelser kan batchstorleken vara mindre om fler händelser inte är tillgängliga vid tidpunkten för publiceringen. Det är möjligt att en batch är större än den önskade batchstorleken om en enskild händelse är större än önskad storlek. Om den önskade storleken till exempel är 4 kB och en händelse på 10 KB skickas till Event Grid, kommer händelsen på 10 KB fortfarande att levereras i sin egen batch i stället för att tas bort.

Batchleverans i konfigurerad per händelse-prenumeration via portalen, CLI, PowerShell eller SDK:er.

Batchbearbetningsbeteende

  • Alla eller inga

    Event Grid fungerar med all-or-none-semantik. Det stöder inte delvis lyckad batchleverans. Prenumeranter bör vara noga med att bara be om så många händelser per batch som de rimligen kan hantera på 30 sekunder.

  • Optimistisk batchbearbetning

    Inställningarna för batchbearbetningsprinciper är inte strikta gränser för batchbearbetningsbeteendet och respekteras på bästa sätt. Med låga händelsefrekvenser ser du ofta att batchstorleken är mindre än de begärda maximala händelserna per batch.

  • Standardinställningen är AV

    Som standard lägger Event Grid bara till en händelse i varje leveransbegäran. Sättet att aktivera batchbearbetning är att ange någon av inställningarna som nämndes tidigare i artikeln i händelseprenumerationens JSON.

  • Standardvärden

    Du behöver inte ange båda inställningarna (Maximalt antal händelser per batch och Ungefärlig batchstorlek i kilobyte) när du skapar en händelseprenumeration. Om endast en inställning har angetts använder Event Grid (konfigurerbara) standardvärden. Se följande avsnitt för standardvärdena och hur du åsidosätter dem.

Azure Portal:

De här inställningarna visas på fliken Ytterligare funktioner på sidan Händelseprenumeration .

Skärmbild som visar fliken Ytterligare funktioner på sidan Händelseprenumeration med avsnittet Batching markerat.

Azure CLI

När du skapar en händelseprenumeration använder du följande parametrar:

  • max-events-per-batch – Maximalt antal händelser i en batch. Måste vara ett tal mellan 1 och 5 000.
  • preferred-batch-size-in-kilobytes – Önskad batchstorlek i kilobyte. Måste vara ett tal mellan 1 och 1024.
storageid=$(az storage account show --name <storage_account_name> --resource-group <resource_group_name> --query id --output tsv)
endpoint=https://$sitename.azurewebsites.net/api/updates

az eventgrid event-subscription create \
  --resource-id $storageid \
  --name <event_subscription_name> \
  --endpoint $endpoint \
  --max-events-per-batch 1000 \
  --preferred-batch-size-in-kilobytes 512

Mer information om hur du använder Azure CLI med Event Grid finns i Dirigera lagringshändelser till webbslutpunkt med Azure CLI.

Fördröjd leverans

När en slutpunkt upplever leveransfel börjar Event Grid fördröja leveransen och återförsöket av händelser till slutpunkten. Om till exempel de första 10 händelserna som publiceras till en slutpunkt misslyckas förutsätter Event Grid att slutpunkten har problem och fördröjer alla efterföljande återförsök och nya leveranser under en tid – i vissa fall upp till flera timmar.

Det funktionella syftet med fördröjd leverans är att skydda felaktiga slutpunkter och Event Grid-systemet. Utan back-off och fördröjning av leverans till felaktiga slutpunkter kan Event Grids återförsöksprincip och volymfunktioner enkelt överbelasta ett system.

Händelser med obeställbara meddelanden

När Event Grid inte kan leverera en händelse inom en viss tidsperiod eller efter att ha försökt leverera händelsen ett visst antal gånger, kan den skicka händelsen som inte har skickats till ett lagringskonto. Den här processen kallas för obeställbara bokstäver. Event Grid obeställbart märker en händelse när något av följande villkor uppfylls.

  • Händelsen levereras inte inom tid till live-perioden .
  • Antalet försök att leverera händelsen har överskridit gränsen.

Om något av villkoren uppfylls släpps eller obeställs händelsen. Som standard aktiveras inte obeställbara meddelanden i Event Grid. Om du vill aktivera det måste du ange ett lagringskonto för att lagra händelser som inte har levererats när du skapar händelseprenumerationen. Du hämtar händelser från det här lagringskontot för att lösa leveranser.

Event Grid skickar en händelse till platsen med obeställbara meddelanden när den har provat alla sina återförsök. Om Event Grid tar emot svarskoden 400 (felaktig begäran) eller 413 (begärandeentiteten är för stor) schemalägger den omedelbart händelsen för obeställbara meddelanden. Dessa svarskoder anger att leveransen av händelsen aldrig kommer att lyckas.

Time to Live-förfallodatumet kontrolleras ENDAST vid nästa schemalagda leveransförsök. Så även om time-to-live upphör att gälla före nästa schemalagda leveransförsök kontrolleras händelseförfallodatum endast vid tidpunkten för nästa leverans och sedan obeställbara meddelanden.

Det finns en fördröjning på fem minuter mellan det senaste försöket att leverera en händelse och när den levereras till platsen med obeställbara meddelanden. Den här fördröjningen är avsedd att minska antalet bloblagringsåtgärder. Om obeställbara platser inte är tillgängliga i fyra timmar tas händelsen bort.

Innan du anger obeställbara platser måste du ha ett lagringskonto med en container. Du anger slutpunkten för den här containern när du skapar händelseprenumerationen. Slutpunkten har följande format: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-name>/blobServices/default/containers/<container-name>

Du kanske vill bli meddelad när en händelse har skickats till platsen för obeställbara meddelanden. Om du vill använda Event Grid för att svara på händelser som inte har levererats skapar du en händelseprenumeration för bloblagringen med obeställbara meddelanden. Varje gång bloblagringen med obeställbara meddelanden tar emot en händelse som inte har levererats meddelar Event Grid din hanterare. Hanteraren svarar med åtgärder som du vill vidta för att stämma av händelser som inte har levererats. Ett exempel på hur du konfigurerar en plats med obeställbara meddelanden och återförsöksprinciper finns i Principer för obeställbara meddelanden och återförsök.

Anteckning

Om du aktiverar hanterad identitet för obeställbara meddelanden måste du lägga till den hanterade identiteten i lämplig rollbaserad åtkomstkontrollroll (RBAC) på Det Azure Storage-konto som ska innehålla obeställbara händelser. Mer information finns i Mål som stöds och Azure-roller.

Leveranshändelseformat

Det här avsnittet innehåller exempel på händelser och händelser med obeställbara meddelanden i olika leveransschemaformat (Event Grid-schema, CloudEvents 1.0-schema och anpassat schema). Mer information om dessa format finns i schemaartiklarna Event Grid-schema och Cloud Events 1.0-schema .

Event Grid-schema

Händelse

{
    "id": "93902694-901e-008f-6f95-7153a806873c",
    "eventTime": "2020-08-13T17:18:13.1647262Z",
    "eventType": "Microsoft.Storage.BlobCreated",
    "dataVersion": "",
    "metadataVersion": "1",
    "topic": "/subscriptions/000000000-0000-0000-0000-00000000000000/resourceGroups/rgwithoutpolicy/providers/Microsoft.Storage/storageAccounts/myegteststgfoo",
    "subject": "/blobServices/default/containers/deadletter/blobs/myBlobFile.txt",    
    "data": {
        "api": "PutBlob",
        "clientRequestId": "c0d879ad-88c8-4bbe-8774-d65888dc2038",
        "requestId": "93902694-901e-008f-6f95-7153a8000000",
        "eTag": "0x8D83FACDC0C3402",
        "contentType": "text/plain",
        "contentLength": 0,
        "blobType": "BlockBlob",
        "url": "https://myegteststgfoo.blob.core.windows.net/deadletter/myBlobFile.txt",
        "sequencer": "00000000000000000000000000015508000000000005101c",
        "storageDiagnostics": { "batchId": "cfb32f79-3006-0010-0095-711faa000000" }
    }
}

Händelse med obeställbara meddelanden

{
    "id": "93902694-901e-008f-6f95-7153a806873c",
    "eventTime": "2020-08-13T17:18:13.1647262Z",
    "eventType": "Microsoft.Storage.BlobCreated",
    "dataVersion": "",
    "metadataVersion": "1",
    "topic": "/subscriptions/0000000000-0000-0000-0000-000000000000000/resourceGroups/rgwithoutpolicy/providers/Microsoft.Storage/storageAccounts/myegteststgfoo",
    "subject": "/blobServices/default/containers/deadletter/blobs/myBlobFile.txt",    
    "data": {
        "api": "PutBlob",
        "clientRequestId": "c0d879ad-88c8-4bbe-8774-d65888dc2038",
        "requestId": "93902694-901e-008f-6f95-7153a8000000",
        "eTag": "0x8D83FACDC0C3402",
        "contentType": "text/plain",
        "contentLength": 0,
        "blobType": "BlockBlob",
        "url": "https://myegteststgfoo.blob.core.windows.net/deadletter/myBlobFile.txt",
        "sequencer": "00000000000000000000000000015508000000000005101c",
        "storageDiagnostics": { "batchId": "cfb32f79-3006-0010-0095-711faa000000" }
    },

    "deadLetterReason": "MaxDeliveryAttemptsExceeded",
    "deliveryAttempts": 1,
    "lastDeliveryOutcome": "NotFound",
    "publishTime": "2020-08-13T17:18:14.0265758Z",
    "lastDeliveryAttemptTime": "2020-08-13T17:18:14.0465788Z" 
}

Här är de möjliga värdena lastDeliveryOutcome för och deras beskrivningar.

LastDeliveryOutcome Beskrivning
NotFound Målresursen hittades inte.
Inaktiverad Målet har inaktiverat mottagandet av händelser. Gäller för Azure Service Bus och Azure Event Hubs.
Fullständig Det maximala antalet tillåtna åtgärder på målet överskreds. Gäller för Azure Service Bus och Azure Event Hubs.
Behörighet saknas Målet returnerade obehörig svarskod.
BadRequest Målet returnerade felaktig svarskod för begäran.
Tidsgräns Tidsgränsen för leveransåtgärden övers.
Upptagen Målservern är upptagen.
PayloadTooLarge Meddelandets storlek överskred den maximala tillåtna storleken för målet. Gäller för Azure Service Bus och Azure Event Hubs.
Skyddstillsyn Målet sätts i skyddstillsyn av Event Grid. Leveransen försöks inte under skyddstillsyn.
Avbrutna Leveransåtgärden avbröts.
Avbruten Leveransen avbröts av Event Grid efter ett tidsintervall.
SocketError Nätverkskommunikationsfel uppstod under leveransen.
ResolutionError DNS-matchningen för målslutpunkten misslyckades.
Leverera Leverera händelser till målet.
SessionQueueNotSupported Händelseleverans utan sessions-ID görs på en entitet som har sessionsstöd aktiverat. Gäller för Azure Service Bus entitetsmål.
Förbjudet Leverans är förbjuden av målslutpunkten (kan bero på IP-brandväggar eller andra begränsningar)
OgiltigAzureFunctionDestination Azure-målfunktionen är inte giltig. Förmodligen för att den inte har typen EventGridTrigger.

LastDeliveryOutcome: Skyddstillsyn

En händelseprenumeration sätts i skyddstillsyn under en period av Event Grid om händelseleveranserna till det målet börjar misslyckas. Övervakningstiden skiljer sig åt för olika fel som returneras av målslutpunkten. Om en händelseprenumeration är under skyddstillsyn kan händelser bli obeställbara eller tas bort utan att ens försöka leverera beroende på felkoden som den är under skyddstillsyn på.

Fel Varaktighet för skyddstillsyn
Upptagen 10 sekunder
NotFound 5 minuter
SocketError 30 sekunder
ResolutionError 5 minuter
Inaktiverad 5 minuter
Fullständig 5 minuter
Tidsgräns 10 sekunder
Behörighet saknas 5 minuter
Förbjudet 5 minuter
OgiltigAzureFunctionDestination 10 minuter

Anteckning

Event Grid använder prövotid för bättre leveranshantering och varaktigheten kan komma att ändras i framtiden.

CloudEvents 1.0-schema

Händelse

{
    "id": "caee971c-3ca0-4254-8f99-1395b394588e",
    "source": "mysource",
    "dataversion": "1.0",
    "subject": "mySubject",
    "type": "fooEventType",
    "datacontenttype": "application/json",
    "data": {
        "prop1": "value1",
        "prop2": 5
    }
}

Händelse med obeställbara bokstäver

{
    "id": "caee971c-3ca0-4254-8f99-1395b394588e",
    "source": "mysource",
    "dataversion": "1.0",
    "subject": "mySubject",
    "type": "fooEventType",
    "datacontenttype": "application/json",
    "data": {
        "prop1": "value1",
        "prop2": 5
    },

    "deadletterreason": "MaxDeliveryAttemptsExceeded",
    "deliveryattempts": 1,
    "lastdeliveryoutcome": "NotFound",
    "publishtime": "2020-08-13T21:21:36.4018726Z",
}

Anpassat schema

Händelse

{
    "prop1": "my property",
    "prop2": 5,
    "myEventType": "fooEventType"
}

Händelse med obeställbara bokstäver

{
    "id": "8bc07e6f-0885-4729-90e4-7c3f052bd754",
    "eventTime": "2020-08-13T18:11:29.4121391Z",
    "eventType": "myEventType",
    "dataVersion": "1.0",
    "metadataVersion": "1",
    "topic": "/subscriptions/00000000000-0000-0000-0000-000000000000000/resourceGroups/rgwithoutpolicy/providers/Microsoft.EventGrid/topics/myCustomSchemaTopic",
    "subject": "subjectDefault",
  
    "deadLetterReason": "MaxDeliveryAttemptsExceeded",
    "deliveryAttempts": 1,
    "lastDeliveryOutcome": "NotFound",
    "publishTime": "2020-08-13T18:11:29.4121391Z",
    "lastDeliveryAttemptTime": "2020-08-13T18:11:29.4277644Z",
  
    "data": {
        "prop1": "my property",
        "prop2": 5,
        "myEventType": "fooEventType"
    }
}

Meddelandeleveransstatus

Event Grid använder HTTP-svarskoder för att bekräfta mottagandet av händelser.

Lyckade koder

Event Grid betraktar endast följande HTTP-svarskoder som lyckade leveranser. Alla andra statuskoder betraktas som misslyckade leveranser och kommer att försökas igen eller deadlettered efter behov. När Event Grid tar emot en lyckad statuskod anses leveransen vara klar.

  • 200 OK
  • Skapad 201
  • 202 accepterad
  • 203 Icke-auktoritativ information
  • 204 Inget innehåll

Felkoder

Alla andra koder som inte finns i ovanstående uppsättning (200–204) betraktas som fel och kommer att försökas igen (om det behövs). Vissa har specifika återförsöksprinciper som är kopplade till dem som beskrivs nedan, och alla andra följer standardmodellen för exponentiell säkerhetskopiering. Det är viktigt att komma ihåg att på grund av den mycket parallelliserade karaktären hos Event Grids arkitektur är återförsöksbeteendet icke-deterministiskt.

Statuskod Återförsöksbeteende
400 Felaktig begäran Försök inte igen
401 – Ej behörig Försök igen efter 5 minuter eller mer för Azure Resources-slutpunkter
403 – Förbjuden Försök inte igen
404 – Hittades inte Försök igen efter 5 minuter eller mer för Azure Resources-slutpunkter
408 Timeout för begäran Försök igen efter 2 minuter eller mer
413 Begärandeentiteten är för stor Försök inte igen
503 Tjänsten är inte tillgänglig Försök igen efter 30 sekunder eller mer
Alla andra Försök igen efter 10 sekunder eller mer

Anpassade leveransegenskaper

Med händelseprenumerationer kan du konfigurera HTTP-huvuden som ingår i levererade händelser. Med den här funktionen kan du ange anpassade rubriker som krävs av ett mål. Du kan konfigurera upp till 10 rubriker när du skapar en händelseprenumeration. Varje rubrikvärde får inte vara större än 4 096 byte (4 000). Du kan ange anpassade rubriker för de händelser som levereras till följande mål:

  • Webhooks
  • Azure Service Bus ämnen och köer
  • Azure Event Hubs
  • Relähybridanslutningar

Mer information finns i Anpassade leveransegenskaper.

Nästa steg