Bezorging en opnieuw proberen van Event Grid-berichten

Event Grid biedt duurzame levering. Er wordt geprobeerd om elk bericht ten minste één keer voor elk overeenkomend abonnement onmiddellijk af te leveren. Als het eindpunt van een abonnee de ontvangst van een gebeurtenis niet bevestigt of als er een fout optreedt, probeert Event Grid de levering opnieuw op basis van een vast schema en beleid voor opnieuw proberen. Event Grid levert standaard één gebeurtenis tegelijk aan de abonnee. De nettolading is echter een matrix met één gebeurtenis.

Notitie

Event Grid garandeert geen order voor het bezorgen van gebeurtenissen, dus abonnees kunnen deze buiten orde ontvangen.

Schema voor opnieuw proberen

Wanneer Event Grid een fout ontvangt voor een bezorgingspoging van een gebeurtenis, bepaalt Event Grid of de bezorging opnieuw moet worden geprobeerd, de gebeurtenis in een onbestelbare brief moet worden uitgevoerd of de gebeurtenis moet worden neergeteld op basis van het type fout.

Als de fout die wordt geretourneerd door het geabonneerde eindpunt een configuratiefout is die niet kan worden opgelost met nieuwe pogingen (bijvoorbeeld als het eindpunt wordt verwijderd), voert Event Grid onbestelbare berichten uit op de gebeurtenis of wordt de gebeurtenis verwijderd als dead-letter niet is geconfigureerd.

In de volgende tabel worden de typen eindpunten en fouten beschreven waarvoor geen nieuwe poging wordt uitgevoerd:

Eindpunttype Foutcodes
Azure-bronnen 400 (ongeldige aanvraag), 413 (aanvraagentiteit is te groot)
Webhook 400 (ongeldige aanvraag), 413 (aanvraagentiteit is te groot), 401 (niet geautoriseerd)

Notitie

Als dead-letter niet is geconfigureerd voor een eindpunt, worden gebeurtenissen verwijderd wanneer de bovenstaande fouten optreden. Overweeg om onbestelbare berichten te configureren als u niet wilt dat dit soort gebeurtenissen worden verwijderd. Gebeurtenissen met onbestelbare letters worden verwijderd wanneer de bestemming met een onbestelbare brief niet wordt gevonden.

Als de fout die wordt geretourneerd door het geabonneerde eindpunt niet in de bovenstaande lijst voorkomt, voert Event Grid de nieuwe poging uit met behulp van het beleid dat hieronder wordt beschreven:

Event Grid wacht 30 seconden op een antwoord na het bezorgen van een bericht. Als het eindpunt na 30 seconden nog niet heeft gereageerd, wordt het bericht in de wachtrij geplaatst voor opnieuw proberen. Event Grid maakt gebruik van een beleid voor exponentieel uitstel van nieuwe pogingen voor het bezorgen van gebeurtenissen. Event Grid probeert de levering volgens het volgende schema opnieuw uit te voeren op basis van een zo goed mogelijke inspanning:

  • 10 seconden
  • 30 seconden
  • 1 minuut
  • 5 minuten
  • 10 minuten
  • 30 minuten
  • 1 uur
  • 3 uur
  • 6 uur
  • Elke 12 uur tot 24 uur

Als het eindpunt binnen drie minuten reageert, probeert Event Grid de gebeurtenis zo goed mogelijk uit de wachtrij voor opnieuw proberen te verwijderen, maar er kunnen nog steeds duplicaten worden ontvangen.

Event Grid voegt een kleine randomisatie toe aan alle stappen voor opnieuw proberen en kan bepaalde nieuwe pogingen opportunistisch overslaan als een eindpunt consistent beschadigd is, lange tijd offline is of overweldigd lijkt te zijn.

Beleid voor opnieuw proberen

U kunt het beleid voor opnieuw proberen aanpassen bij het maken van een gebeurtenisabonnement met behulp van de volgende twee configuraties. Een gebeurtenis wordt verwijderd als een van de limieten van het beleid voor opnieuw proberen is bereikt.

  • Maximum aantal pogingen : de waarde moet een geheel getal tussen 1 en 30 zijn. De standaardwaarde is 30.
  • Time-to-live (TTL) van gebeurtenis : de waarde moet een geheel getal tussen 1 en 1440 zijn. De standaardwaarde is 1440 minuten

