Distribution et nouvelle tentative de distribution de messages avec Azure GridEvent Grid message delivery and retry

Cet article décrit comment Azure Event Grid gère les événements en l’absence d’accusé de réception d’une distribution.This article describes how Azure Event Grid handles events when delivery isn't acknowledged.

Event Grid assure une distribution fiable.Event Grid provides durable delivery. Il distribue chaque message au moins une fois pour chaque abonnement.It delivers each message at least once for each subscription. Les événements sont envoyés immédiatement au point de terminaison inscrit de chaque abonnement.Events are sent to the registered endpoint of each subscription immediately. Si un point de terminaison n’accuse pas réception d’un événement, Event Grid effectue une nouvelle tentative de distribution.If an endpoint doesn't acknowledge receipt of an event, Event Grid retries delivery of the event.

Notes

Event Grid ne garantit pas l’ordre de distribution des événements, de sorte que l’abonné peut les recevoir dans le désordre.Event Grid doesn't guarantee order for event delivery, so subscriber may receive them out of order.

Livraison d’événements par lotBatched event delivery

Par défaut, Event Grid envoie chaque événement individuellement aux abonnés.Event Grid defaults to sending each event individually to subscribers. L’abonné reçoit un tableau ne comprenant qu’un seul événement.The subscriber receives an array with a single event. Vous pouvez configurer Event Grid pour que les événements soient livrés par lot afin d’améliorer les performances HTTP dans les scénarios à débit élevé.You can configure Event Grid to batch events for delivery for improved HTTP performance in high-throughput scenarios.

La livraison par lot a deux paramètres :Batched delivery has two settings:

  • Nombre maximum d’événements par lot : nombre maximum d’événements qu’Event Grid livrera par lot.Max events per batch - Maximum number of events Event Grid will deliver per batch. Ce nombre ne sera jamais dépassé, mais moins d’événements peuvent être livrés si aucun autre événement n’est disponible au moment de la publication.This number will never be exceeded, however fewer events may be delivered if no other events are available at the time of publish. Event Grid ne retarde pas la livraison des événements pour créer un lot si moins d’événements sont disponibles.Event Grid does not delay events in order to create a batch if fewer events are available. Doit être compris entre 1 et 5 000.Must be between 1 and 5,000.
  • Taille de lot préférée en kilo-octets : plafond cible pour la taille de lot en kilo-octets.Preferred batch size in kilobytes - Target ceiling for batch size in kilobytes. Comme pour le nombre maximum d’événements, la taille du lot peut être plus petite si aucun autre événement n’est disponible au moment de la publication.Similar to max events, the batch size may be smaller if more events are not available at the time of publish. Il est possible qu’un lot soit plus grand que la taille de lot préférée si un événement unique est plus volumineux que la taille préférée.It is possible that a batch is larger than the preferred batch size if a single event is larger than the preferred size. Par exemple, si la taille préférée est de 4 Ko et qu’un événement de 10 Ko est envoyé (push) à Event Grid, l’événement de 10 Ko sera tout de même livré dans son propre lot plutôt que d’être abandonné.For example, if the preferred size is 4 KB and a 10-KB event is pushed to Event Grid, the 10-KB event will still be delivered in its own batch rather than being dropped.

La livraison en lot est configurée sur la base d’un abonnement par événement via le portail, l’interface CLI, PowerShell ou les Kits de développement logiciel (SDK).Batched delivery in configured on a per-event subscription basis via the portal, CLI, PowerShell, or SDKs.

Portail Azure :Azure portal:

Paramètres de livraison en lot

Azure CLIAzure CLI

Lorsque vous créez un abonnement aux événements, utilisez les paramètres suivants :When creating an event subscription, use the following parameters:

  • max-events-per-batch : nombre maximum d’événements dans un lot.max-events-per-batch - Maximum number of events in a batch. Doit être un nombre compris entre 1 et 5000.Must be a number between 1 and 5000.
  • preferred-batch-size-in-kilobytes  taille de lot préférée en kilo-octets.preferred-batch-size-in-kilobytes - Preferred batch size in kilobytes. Doit être un nombre compris entre 1 et 1024.Must be a number between 1 and 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

Pour plus d’informations sur l’utilisation d’Azure CLI avec Event Grid, consultez Acheminer des événements de stockage vers un point de terminaison web avec Azure CLI.For more information on using Azure CLI with Event Grid, see Route storage events to web endpoint with Azure CLI.

Planification d’un nouvel essai et duréeRetry schedule and duration

Quand EventGrid reçoit une erreur lors d’une tentative de remise d’événement, EventGrid décide s’il doit retenter la remise ou mettre l’événement dans la file d’attente de lettres mortes ou supprimer l’événement en fonction du type d’erreur.When EventGrid receives an error for an event delivery attempt, EventGrid decides whether it should retry the delivery or dead-letter or drop the event based on the type of the error.

