Entrega y reintento de entrega de mensajes de Event Grid

Event Grid ofrece entrega duradera. Intenta entregar cada mensaje al menos una vez inmediatamente después de encontrar una suscripción coincidente. Si el punto de conexión de un suscriptor no reconoce la recepción de un evento o se produce un error, Event Grid reintenta la entrega según una programación de reintentos fija y una directiva de reintentos. De forma predeterminada, Event Grid entrega un evento cada vez al suscriptor. No obstante, la carga es una matriz con un solo evento.

Nota

Event Grid no garantiza el orden de entrega de los eventos, por lo que los suscriptores pueden recibirlos de forma desordenada.

Programación de reintentos

Cuando Event Grid recibe un error por un intento de entrega de eventos, Event Grid decide si se debe reintentar la entrega, enviar un mensaje fallido del evento o anular el evento según el tipo de error.

Si el error que devuelve el punto de conexión suscrito es un error relacionado con la configuración que no se puede corregir con los reintentos (por ejemplo, si el punto de conexión se ha eliminado), Event Grid ejecutará mensajes fallidos del evento o anulará el evento si no se ha configurado un método para mensajes fallidos.

En la tabla siguiente se describen los tipos de puntos de conexión y errores para los que no se produce el reintento:

Tipo de punto de conexión Códigos de error
recursos de Azure 400 (solicitud incorrecta), 413 (la entidad de solicitud es demasiado grande)
webhook 400 (solicitud incorrecta), 413 (la entidad de solicitud es demasiado grande), 401 (no autorizado)

Nota

Si no se han configurado los mensajes con problemas de entrega para un punto de conexión, los eventos se eliminarán cuando se produzcan los errores anteriores. Considere la posibilidad de configurar los mensajes con problemas de entrega si no desea que se eliminen estos tipos de eventos. Los eventos con mensajes con problemas de entrega se quitarán cuando no se encuentre el destino de los mensajes con problemas de entrega.

Si el error que devuelve el punto de conexión suscrito no está en la lista anterior, Event Grid realiza el reintento con la directiva que se describe a continuación:

Event Grid espera 30 segundos para obtener una respuesta después de entregar un mensaje. Después de 30 segundos, si el punto de conexión no ha respondido, el mensaje se pone en cola para volver a intentarlo. Event Grid usa una directiva de reintentos de retroceso exponencial para la entrega de eventos. Event Grid reintenta la entrega en el siguiente horario y cuando sea el mejor momento:

  • 10 segundos
  • 30 segundos
  • 1 minuto.
  • 5 minutos
  • 10 minutos
  • 30 minutos
  • 1 hora
  • 3 horas
  • 6 horas
  • Cada 12 horas hasta 24 horas

Si el punto de conexión responde en 3 minutos, Event Grid intenta eliminar el evento de la cola de reintentos en el mejor momento posible, pero aún se pueden recibir duplicados.

Event Grid agrega una pequeña selección aleatoria en todos los pasos de reintento y puede omitir oportunamente ciertos reintentos si un punto de conexión es incorrecto, está inactivo durante un largo período o parece estar demasiado ocupado.

Directiva de reintentos

Puede personalizar la directiva de reintentos al crear una suscripción de eventos mediante las dos configuraciones siguientes. Si se alcanza alguno de los límites de la directiva de reintentos, el evento se descarta.

  • Número máximo de intentos: el valor debe ser un entero entre 1 y 30. El valor predeterminado es 30.
  • Período de vida del evento (TTL): el valor debe ser un entero entre 1 y 1440. El valor predeterminado es 1440 minutos

Para obtener un ejemplo de la CLI y el comando de PowerShell a fin de configurar estas opciones, vea Establecimiento de la directiva de reintentos.

Nota

Si establece Event time to live (TTL) y Maximum number of attempts, Event Grid usa la primera opción más próxima a la expiración para determinar cuándo se debe detener la entrega de eventos. Por ejemplo, si establece 30 minutos como período de vida (TTL) y 5 intentos de entrega máximos. Cuando un evento no se entrega después de 30 minutos (o) no se entrega después de 5 intentos, lo que ocurra primero, el evento se pone en la cola de mensajes fallidos. Si establece el número máximo de intentos de entrega en 10, con respecto a la programación exponencial de reintentos, el número máximo de 6 intentos de entrega ocurrirá antes de que se alcance el TTL de 30 minutos, por lo tanto, establecer el número máximo de intentos en 10 no tendrá ningún impacto en este caso y los eventos se eliminarán después de 30 minutos.