Zie Beleid voor opnieuw proberen instellen voor voorbeelden van CLI- en PowerShell-opdrachten voor het configureren van deze instellingen.

Notitie

Als u zowel Event time to live (TTL) als Maximum number of attemptsinstelt, gebruikt Event Grid de eerste om te bepalen wanneer de levering van gebeurtenissen moet worden gestopt. Als u bijvoorbeeld 30 minuten instelt als time-to-live (TTL) en 5 maximale bezorgingspogingen. Wanneer een gebeurtenis niet na 30 minuten (of) niet wordt geleverd na 5 pogingen, afhankelijk van wat zich het eerst voordoet, is de gebeurtenis onbestelbaar. Als u het maximum aantal bezorgingspogingen instelt op 10, met betrekking tot het exponentiële schema voor opnieuw proberen, worden maximaal 6 bezorgingspogingen uitgevoerd voordat 30 minuten TTL wordt bereikt. Daarom heeft het instellen van het maximum aantal pogingen op 10 in dit geval geen invloed en worden gebeurtenissen na 30 minuten vastgelopen.

Batchverwerking van uitvoer

Event Grid verzendt standaard elke gebeurtenis afzonderlijk naar abonnees. De abonnee ontvangt een matrix met één gebeurtenis. U kunt Event Grid configureren voor batchgebeurtenissen voor levering voor verbeterde HTTP-prestaties in scenario's met hoge doorvoer. Batchverwerking is standaard uitgeschakeld en kan per abonnement worden ingeschakeld.

Batchverwerkingsbeleid

Levering in batch heeft twee instellingen:

  • Maximum aantal gebeurtenissen per batch : het maximum aantal gebeurtenissen dat Event Grid per batch levert. Dit aantal wordt nooit overschreden, maar er kunnen minder gebeurtenissen worden geleverd als er geen andere gebeurtenissen beschikbaar zijn op het moment van publicatie. Event Grid vertraagt het maken van een batch niet als er minder gebeurtenissen beschikbaar zijn. Moet tussen 1 en 5.000 zijn.
  • Voorkeursbatchgrootte in kilobytes : doellimiet voor batchgrootte in kilobytes. Net als bij maximale gebeurtenissen kan de batchgrootte kleiner zijn als er niet meer gebeurtenissen beschikbaar zijn op het moment van publiceren. Het is mogelijk dat een batch groter is dan de gewenste batchgrootte als één gebeurtenis groter is dan de voorkeursgrootte. Als de voorkeursgrootte bijvoorbeeld 4 kB is en een gebeurtenis van 10 kB naar Event Grid wordt gepusht, wordt de gebeurtenis van 10 kB nog steeds geleverd in een eigen batch in plaats van te worden verwijderd.

Levering in batches geconfigureerd op basis van een abonnement per gebeurtenis via de portal, CLI, PowerShell of SDK's.

Batchgedrag

  • Alle of geen

    Event Grid werkt met alles-of-geen-semantiek. Het biedt geen ondersteuning voor gedeeltelijk succes van een batchlevering. Abonnees moeten ervoor zorgen dat ze slechts binnen 30 seconden vragen om zoveel gebeurtenissen per batch als ze redelijkerwijs kunnen verwerken.

  • Optimistische batchverwerking

    De beleidsinstellingen voor batchverwerking zijn niet strikt gebonden aan het batchgedrag en worden naar beste vermogen gerespecteerd. Bij lage gebeurtenissnelheden ziet u vaak dat de batchgrootte kleiner is dan het aangevraagde maximum aantal gebeurtenissen per batch.

  • De standaardwaarde is ingesteld op UIT

    Standaard voegt Event Grid slechts één gebeurtenis toe aan elke leveringsaanvraag. U kunt batchverwerking inschakelen door een van de instellingen in te stellen die eerder in het artikel in de JSON van het gebeurtenisabonnement zijn vermeld.

  • Standaardwaarden

    Het is niet nodig om zowel de instellingen op te geven (Maximale gebeurtenissen per batch als Geschatte batchgrootte in kilobytes) bij het maken van een gebeurtenisabonnement. Als er slechts één instelling is ingesteld, gebruikt Event Grid (configureerbare) standaardwaarden. Zie de volgende secties voor de standaardwaarden en hoe u deze kunt overschrijven.

