Distribution et nouvelle tentative de distribution de messages avec Azure Grid

Event Grid assure une distribution fiable. Il tente de livrer chaque message au moins une fois immédiatement pour chaque abonnement correspondant. Si le point de terminaison d’un abonné n’accuse pas réception d’un événement ou si une défaillance se produit, Event Grid effectue une nouvelle tentative de remise conformément à une planification de nouvelles tentatives et une stratégie de nouvelles tentatives fixes. Par défaut, Event Grid distribue un seul événement à la fois à l’abonné. La charge utile est cependant un tableau avec un seul événement.

Notes

Event Grid ne garantit pas l’ordre de distribution des événements, de sorte que les abonnés peuvent les recevoir dans le désordre.

Planification des nouvelles tentatives

Quand Event Grid reçoit une erreur liée à une tentative de remise d’événement, Event Grid décide s’il doit retenter la remise, placer l’événement en file d’attente de lettres mortes ou annuler l’événement en fonction du type d’erreur.

Si l’erreur retournée par le point de terminaison abonné est liée à la configuration et si elle ne peut pas être corrigée par de nouvelles tentatives (par exemple, si le point de terminaison est supprimé), Event Grid place l’événement en file d’attente de lettres mortes ou annule l’événement si la file d’attente de lettres mortes n’est pas configurée.

Le tableau suivant décrit les types de points de terminaison et d’erreurs pour lesquels aucune nouvelle tentative ne se produit :

Type de point de terminaison Codes d’erreur
Ressources Azure 400 (requête incorrecte), 413 (l’entité de demande est trop grande)
webhook 400 (requête incorrecte), 413 (l’entité de demande est trop grande), 401 (non autorisé)

Notes

Si la file d’attente de lettres mortes n’est pas configurée pour un point de terminaison, les événements sont supprimés lorsque les erreurs ci-dessus se produisent. Envisagez de configurer la file d’attente de lettres mortes si vous ne souhaitez pas que ces types d’événements soient supprimés. Les événements de mise en file d’attente de lettres mortes sont supprimés lorsque la destination des lettres mortes est introuvable.

Si l’erreur retournée par le point de terminaison abonné ne figure pas dans la liste ci-dessus, Event Grid effectue la nouvelle tentative à l’aide de la stratégie décrite ci-dessous :

Event Grid attend une réponse pendant 30 secondes après la distribution d’un 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. Event Grid utilise une stratégie de nouvelle tentative d’interruption exponentielle pour la distribution des événements. Dans la mesure du possible, Event Grid tente une nouvelle livraison selon la planification suivante :

  • 10 secondes
  • 30 secondes
  • 1 minute
  • 5 minutes
  • 10 minutes
  • 30 minutes
  • 1 heure
  • 3 heures
  • 6 heures
  • Toutes les 12 heures jusqu’à 24 heures

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.

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é.

Stratégie de nouvelles tentatives

Vous pouvez personnaliser la stratégie de nouvelle tentative lors de la création d’un abonnement aux événements à l’aide des deux configurations suivantes. Un événement est supprimé si une des limites de la stratégie de nouvelle tentative est atteinte.

  • Nombre maximum de tentatives: la valeur doit être un entier compris entre 1 et 30. La valeur par défaut est 30.
  • Durée de vie de l’événement (TTL) : la valeur doit être un entier compris entre 1 et 1440. La valeur par défaut est 1 440 minutes

Pour obtenir un exemple de commande CLI et PowerShell permettant de configurer ces paramètres, consultez Définir une stratégie de nouvelle tentative.

Notes

Si vous définissez Event time to live (TTL) et Maximum number of attempts, Event Grid utilise la date de la première expiration pour déterminer quand arrêter la remise des événements. Par exemple, si vous définissez une durée de vie (TTL) de 30 minutes et 5 tentatives de livraison maximum. Lorsqu’un événement n’est pas livré après 30 minutes (ou) n’est pas livré après 5 tentatives, selon la première éventualité, l’événement devient lettre morte. Si vous définissez le nombre maximal de tentatives de livraison à 10, en ce qui concerne la planification de nouvelles tentatives exponentielles, un nombre maximal de 6 tentatives de livraison se produit avant la fin de la durée de vie de 30 minutes. Par conséquent, le nombre maximal de 10 tentatives n’a aucun impact dans ce cas et les événements sont lettre morte après 30 minutes.

Traitement par lot des sorties

Par défaut, Event Grid envoie chaque événement individuellement aux abonnés. L’abonné reçoit un tableau ne comprenant qu’un seul événement. 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é. Le traitement par lot est désactivé par défaut et peut être activé pour chaque abonnement.

Stratégie de traitement par lot