Procesamiento por lotes de salida

De forma predeterminada, Event Grid envía cada evento individualmente a los suscriptores. El suscriptor recibe una matriz con un solo evento. Puede configurar Event Grid para procesar por lotes los eventos para su entrega con el fin de mejorar el rendimiento HTTP en escenarios de alto rendimiento. El procesamiento por lotes está desactivado de forma predeterminada y se puede activar por suscripción.

Directiva de procesamiento por lotes

La entrega por lotes tiene dos opciones:

  • Número máximo de eventos por lote: es el número máximo de eventos que Event Grid entrega por lote. No se superará nunca este número; sin embargo, se pueden entregar menos eventos si no hay otros eventos disponibles en el momento de la publicación. Event Grid no retrasa los eventos para crear un lote si hay menos eventos disponibles. Debe estar entre 1 y 5 000.
  • Tamaño de lote preferido en kilobytes: es el límite superior de destino para el tamaño de lote en kilobytes. Al igual que el número máximo de eventos, el tamaño del lote puede ser menor si no hay más eventos disponibles en el momento de la publicación. Es posible que un lote sea mayor que el tamaño de lote preferido si un solo evento es mayor que el tamaño preferido. Por ejemplo, si el tamaño preferido es 4 KB y se inserta un evento de 10 KB en Event Grid, el evento de 10 KB se seguirá entregando en su propio lote en lugar de ser eliminado.

La entrega por lotes se configura en función de una suscripción por evento mediante el portal, la CLI, PowerShell o los SDK.

Comportamiento de procesamiento por lotes

  • Todos o ninguno

    Event Grid funciona con la semántica de todos o ninguno. No admite el procesamiento parcial de una entrega por lotes. Los suscriptores deben tener cuidado de solicitar solo los eventos por lote que puedan controlar de forma razonable en 30 segundos.

  • Procesamiento por lotes optimista

    La configuración de la directiva de procesamiento por lotes no tiene límites estrictos acerca del comportamiento del procesamiento por lotes, y se respeta en función del mejor esfuerzo. En las tasas de eventos bajas, a menudo observará que el tamaño del lote es menor que el número máximo de eventos solicitado por lote.

  • De forma predeterminada, este valor está desactivado.

    De forma predeterminada, Event Grid solo agrega un evento a cada solicitud de entrega. La manera de activar el procesamiento por lotes es establecer una de las opciones mencionadas anteriormente en el artículo en el JSON de la suscripción de eventos.

  • Valores predeterminados

    No es necesario especificar ambas configuraciones (eventos máximos por lote y tamaño de lote aproximado en kilobytes) al crear una suscripción de eventos. Si solo se establece un valor, Event Grid usa valores predeterminados (configurables). Vea las siguientes secciones para ver los valores predeterminados y aprender a reemplazarlos.

Azure Portal:

Verá esta configuración en la pestaña Características adicionales de la página Suscripción de eventos.

Captura de pantalla que muestra la pestaña Características adicionales de la página Suscripción de eventos con la sección Procesamiento por lotes resaltada.

Azure CLI

Al crear una suscripción a eventos, use los parámetros siguientes:

  • max-events-per-batch: número máximo de eventos en un lote. Debe ser un número entre 1 y 5000.
  • preferred-batch-size-in-kilobytes: tamaño de lote preferido en kilobytes. Debe ser un número entre 1 y 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

Para más información sobre el uso de la CLI de Azure con Event Grid, consulte Enrutamiento de eventos de almacenamiento a un punto de conexión web con la CLI de Azure.

Entrega retrasada

Cuando un punto de conexión experimenta errores de entrega, Event Grid comienza a retrasar la entrega y a reintentar los eventos a ese punto de conexión. Por ejemplo, si se produce un error en los 10 primeros eventos publicados en un punto de conexión, Event Grid asume que el punto de conexión está experimentando problemas y retrasará todos los reintentos posteriores y las nuevas entregas durante algún tiempo; en algunos casos, hasta varias horas.

El propósito funcional de la entrega retrasada es proteger los puntos de conexión incorrectos y el sistema Event Grid. Sin los mecanismos de retroceso y el retraso de la entrega a puntos de conexión incorrectos, la directiva de reintentos de Event Grid y las funcionalidades del volumen pueden sobrecargar fácilmente un sistema.