Azure Portal:

U ziet deze instellingen op het tabblad Extra functies van de pagina Gebeurtenisabonnement .

Schermopname van het tabblad Extra functies van de pagina Gebeurtenisabonnement met de sectie Batching gemarkeerd.

Azure CLI

Gebruik de volgende parameters bij het maken van een gebeurtenisabonnement:

  • max-events-per-batch : maximum aantal gebeurtenissen in een batch. Moet een getal tussen 1 en 5000 zijn.
  • preferred-batch-size-in-kilobytes : voorkeursbatchgrootte in kilobytes. Moet een getal tussen 1 en 1024 zijn.
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

Zie Opslagevenementen routeren naar een webeindpunt met Azure CLI voor meer informatie over het gebruik van Azure CLI met Event Grid.

Vertraagde bezorging

Als een eindpunt bezorgingsfouten ondervindt, begint Event Grid de levering te vertragen en gebeurtenissen opnieuw naar dat eindpunt uit te proberen. Als bijvoorbeeld de eerste tien gebeurtenissen die naar een eindpunt zijn gepubliceerd, mislukken, gaat Event Grid ervan uit dat het eindpunt problemen ondervindt en worden alle volgende nieuwe pogingen en nieuwe leveringen enige tijd uitgesteld, in sommige gevallen tot enkele uren.

Het functionele doel van vertraagde levering is het beveiligen van beschadigde eindpunten en het Event Grid-systeem. Zonder uitstel en vertraging van levering aan beschadigde eindpunten, kunnen het beleid voor opnieuw proberen en de volumemogelijkheden van Event Grid een systeem gemakkelijk overbelasten.

Gebeurtenissen in onbestelbare berichten

Wanneer Event Grid een gebeurtenis niet kan leveren binnen een bepaalde periode of nadat u een bepaald aantal keren hebt geprobeerd de gebeurtenis te leveren, kan de niet-bezorgde gebeurtenis naar een opslagaccount worden verzonden. Dit proces wordt ook wel 'dead-lettering' genoemd. Event Grid is een gebeurtenis in onbestelbare letters wanneer aan een van de volgende voorwaarden wordt voldaan.

  • De gebeurtenis wordt niet geleverd binnen de time-to-live-periode .
  • Het aantal pogingen om de gebeurtenis te leveren, heeft de limiet overschreden.

Als aan een van de voorwaarden wordt voldaan, wordt de gebeurtenis verwijderd of in een impasse geplaatst. Standaard schakelt Event Grid geen onbestelbare berichten in. Als u dit wilt inschakelen, moet u een opslagaccount opgeven voor het opslaan van niet-bezorgde gebeurtenissen bij het maken van het gebeurtenisabonnement. U haalt gebeurtenissen op uit dit opslagaccount om leveringen op te lossen.

Event Grid verzendt een gebeurtenis naar de onbestelbare locatie wanneer alle nieuwe pogingen zijn geprobeerd. Als Event Grid een 400-antwoordcode (Ongeldige aanvraag) of 413 (Aanvraagentiteit te groot) ontvangt, wordt de gebeurtenis onmiddellijk gepland voor onbestelbare brieven. Deze antwoordcodes geven aan dat de levering van de gebeurtenis nooit zal lukken.

De time-to-live-vervaldatum wordt ALLEEN gecontroleerd bij de volgende geplande leveringspoging. Dus zelfs als time-to-live verloopt vóór de volgende geplande bezorgingspoging, wordt het verlopen van de gebeurtenis alleen gecontroleerd op het moment van de volgende levering en vervolgens in een onbestelbare brief.