La livraison par lot a deux paramètres :

  • Nombre maximum d’événements par lot : nombre maximum d’événements qu’Event Grid livre par lot. 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. Event Grid ne retarde pas la livraison des événements pour créer un lot si moins d’événements sont disponibles. Doit être compris entre 1 et 5 000.
  • Taille de lot préférée en kilo-octets : plafond cible pour la taille de lot en kilo-octets. 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. 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. 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é.

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).

Comportement du traitement par lots

  • Tout ou aucun

    Le service Event Grid fonctionne selon le principe du tout ou rien. Il ne prend pas en charge la réussite partielle d’une livraison par lot. Les abonnés doivent veiller à demander uniquement un nombre d’événements par lot qu’ils peuvent raisonnablement gérer en 30 secondes.

  • Traitement par lot optimiste

    Les paramètres de stratégie de traitement par lot n’imposent pas de limites strictes au comportement du traitement par lot. Ils sont donc respectés dans la limite des possibilités. Lorsque les fréquences d’événements sont faibles, vous observerez souvent que la taille de lot est inférieure au nombre maximal d’événements demandés par lot.

  • La valeur par défaut est DÉSACTIVÉ

    Par défaut, Event Grid ajoute un seul événement à chaque demande de livraison. Pour activer le traitement par lot, définissez l’un des paramètres mentionnés plus haut dans l’article, dans le JSON d’abonnement aux événements.

  • Valeurs par défaut

    Lors de la création d’un abonnement aux événements, il n’est pas nécessaire de spécifier les deux paramètres (nombre maximal d’événements par lot et taille de lot approximative en kilo-octets). Si un seul paramètre est défini, Event Grid utilise des valeurs par défaut (configurables). Pour connaître les valeurs par défaut et la manière de les remplacer, consultez les sections suivantes.

Portail Azure :

Ces paramètres s’affichent sous l’onglet Fonctionnalités supplémentaires de la page Abonnement aux événements.

Capture d’écran montrant l’onglet Fonctionnalités supplémentaires de la page Abonnement aux événements avec la section Traitement par lot mise en évidence.

Azure CLI

Lorsque vous créez un abonnement aux événements, utilisez les paramètres suivants :

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

Livraison retardée

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. Par exemple, si les dix premiers événements publiés sur un point de terminaison échouent, Event Grid suppose 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.

La livraison retardée a pour objectif de protéger les points de terminaison non sains, ainsi que le système Event Grid. 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.

Événements de lettres mortes

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. Ce processus est appelé mise en file d’attente de lettres mortes. Event Grid met un événement en file d’attente de lettres mortes lorsque l’une des conditions suivantes est remplie.

  • L’événement n’est pas remis dans la période de durée de vie.
  • Le nombre de tentatives de livraison de l’événement a dépassé la limite.

Si l’une des conditions est remplie, l’événement est abandonné ou mis en file d’attente de lettres mortes. Par défaut, Event Grid n’active pas cette fonctionnalité. 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. Les événements sont extraits de ce compte de stockage pour résoudre les remises.

Event Grid envoie un événement à l’emplacement des lettres mortes lorsqu’il a effectué toutes ses nouvelles tentatives. 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. Ces codes de réponse indiquent que la diffusion de l’événement va échouer.

L’expiration de la durée de vie est vérifiée uniquement lors de la prochaine tentative de livraison planifiée. 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.

Un délai de cinq minutes s’écoule entre la dernière tentative de remise d’un événement et le moment où il est placé dans la file d’attente de lettres mortes. Ce décalage est destiné à réduire le nombre d’opérations de stockage d’objets blob. Si l’emplacement des lettres mortes est indisponible pendant quatre heures, l’événement est abandonné.

Avant de définir l’emplacement des lettres mortes, vous devez disposer d’un compte de stockage avec un conteneur. Vous devez indiquer le point de terminaison de ce conteneur au moment de créer l’abonnement aux événements. 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>

Vous souhaiterez peut-être être averti lorsqu’un événement a été envoyé à l’emplacement des lettres mortes. 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. Chaque fois que votre stockage Blob de lettres mortes reçoit un événement non remis, Event Grid notifie votre gestionnaire. Le gestionnaire répond par les mesures que vous voulez prendre pour réconcilier les événements non remis. 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.

Notes

Si vous activez l’identité managée pour les lettres mortes, vous devez ajouter l’identité managée au rôle de contrôle d’accès en fonction du rôle (RBAC) approprié sur le compte de Stockage Azure qui contiendra les événements de lettres mortes. Pour plus d’informations, consultez Destinations et rôles Azure pris en charge.

Formats d’événement de livraison

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é). Pour plus d’informations sur ces formats, consultez les articles Schéma Event Grid et Schéma CloudEvents v1.0.