Si l’erreur retournée par le point de terminaison abonné est liée à la configuration et ne peut pas être corrigée avec des nouvelles tentatives (par exemple, si le point de terminaison est supprimé), Event Grid met l’événement dans la file d’attente de lettres mortes ou supprime l’événement si la file d’attente de lettres mortes n’est pas configurée.If the error returned by the subscribed endpoint is configuration related error that can't be fixed with retries (for example, if the endpoint is deleted), EventGrid will either perform dead lettering the event or drop the event if dead letter is not configured.

Voici les types de points de terminaison pour lesquels aucune nouvelle tentative ne se produit :Following are the types of endpoints for which retry doesn't happen:

Type de point de terminaisonEndpoint Type Codes d’erreurError codes
Ressources AzureAzure Resources 400 Requête incorrecte, 413 Entité de la requête trop grande, 403 Interdit400 Bad Request, 413 Request Entity Too Large, 403 Forbidden
webhookWebhook 400 Requête incorrecte, 413 Entité de la requête trop grande, 403 Interdit, 404 Introuvable, 401 Non autorisé400 Bad Request, 413 Request Entity Too Large, 403 Forbidden, 404 Not Found, 401 Unauthorized

Notes

Si la file d’attente de lettres mortes n’est pas configurée pour le point de terminaison, les événements sont supprimés lorsque les erreurs ci-dessus se produisent.If Dead-Letter is not configured for endpoint, events will be dropped when above errors happen. Envisagez de configurer la file d’attente de lettres mortes si vous ne souhaitez pas que ces types d’événements soient supprimés.Consider configuring Dead-Letter, if you don't want these kinds of events to be dropped.

Si l’erreur retournée par le point de terminaison abonné ne figure pas dans la liste ci-dessus, EventGrid effectue la nouvelle tentative à l’aide des stratégies décrites ci-dessous :If the error returned by the subscribed endpoint is not among the above list, EventGrid performs the retry using policies described below:

Event Grid attend une réponse pendant 30 secondes après la distribution d’un message.Event Grid waits 30 seconds for a response after delivering a message. Après 30 secondes, si le point de terminaison n’a pas répondu, le message est mis en file d’attente en vue d’une nouvelle tentative.After 30 seconds, if the endpoint hasn’t responded, the message is queued for retry. Event Grid utilise une stratégie de nouvelle tentative d’interruption exponentielle pour la distribution des événements.Event Grid uses an exponential backoff retry policy for event delivery. Dans la mesure du possible, Event Grid tente une nouvelle livraison selon la planification suivante :Event Grid retries delivery on the following schedule on a best effort basis:

  • 10 secondes10 seconds
  • 30 secondes30 seconds
  • 1 minute1 minute
  • 5 minutes5 minutes
  • 10 minutes10 minutes
  • 30 minutes30 minutes
  • 1 heure1 hour
  • 3 heures3 hours
  • 6 heures6 hours
  • Toutes les 12 heures jusqu’à 24 heuresEvery 12 hours up to 24 hours

Si le point de terminaison répond dans les 3 minutes, Event Grid tente de supprimer l’événement de la file d’attente de nouvelle tentative dans la mesure du possible, mais des doublons peuvent toujours être reçus.If the endpoint responds within 3 minutes, Event Grid will attempt to remove the event from the retry queue on a best effort basis but duplicates may still be received.

Event Grid ajoute une légère randomisation à toutes les étapes de nouvelle tentative et peut ignorer de façon opportuniste certaines nouvelles tentatives si un point de terminaison est systématiquement non sain, inactif pendant une longue période ou semble être surchargé.Event Grid adds a small randomization to all retry steps and may opportunistically skip certain retries if an endpoint is consistently unhealthy, down for a long period, or appears to be overwhelmed.

Pour un comportement déterministe, définissez la durée de l’événement de durée de vie et de nombre maximum de tentatives de remise dans les stratégies de nouvelle tentative d’abonnement.For deterministic behavior, set the event time to live and max delivery attempts in the subscription retry policies.

Par défaut, Event Grid fait expirer tous les événements qui ne sont pas distribués dans les 24 heures.By default, Event Grid expires all events that aren't delivered within 24 hours. Vous pouvez personnaliser la stratégie de nouvelle tentative lors de la création d’un abonnement à un événement.You can customize the retry policy when creating an event subscription. Vous fournissez le nombre maximal de tentatives de remise (par défaut, 30) et la durée de vie de l’événement (par défaut, 1 440 minutes).You provide the maximum number of delivery attempts (default is 30) and the event time-to-live (default is 1440 minutes).

Livraison retardéeDelayed Delivery