Er is een vertraging van vijf minuten tussen de laatste poging om een gebeurtenis af te leveren en het moment waarop de gebeurtenis wordt bezorgd op de locatie met een onbestelbare brief. Deze vertraging is bedoeld om het aantal blobopslagbewerkingen te verminderen. Als de locatie voor onbestelbare berichten vier uur niet beschikbaar is, wordt de gebeurtenis verwijderd.

Voordat u de locatie voor onbestelbare berichten instelt, moet u een opslagaccount met een container hebben. U geeft het eindpunt voor deze container op bij het maken van het gebeurtenisabonnement. Het eindpunt heeft de volgende indeling: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-name>/blobServices/default/containers/<container-name>

Mogelijk wilt u een melding ontvangen wanneer een gebeurtenis is verzonden naar de locatie van de onbestelbare brief. Als u Event Grid wilt gebruiken om te reageren op niet-bezorgde gebeurtenissen, maakt u een gebeurtenisabonnement voor de blobopslag met onbestelbare berichten. Telkens wanneer uw blobopslag met onbestelbare berichten een niet-bezorgde gebeurtenis ontvangt, informeert Event Grid uw handler. De handler reageert met acties die u wilt uitvoeren voor het afstemmen van niet-bezorgde gebeurtenissen. Zie Beleid voor onbestelbare brieven en nieuwe pogingen voor een voorbeeld van het instellen van een onbestelbare locatie en beleid voor opnieuw proberen.

Notitie

Als u beheerde identiteit inschakelt voor onbestelbare berichten, moet u de beheerde identiteit toevoegen aan de juiste RBAC-rol (op rollen gebaseerd toegangsbeheer) in het Azure Storage-account dat de gebeurtenissen in onbestelbare berichten bevat. Zie Ondersteunde bestemmingen en Azure-rollen voor meer informatie.

Indelingen voor leveringsevenementen

In deze sectie vindt u voorbeelden van gebeurtenissen en gebeurtenissen met onbestelbare letters in verschillende bezorgingsschema-indelingen (Event Grid-schema, CloudEvents 1.0-schema en aangepast schema). Zie de artikelen over het Event Grid-schema en cloud events 1.0-schema voor meer informatie over deze indelingen.

Event Grid-schema

Gebeurtenis

{
    "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" }
    }
}

Gebeurtenis in onbestelbare berichten

{
    "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" 
}

Hier volgen de mogelijke waarden van lastDeliveryOutcome en de bijbehorende beschrijvingen.

LastDeliveryOutcome Beschrijving
NotFound De doelresource is niet gevonden.
Uitgeschakeld De bestemming heeft het ontvangen van gebeurtenissen uitgeschakeld. Van toepassing op Azure Service Bus en Azure Event Hubs.
Volledig Het maximum aantal toegestane bewerkingen op de bestemming is overschreden. Van toepassing op Azure Service Bus en Azure Event Hubs.
Niet geautoriseerd Doel heeft een niet-geautoriseerde antwoordcode geretourneerd.
BadRequest De bestemming heeft een ongeldige aanvraagreactiecode geretourneerd.
Verlopen Er is een time-out opgetreden voor de leveringsbewerking.
Bezet De doelserver is bezet.
PayloadTooLarge De grootte van het bericht is groter dan de maximaal toegestane grootte van de bestemming. Van toepassing op Azure Service Bus en Azure Event Hubs.
Proeftijd De bestemming wordt op proef gesteld door Event Grid. Levering wordt niet geprobeerd tijdens de proef.
Geannuleerd De leveringsbewerking is geannuleerd.
Aborted De levering is na een tijdsinterval afgebroken door Event Grid.
SocketError Er is een netwerkcommunicatiefout opgetreden tijdens de levering.
ResolutionError DNS-omzetting van doeleindpunt is mislukt.
Leveren Gebeurtenissen op de bestemming afleveren.
SessionQueueNotSupported Gebeurtenislevering zonder sessie-id wordt geprobeerd op een entiteit waarvoor sessieondersteuning is ingeschakeld. Van toepassing op Azure Service Bus entiteitsdoel.
Verboden Levering is verboden door het doeleindpunt (mogelijk vanwege IP-firewalls of andere beperkingen)
OngeldigAzureFunctionDestination De Azure-doelfunctie is niet geldig. Waarschijnlijk omdat het niet het type EventGridTrigger heeft.