Schéma Event Grid

Événement

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

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

Voici les valeurs possibles de lastDeliveryOutcome et leurs descriptions.

LastDeliveryOutcome Description
NotFound La ressource de destination est introuvable.
Désactivé La destination a désactivé la réception des événements. Applicable à Azure Service Bus et Azure Event Hubs.
Complète Nombre maximal d’opérations autorisées dépassé sur la destination. Applicable à Azure Service Bus et Azure Event Hubs.
Non autorisé La destination a retourné un code de réponse non autorisé.
BadRequest La destination a retourné un code de réponse de type requête incorrecte.
TimedOut L’opération de remise a expiré.
Busy Le serveur de destination est occupé.
PayloadTooLarge La taille du message a dépassé la taille maximale autorisée par la destination. Applicable à Azure Service Bus et Azure Event Hubs.
Probation La destination est mise en probation par Event Grid. Aucune tentative de remise n’est effectuée pendant la durée de probation.
Opération annulée Opération de remise annulée.
Abandonné La remise a été interrompue par Event Grid après un intervalle de temps.
SocketError Une erreur de communication réseau s’est produite durant la remise.
ResolutionError Échec de la résolution DNS du point de terminaison de destination.
Remise Remise des événements à destination.
SessionQueueNotSupported Une tentative de remise d’événements sans ID de session est effectuée sur une entité pour laquelle la prise en charge de session est activée. Applicable à la destination de l’entité Azure Service Bus.
Interdit La remise est interdite par le point de terminaison de destination (peut-être en raison de pare-feu IP ou d’autres restrictions)
InvalidAzureFunctionDestination La fonction Azure de destination n’est pas valide. Probablement parce qu’elle n’a pas le type EventGridTrigger.

LastDeliveryOutcome: Probation

Un abonnement aux événements est mis en probation pour une durée déterminée par Event Grid en cas d’échec des remises d’événements vers cette destination. La durée de probation n’est pas la même pour les différentes erreurs retournées par le point de terminaison de destination. Si un abonnement aux événements est en probation, les événements peuvent être placés en file d’attente de lettres mortes ou être annulés sans tentative de remise, en fonction du code d’erreur pour lequel il est en probation.

Erreur Durée de probation
Busy 10 secondes
NotFound 5 minutes
SocketError 30 secondes
ResolutionError 5 minutes
Désactivé 5 minutes
Complète 5 minutes
TimedOut 10 secondes
Non autorisé 5 minutes
Interdit 5 minutes
InvalidAzureFunctionDestination 10 minutes

Notes

Event Grid utilise la durée de probation pour améliorer la gestion de la remise. Cette durée peut changer plus tard.

Schéma CloudEvents 1.0

Événement

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

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

Événement

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

Événement de lettres mortes

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

Event Grid utilise les codes de réponse HTTP pour accuser réception des événements.

Codes de réussite

Event Grid considère uniquement les codes de réponse HTTP suivants en tant que livraisons réussies. 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. Lorsqu'il reçoit un code d'état réussi, Event Grid considère la livraison comme terminée.

  • 200 OK
  • 201 Créé
  • 202 Accepté
  • 203 Informations ne faisant pas autorité
  • 204 Pas de contenu

Codes d’échec

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). 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. 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.

Code d’état Comportement pour les nouvelles tentatives
400 Demande incorrecte Aucune nouvelle tentative
401 Non autorisé Nouvelle tentative au bout de 5 minutes pour les points de terminaison des ressources Azure
403 Interdit Aucune nouvelle tentative
404 Introuvable Nouvelle tentative au bout de 5 minutes pour les points de terminaison des ressources Azure
408 Délai d’expiration de la requête Nouvelle tentative après 2 minutes ou plus
413 Entité de demande trop grande Aucune nouvelle tentative
503 Service indisponible Nouvelle tentatives après 30 secondes ou plus
Tous les autres Nouvelle tentatives après 10 secondes ou plus

Propriétés de remise personnalisées

Les abonnements aux événements vous permettent de définir des en-têtes HTTP qui sont inclus dans les événements remis. Cette fonctionnalité vous permet de définir des en-têtes personnalisés requis par une destination. Vous pouvez configurer jusqu’à 10 en-têtes lors de la création d’un abonnement aux événements. La valeur de chaque en-tête ne doit pas être supérieure à 4 096 (4 Ko) octets. Vous pouvez définir des en-têtes personnalisés sur les événements remis aux destinations suivantes :

  • webhooks
  • Rubriques et files d’attente Azure Service Bus
  • Hubs d'événements Azure
  • Connexions hybrides Relay

Pour plus d'informations, consultez Propriétés de remise personnalisées.

Étapes suivantes