En cas d'échec de livraison d'un point de terminaison, Event Grid commence à retarder la livraison et retente les événements sur ce point de terminaison.As an endpoint experiences delivery failures, Event Grid will begin to delay the delivery and retry of events to that endpoint. Par exemple, si les dix premiers événements publiés sur un point de terminaison échouent, Event Grid supposera que le point de terminaison rencontre des problèmes et retardera toutes les tentatives suivantes et les nouvelles livraisons pendant un certain laps de temps, parfois même pendant plusieurs heures.For example, if the first 10 events published to an endpoint fail, Event Grid will assume that the endpoint is experiencing issues and will delay all subsequent retries and new deliveries for some time - in some cases up to several hours.

La livraison retardée a pour objectif de protéger les points de terminaison non sains, ainsi que le système Event Grid.The functional purpose of delayed delivery is to protect unhealthy endpoints as well as the Event Grid system. Sans temporisation et retard de livraison sur les points de terminaison non sains, la stratégie de nouvelle tentative d'Event Grid peut aisément saturer un système.Without back-off and delay of delivery to unhealthy endpoints, Event Grid's retry policy and volume capabilities can easily overwhelm a system.

Événements de lettres mortesDead-letter events

Lorsque Event Grid ne peut pas remettre un événement dans un laps de temps donné ou après avoir essayé de remettre l’événement un certain nombre de fois, il peut envoyer l’événement non remis à un compte de stockage.When Event Grid can't deliver an event within a certain time period or after trying to deliver the event a certain number of times, it can send the undelivered event to a storage account. Ce processus est appelé mise en file d’attente de lettres mortes.This process is known as dead-lettering. Event Grid met un événement en file d’attente de lettres mortes lorsque l’une des conditions suivantes est remplie.Event Grid dead-letters an event when one of the following conditions is met.

  • L’événement n’est pas remis dans la période de durée de vie.Event isn't delivered within the time-to-live period.
  • Le nombre de tentatives de livraison de l’événement a dépassé la limite.The number of tries to deliver the event has exceeded the limit.

Si l’une des conditions est remplie, l’événement est abandonné ou mis en file d’attente de lettres mortes.If either of the conditions is met, the event is dropped or dead-lettered. Par défaut, Event Grid n’active pas cette fonctionnalité.By default, Event Grid doesn't turn on dead-lettering. Pour l’activer, vous devez spécifier le compte de stockage dans lequel les événements non remis seront conservés au moment de créer l’abonnement aux événements.To enable it, you must specify a storage account to hold undelivered events when creating the event subscription. Les événements sont extraits de ce compte de stockage pour résoudre les remises.You pull events from this storage account to resolve deliveries.

Event Grid envoie un événement à l’emplacement des lettres mortes lorsqu’il a effectué toutes ses nouvelles tentatives.Event Grid sends an event to the dead-letter location when it has tried all of its retry attempts. Si Event Grid reçoit un code de réponse 400 (requête incorrecte) ou 413 (entité de requête trop grande), il planifie immédiatement l’événement pour la file d’attente de lettres mortes.If Event Grid receives a 400 (Bad Request) or 413 (Request Entity Too Large) response code, it immediately schedules the event for dead-lettering. Ces codes de réponse indiquent que la diffusion de l’événement va échouer.These response codes indicate delivery of the event will never succeed.

L’expiration de la durée de vie est vérifiée uniquement lors de la prochaine tentative de livraison planifiée.The time-to-live expiration is checked ONLY at the next scheduled delivery attempt. Par conséquent, même si la durée de vie expire avant la prochaine tentative de livraison planifiée, l’expiration de l’événement est vérifiée uniquement au moment de la prochaine livraison, puis devient lettre morte par la suite.Therefore, even if time-to-live expires before the next scheduled delivery attempt, event expiry is checked only at the time of the next delivery and then subsequently dead-lettered.

Un délai de cinq minutes s’écoule entre la dernière tentative de remise d’un événement et le moment de sa remise à l’emplacement des lettres mortes.There is a five-minute delay between the last attempt to deliver an event and when it is delivered to the dead-letter location. Ce décalage est destiné à réduire le nombre d’opérations de stockage d’objets blob.This delay is intended to reduce the number Blob storage operations. Si l’emplacement des lettres mortes est indisponible pendant quatre heures, l’événement est abandonné.If the dead-letter location is unavailable for four hours, the event is dropped.

Avant de définir l’emplacement des lettres mortes, vous devez disposer d’un compte de stockage avec un conteneur.Before setting the dead-letter location, you must have a storage account with a container. Vous devez indiquer le point de terminaison de ce conteneur au moment de créer l’abonnement aux événements.You provide the endpoint for this container when creating the event subscription. Le point de terminaison se présente sous la forme suivante : /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-name>/blobServices/default/containers/<container-name>The endpoint is in the format of: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-name>/blobServices/default/containers/<container-name>