Eventos fallidos

Cuando Event Grid no puede entregar un evento en un período de tiempo determinado o después de intentar entregarlo un número concreto de veces, puede enviar el evento sin entregar a una cuenta de almacenamiento. Este proceso se conoce como colas de mensajes fallidos. Event Grid pone en la cola de mensajes fallidos un evento cuando se cumple una de las siguientes condiciones.

  • El evento no se entrega en el período de tiempo de vida.
  • El número de intentos de entrega del evento ha superado el límite.

Si se cumple alguna de las condiciones, el evento se quita o pone en la cola de mensajes fallidos. De forma predeterminada, Event Grid no tiene activada esta opción. Para habilitarla, debe especificar una cuenta de almacenamiento para contener los eventos no entregados al crear la suscripción a eventos. Puede extraer eventos de esta cuenta de almacenamiento para resolver las entregas.

Event Grid envía un evento a la ubicación de la cola de mensajes fallidos cuando ha intentado todos los reintentos. Si Event Grid recibe un código de respuesta 400 (solicitud incorrecta) o 413 (entidad de solicitud demasiado grande), programa inmediatamente el evento para los mensajes con problemas de entrega. Estos códigos de respuesta indican que la entrega del evento nunca se realizará correctamente.

La expiración del período de vida SOLO se comprueba en el siguiente intento de entrega programada. Por lo tanto, incluso si expira el período de vida antes del siguiente intento de entrega programada, la expiración del evento se comprueba solo en el momento de la siguiente entrega y, a continuación, en la cola de mensajes fallidos.

Hay un retraso de cinco minutos entre el último intento de entregar un evento y su entrega a la ubicación con mensajes fallidos. Este retraso está pensado para reducir el número de operaciones de almacenamiento de blobs. Si la ubicación de la cola de mensajes fallidos no está disponible durante cuatro horas, se elimina el evento.

Antes de establecer la ubicación de mensajes fallidos, debe tener una cuenta de almacenamiento con un contenedor. Puede proporcionar el punto de conexión de este contenedor al crear la suscripción a eventos. El punto de conexión tiene este formato: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-name>/blobServices/default/containers/<container-name>

Es posible que desee recibir una notificación cuando un evento se envía a la ubicación de la cola de mensajes fallidos. Para utilizar Event Grid para responder a eventos no entregados, cree una suscripción a eventos para el almacenamiento de blobs de los eventos fallidos. Cada vez que el almacenamiento de blobs de eventos fallidos recibe un evento no entregado, Event Grid lo notifica al controlador. El controlador responderá con las acciones que debe realizar para conciliar los eventos no entregados. Para obtener un ejemplo de cómo configurar una ubicación de la cola de mensajes fallidos y directivas de reintento, consulte Cola de mensajes fallidos y directivas de reintento.

Nota:

Si habilita la identidad administrada para los mensajes fallidos, deberá agregar la identidad administrada al rol adecuado del control de acceso basado en rol (RBAC) en la cuenta de Azure Storage que contendrá los eventos de mensajes fallidos. Para obtener más información, consulte Destinos admitidos y roles de Azure.

Formatos de eventos de entrega

En esta sección se proporcionan ejemplos de eventos y eventos en la cola de mensajes fallidos en diferentes formatos de esquema de entrega (esquema de Event Grid, esquema de CloudEvents 1.0 y esquema personalizado). Para obtener más información sobre estos formatos, vea los artículos Esquema de Event Grid y Esquema de CloudEvents 1.0.

Esquema de Event Grid

Evento

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

Evento en la cola de mensajes fallidos

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

Estos son los valores posibles de lastDeliveryOutcome y sus descripciones.

