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.
Kommentar
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 igen, ta bort händelsen utan bokstav 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 meddelanden 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) |
Kommentar
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 meddelanden släpps 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 leverera på nytt enligt följande schema efter bästa förmåga:
- 10 sekund
- 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 återförsökskö 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 inte felfri, nere under en längre 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 har nåtts.
- 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 1 440 minuter
Exempelkommandot CLI och PowerShell för att konfigurera de här inställningarna finns i Ange återförsöksprincip.
Kommentar
Om du anger både Event time to live (TTL)
och Maximum number of attempts
anvä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, kommer maximalt 6 antal leveransförsök att ske innan 30 minuter TTL uppnås, och därför kommer maximalt antal försök att vara 10 inte att påverkas i det här fallet och händelserna 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 enskild 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 tidpunkten för publiceringen. 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. På samma sätt som 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 önskad batchstorlek om en enskild händelse är större än önskad storlek. Om den önskade storleken till exempel är 4 KB och en 10 KB-händelse skickas till Event Grid, levereras 10 KB-händelsen fortfarande i sin egen batch i stället för att tas bort.
Batchbaserad leverans 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. Den 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
Principinställningarna för batchbearbetning är inte strikta gränser för batchbearbetningsbeteendet och respekteras på bästa sätt. Vid låga händelsefrekvenser ser du ofta att batchstorleken är mindre än de begärda maximala händelserna per batch.
Standardvärdet är INSTÄLLT PÅ 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ämns 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:
Du ser de här inställningarna på fliken Ytterligare funktioner på sidan Händelseprenumeration.
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 webbslutpunkten med Azure CLI.
Fördröjd leverans
När en slutpunkt upplever leveransfel börjar Event Grid fördröja leveransen och försöka igen för händelser till slutpunkten. Om till exempel de första 10 händelserna som publicerats 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 felfria 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 bokstäver
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 levererats till ett lagringskonto. Den här processen kallas för "dead-lettering". Event Grid-dödbokstäver en händelse när något av följande villkor uppfylls.
- Händelsen levereras inte inom tidsperioden.
- Antalet försök att leverera händelsen har överskridit gränsen.
Om något av villkoren uppfylls tas händelsen bort eller skrivs med obeställbara bokstäver. Som standard aktiveras inte obeställbara bokstäver 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 en svarskod på 400 (felaktig begäran) eller 413 (begärandeentiteten är för stor) schemalägger den omedelbart händelsen för obeställbar bokstav. 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 därefter 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 Blob Storage-åtgärder. Om platsen med obeställbara meddelanden inte är tillgänglig i fyra timmar tas händelsen bort.
Innan du anger platsen för obeställbara bokstäver 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 är i formatet: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-name>/blobServices/default/containers/<container-name>
Du kanske vill få ett meddelande 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 bokstäver. 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 förena händelser som inte har levererats. Ett exempel på hur du konfigurerar en plats med obeställbara bokstäver och återförsöksprinciper finns i Principer för obeställbara brev och återförsök.
Kommentar
Om du aktiverar hanterad identitet för obeställbara bokstäver måste du lägga till den hanterade identiteten till rätt rollbaserad åtkomstkontrollroll (RBAC) på Azure Storage-kontot som innehåller händelser med obeställbara bokstäver. 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 bokstäver 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.0.
Event Grid-schema
Event
{
"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 bokstäver
{
"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 | Överskred maximalt antal tillåtna åtgärder på målet. Gäller för Azure Service Bus och Azure Event Hubs. |
Behörighet saknas | Målet returnerade otillåten svarskod. |
BadRequest | Målet returnerade svarskoden för felaktig begäran. |
TimedOut | Tidsgränsen för leveransåtgärden gick ut. |
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. Leveransförsök görs inte under skyddstillsyn. |
Avbruten | Leveransåtgärden avbröts. |
Avbröts | Leveransen avbröts av Event Grid efter ett tidsintervall. |
SocketError | Nätverkskommunikationsfel uppstod under leveransen. |
ResolutionError | DNS-matchningen av 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 målet börjar misslyckas. Skyddstillsynstiden 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 borttagna utan att ens försöka leverera beroende på felkoden på grund av vilken den är under skyddstillsyn.
Fel | Varaktighet för skyddstillsyn |
---|---|
Upptagen | 10 sekund |
NotFound | 5 minuter |
SocketError | 30 sekunder |
ResolutionError | 5 minuter |
Inaktiverad | 5 minuter |
Fullständig | 5 minuter |
TimedOut | 10 sekund |
Behörighet saknas | 5 minuter |
Förbjudet | 5 minuter |
OgiltigAzureFunctionDestination | 10 minuter |
Kommentar
Event Grid använder prövotid för bättre leveranshantering och varaktigheten kan ändras i framtiden.
CloudEvents 1.0-schema
Event
{
"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
Event
{
"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"
}
}
Status för meddelandeleverans
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
- 201 Skapad
- 202 Accepterad
- 203 Icke-auktoritativ information
- 204 inget innehåll
Felkoder
Alla andra koder som inte finns i uppsättningen (200–204) betraktas som fel och kommer att försökas igen (om det behövs). Vissa har specifika återförsöksprinciper knutna till dem som beskrivs här, 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 | Beteende för återförsök |
---|---|
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-resursers slutpunkter |
403 – Förbjuden | Försök inte igen |
404 – Hittades inte | Försök igen efter 5 minuter eller mer för Azure-resursers 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 huvuden 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:
- Webhook
- Ämnen och köer i Azure Service Bus
- Azure Event Hubs
- Relay Hybrid-anslutningar
Mer information finns i Anpassade leveransegenskaper.
Nästa steg
- Information om hur du visar status för händelseleveranser finns i Övervaka Event Grid-meddelandeleverans.
- Information om hur du anpassar alternativ för händelseleverans finns i Principer för obeställbara meddelanden och återförsök.