Vous souhaiterez peut-être être averti lorsqu’un événement a été envoyé à l’emplacement des lettres mortes.You might want to be notified when an event has been sent to the dead letter location. Pour répondre aux événements non remis à l’aide d’Event Grid, créez un abonnement aux événements pour le stockage Blob de lettres mortes.To use Event Grid to respond to undelivered events, create an event subscription for the dead-letter blob storage. Chaque fois que votre stockage Blob de lettres mortes reçoit un événement non remis, Event Grid notifie votre gestionnaire.Every time your dead-letter blob storage receives an undelivered event, Event Grid notifies your handler. Le gestionnaire répond par les mesures que vous voulez prendre pour réconcilier les événements non remis.The handler responds with actions you wish to take for reconciling undelivered events. Pour savoir comment configurer un emplacement de lettres mortes et des stratégies de nouvelle tentative, consultez Lettres mortes et stratégies de nouvelle tentative.For an example of setting up a dead letter location and retry policies, see Dead letter and retry policies.

Formats d’événement de livraisonDelivery event formats

Cette section fournit des exemples d’événements et des événements de lettres mortes dans différents formats de schéma de livraison (schéma Event Grid, schéma CloudEvents 1.0 et schéma personnalisé).This section gives you examples of events and dead-lettered events in different delivery schema formats (Event Grid schema, CloudEvents 1.0 schema, and custom schema). Pour plus d’informations sur ces formats, consultez les articles Schéma Event Grid et Schéma CloudEvents v1.0.For more information about these formats, see Event Grid schema and Cloud Events 1.0 schema articles.

Schéma Event GridEvent Grid schema

ÉvénementEvent

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

Événement de lettres mortesDead-letter event

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

Schéma CloudEvents 1.0CloudEvents 1.0 schema

ÉvénementEvent

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

Événement de lettres mortesDead-letter event

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

Schéma personnaliséCustom schema

ÉvénementEvent

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

Événement de lettres mortesDead-letter event

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

État de distribution du messageMessage delivery status

Event Grid utilise les codes de réponse HTTP pour accuser réception des événements.Event Grid uses HTTP response codes to acknowledge receipt of events.

Codes de réussiteSuccess codes

Event Grid considère uniquement les codes de réponse HTTP suivants en tant que livraisons réussies.Event Grid considers only the following HTTP response codes as successful deliveries. Tous les autres codes d’état sont considérés en tant que livraisons ayant échoué et font l'objet de nouvelles tentatives ou de lettres mortes, le cas échéant.All other status codes are considered failed deliveries and will be retried or deadlettered as appropriate. Lorsqu'il reçoit un code d'état réussi, Event Grid considère la livraison comme terminée.Upon receiving a successful status code, Event Grid considers delivery complete.

  • 200 OK200 OK
  • 201 Créé201 Created
  • 202 Accepté202 Accepted
  • 203 Informations ne faisant pas autorité203 Non-Authoritative Information
  • 204 Pas de contenu204 No Content

Codes d’échecFailure codes

Tous les codes ne figurant pas dans les codes ci-dessus (200 à 204) sont considérés comme ayant échoué et feront l’objet de nouvelles tentatives (le cas échéant).All other codes not in the above set (200-204) are considered failures and will be retried (if needed). Certains sont associés à des stratégies de nouvelle tentative spécifiques (voir ci-dessous). Toutes les autres suivent le modèle de temporisation exponentielle standard.Some have specific retry policies tied to them outlined below, all others follow the standard exponential back-off model. Il est important de garder à l’esprit qu’en raison de la nature hautement parallélisée de l’architecture d'Event Grid, le comportement d'une nouvelle tentative n'est pas déterministe.It's important to keep in mind that due to the highly parallelized nature of Event Grid's architecture, the retry behavior is non-deterministic.

Code d’étatStatus code Comportement pour les nouvelles tentativesRetry behavior
400 Demande incorrecte400 Bad Request Aucune nouvelle tentativeNot retried
401 Non autorisé401 Unauthorized Nouvelle tentative au bout de 5 minutes pour les points de terminaison des ressources AzureRetry after 5 minutes or more for Azure Resources Endpoints
403 Interdit403 Forbidden Aucune nouvelle tentativeNot retried
404 Introuvable404 Not Found Nouvelle tentative au bout de 5 minutes pour les points de terminaison des ressources AzureRetry after 5 minutes or more for Azure Resources Endpoints
408 Délai d’expiration de la requête408 Request Timeout Nouvelle tentative après 2 minutes ou plusRetry after 2 minutes or more
413 Entité de demande trop grande413 Request Entity Too Large Aucune nouvelle tentativeNot retried
503 Service indisponible503 Service Unavailable Nouvelle tentatives après 30 secondes ou plusRetry after 30 seconds or more
Tous les autresAll others Nouvelle tentatives après 10 secondes ou plusRetry after 10 seconds or more

Étapes suivantesNext steps