LastDeliveryOutcome Descripción
NotFound No se encontró el recurso de destino.
Disabled El destino ha deshabilitado la recepción de eventos. Aplicable a Azure Service Bus y Azure Event Hubs.
Completo Se ha superado el número máximo de operaciones permitidas en el destino. Aplicable a Azure Service Bus y Azure Event Hubs.
No autorizado El destino devolvió un código de respuesta no autorizado.
BadRequest El destino devolvió un código de respuesta de solicitud incorrecta.
TimedOut Se ha agotado el tiempo de espera de la operación.
Ocupado El servidor de destino está ocupado.
PayloadTooLarge El tamaño del mensaje superó el tamaño máximo que permite el destino. Aplicable a Azure Service Bus y Azure Event Hubs.
Período de prueba Event Grid pone al destino en período de prueba. Durante dicho período no se intenta la entrega.
Canceled Operación de entrega cancelada.
Anulado Event Grid anuló la entrega después de un intervalo de tiempo.
SocketError Error de comunicación de red durante la entrega.
ResolutionError Error en la resolución DNS del punto de conexión de destino.
Entrega Entrega de eventos al destino.
SessionQueueNotSupported Se intenta realizar la entrega de eventos sin identificador de sesión en una entidad, que tiene habilitada la compatibilidad con la sesión. Aplicable a un destino de entidad de Azure Service Bus.
Prohibido El punto de conexión de destino prohíbe la entrega (puede deberse a la existencia de firewalls de IP o a otras restricciones).
InvalidAzureFunctionDestination La función de Azure de destino no es válida. Probablemente se deba a que no tiene el tipo EventGridTrigger.

LastDeliveryOutcome: Probation

Event Grid pone una suscripción de eventos en período de prueba durante un tiempo si comienzan a producirse errores en las entregas de eventos a ese destino. El tiempo del período de prueba es diferente para los distintos errores que devuelve el punto de conexión de destino. Si una suscripción de eventos está en período de prueba, los eventos pueden recibir mensajes fallidos o eliminarse sin ni siquiera intentar realizar la entrega en función del código de error debido al cual está en período de prueba.

Error Duración del período de prueba
Ocupado 10 segundos
NotFound 5 minutos
SocketError 30 segundos
ResolutionError 5 minutos
Disabled 5 minutos
Completo 5 minutos
TimedOut 10 segundos
No autorizado 5 minutos
Prohibido 5 minutos
InvalidAzureFunctionDestination 10 minutos

Nota

Event Grid usa la duración del período de prueba para una mejor administración de la entrega; la duración puede cambiar en el futuro.

Esquema CloudEvents 1.0

Evento

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

Evento en la cola de mensajes fallidos

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

Esquema personalizado

Evento

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

Evento en la cola de mensajes fallidos

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

Estado de entrega de mensajes

Event Grid usa códigos de respuesta HTTP para acusar recibo de eventos.

Códigos de éxito

Event Grid solo considera entregas correctas los siguientes códigos de respuesta HTTP. El resto de los códigos de estado se consideran entregas con errores y se reintentarán o procesarán como entregas devueltas. Cuando Event Grid recibe un código de estado correcto, considera que la entrega ha finalizado.

  • 200 OK
  • 201 Creado
  • 202 - Aceptado
  • 203 Información no autoritativa
  • 204 No Content

Códigos de error

Todos los demás códigos que no están en el conjunto anterior (200-204) se consideran errores y se reintentarán (si es necesario). Algunos tienen directivas de reintento específicas, que se describen a continuación y todos las demás siguen el modelo de interrupción exponencial estándar. Es importante recordar que, debido a la naturaleza altamente paralela de la arquitectura de Event Grid, el comportamiento de reintento no es determinista.

status code Comportamiento de reintento
400 - Solicitud incorrecta No se ha intentado de nuevo
401 No autorizado Reintentar después de 5 minutos o más para los puntos de conexión de recursos de Azure
403 Prohibido No se ha intentado de nuevo
404 No encontrado Reintentar después de 5 minutos o más para los puntos de conexión de recursos de Azure
Tiempo de espera de solicitud 408 Reintentar después de 2 minutos o más
413 Entidad de solicitud demasiado larga No se ha intentado de nuevo
Servicio no disponible 503 Reintentar después de 30 segundos o más
Todos los demás Reintentar después de 10 segundos o más

Propiedades de entrega personalizadas

Las suscripciones a eventos permiten configurar encabezados HTTP que se incluyen en los eventos entregados. Esta capacidad permite establecer encabezados personalizados que un destino requiere. Puede configurar hasta 10 encabezados al crear una suscripción de eventos. Cada valor de encabezado no debe ser mayor que 4 096 (4 K) bytes. Puede establecer encabezados personalizados en los eventos que se entregan a los destinos siguientes:

  • webhooks
  • Temas y colas de Azure Service Bus
  • Azure Event Hubs
  • Retransmisión de conexiones híbridas

Para obtener más información, vea Propiedades de entrega personalizadas.

Pasos siguientes