LastDeliveryOutcome: Proefprobatie

Een gebeurtenisabonnement wordt door Event Grid gedurende een bepaalde periode in de proeftijd geplaatst als gebeurtenisleveringen naar die bestemming mislukken. De proeftijd verschilt voor verschillende fouten die worden geretourneerd door het doeleindpunt. Als een gebeurtenisabonnement een proefabonnement heeft, kunnen gebeurtenissen in een impasse worden geplaatst of worden verwijderd zonder zelfs maar te proberen te leveren, afhankelijk van de foutcode waardoor deze in proefabonnement is.

Fout Duur van de proefperiode
Bezet 10 seconden
NotFound 5 minuten
SocketError 30 seconden
ResolutionError 5 minuten
Uitgeschakeld 5 minuten
Volledig 5 minuten
Verlopen 10 seconden
Niet geautoriseerd 5 minuten
Verboden 5 minuten
OngeldigAzureFunctionDestination 10 minuten

Notitie

Event Grid maakt gebruik van proefabonnementsduur voor beter leveringsbeheer en de duur kan in de toekomst veranderen.

CloudEvents 1.0-schema

Gebeurtenis

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

Gebeurtenis met onbestelbare berichten

{
    "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",
}

Aangepast schema

Gebeurtenis

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

Gebeurtenis met onbestelbare berichten

{
    "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"
    }
}

Bezorgingsstatus van bericht

Event Grid gebruikt HTTP-antwoordcodes om de ontvangst van gebeurtenissen te bevestigen.

Succescodes

Event Grid beschouwt alleen de volgende HTTP-antwoordcodes als geslaagde leveringen. Alle andere statuscodes worden beschouwd als mislukte leveringen en zullen opnieuw worden geprobeerd of in een impasse worden opgeslagen. Wanneer Event Grid een geslaagde statuscode ontvangt, wordt de levering als voltooid beschouwd.

  • 200 OK
  • 201 Gemaakt
  • 202 Geaccepteerd
  • 203 Niet-bindende informatie
  • 204 Geen inhoud

Foutcodes

Alle andere codes die niet in de bovenstaande set staan (200-204) worden beschouwd als fouten en worden opnieuw geprobeerd (indien nodig). Sommigen hebben specifieke beleidsregels voor opnieuw proberen die hieronder worden beschreven, alle andere volgen het standaardmodel voor exponentieel back-off. Het is belangrijk om te onthouden dat vanwege de zeer parallelle aard van de architectuur van Event Grid het gedrag voor opnieuw proberen niet-deterministisch is.

Statuscode Gedrag voor opnieuw proberen
400 Ongeldige aanvraag Niet opnieuw geprobeerd
401 Onbevoegd Probeer het na 5 minuten of langer opnieuw voor Eindpunten van Azure-resources
403 Verboden Niet opnieuw geprobeerd
404 Niet gevonden Probeer het na 5 minuten of langer opnieuw voor Eindpunten van Azure-resources
408 Time-out van aanvraag Probeer het opnieuw na 2 minuten of langer
413 Aanvraagentiteit is te groot Niet opnieuw geprobeerd
503 Service niet beschikbaar Probeer het opnieuw na 30 seconden of meer
Alle andere Probeer het opnieuw na 10 seconden of meer

Aangepaste leveringseigenschappen

Met gebeurtenisabonnementen kunt u HTTP-headers instellen die zijn opgenomen in geleverde gebeurtenissen. Met deze mogelijkheid kunt u aangepaste headers instellen die vereist zijn voor een bestemming. U kunt maximaal 10 headers instellen bij het maken van een gebeurtenisabonnement. Elke headerwaarde mag niet groter zijn dan 4096 (4K) bytes. U kunt aangepaste headers instellen voor de gebeurtenissen die worden geleverd aan de volgende bestemmingen:

  • Webhooks
  • Azure Service Bus onderwerpen en wachtrijen
  • Azure Event Hubs
  • Hybride verbindingen doorgeven

Zie Aangepaste leveringseigenschappen voor meer informatie.

Volgende stappen