Entrega e repetição de mensagens do Event Grid

O Event Grid proporciona uma entrega durável. Tenta entregar cada mensagem , pelo menos, uma vez para cada subscrição correspondente imediatamente. Se o ponto final de um subscritor não reconhecer a receção de um evento ou se ocorrer uma falha, o Event Grid repetirá a entrega com base numa agenda de repetição fixa e na política de repetição. Por predefinição, o Event Grid fornece um evento de cada vez ao subscritor. No entanto, o payload é uma matriz com um único evento.

Nota

O Event Grid não garante a encomenda da entrega de eventos, pelo que os subscritores podem recebê-los fora de ordem.

Agendar novamente

Quando o Event Grid recebe um erro para uma tentativa de entrega de eventos, o Event Grid decide se deve repetir a entrega, enviar o evento sem saída ou remover o evento com base no tipo de erro.

Se o erro devolvido pelo ponto final subscrito for um erro relacionado com a configuração que não pode ser corrigido com repetições (por exemplo, se o ponto final for eliminado), o Event Grid executará letras não entregues no evento ou removerá o evento se a letra não estar configurada.

A tabela seguinte descreve os tipos de pontos finais e erros para os quais a repetição não ocorre:

Tipo de Ponto Final Códigos de erro
Recursos do Azure 400 (Pedido incorreto), 413 (a entidade Pedido é demasiado grande)
Webhook 400 (Pedido incorreto), 413 (Entidade de pedido demasiado grande), 401 (Não Autorizado)

Nota

Se a letra não indicada não estiver configurada para um ponto final, os eventos serão removidos quando ocorrerem os erros acima. Considere configurar a letra não entregue se não quiser que este tipo de eventos sejam removidos. Os eventos com letras não entregues serão ignorados quando o destino da carta não for encontrado.

Se o erro devolvido pelo ponto final subscrito não estiver entre a lista acima, o Event Grid efetua a repetição com a política descrita abaixo:

O Event Grid aguarda 30 segundos por uma resposta depois de entregar uma mensagem. Após 30 segundos, se o ponto final não tiver respondido, a mensagem será apresentada em fila para repetição. O Event Grid utiliza uma política exponencial de repetição de back-off para a entrega de eventos. O Event Grid volta a tentar a entrega na seguinte agenda com base no melhor esforço:

  • 10 segundos
  • 30 segundos
  • 1 minuto
  • 5 minutos
  • 10 minutos
  • 30 minutos
  • Uma hora
  • 3 horas
  • 6 horas
  • A cada 12 horas até 24 horas

Se o ponto final responder dentro de 3 minutos, o Event Grid tenta remover o evento da fila de repetição com a melhor base de esforço, mas os duplicados ainda poderão ser recebidos.

O Event Grid adiciona uma pequena aleatoriedade a todos os passos de repetição e pode ignorar oportunisticamente determinadas tentativas se um ponto final estiver consistentemente em mau estado de funcionamento, estar inativo durante um longo período ou parecer estar sobrecarregado.

Política de Repetição

Pode personalizar a política de repetição ao criar uma subscrição de evento com as duas configurações seguintes. Um evento é removido se um dos limites da política de repetição for atingido.

  • Número máximo de tentativas – o valor tem de ser um número inteiro entre 1 e 30. O valor predefinido é 30.
  • TTL (Time-to-Live) do evento – o valor tem de ser um número inteiro entre 1 e 1440. O valor predefinido é 1440 minutos

Para obter o comando da CLI de exemplo e do PowerShell para configurar estas definições, veja Definir política de repetição.

Nota

Se definir e Event time to live (TTL)Maximum number of attempts, o Event Grid utiliza o primeiro para expirar para determinar quando parar a entrega de eventos. Por exemplo, se definir 30 minutos como tempo de vida (TTL) e 5 tentativas de entrega máximas. Quando um evento não é entregue após 30 minutos (ou) não é entregue após 5 tentativas, o que ocorrer primeiro, o evento é entregue sem letras. Se definir o número máximo de tentativas de entrega como 10, no que diz respeito ao agendamento exponencial de repetições, o número máximo de tentativas de entrega ocorrerá antes de 30 minutos o TTL será atingido, pelo que definir o número máximo de tentativas para 10 não terá qualquer impacto neste caso e os eventos serão incorretos após 30 minutos.

Criação de batches de saída

O Event Grid tem a predefinição de enviar cada evento individualmente aos subscritores. O subscritor recebe uma matriz com um único evento. Pode configurar o Event Grid para eventos em lote para entrega para um desempenho HTTP melhorado em cenários de alto débito. O batching está desativado por predefinição e pode ser ativado por subscrição.

Política de criação de lotes

A entrega em lotes tem duas definições:

  • Máximo de eventos por lote – número máximo de eventos que o Event Grid fornece por lote. Este número nunca será excedido, no entanto, poderão ser entregues menos eventos se não existirem outros eventos disponíveis no momento da publicação. O Event Grid não atrasa os eventos para criar um lote se estiverem disponíveis menos eventos. Tem de estar entre 1 e 5000.
  • Tamanho preferencial do lote em kilobytes – limite de destino para o tamanho do lote em quilobytes. Semelhante ao máximo de eventos, o tamanho do lote pode ser menor se não estiverem disponíveis mais eventos no momento da publicação. É possível que um lote seja maior do que o tamanho preferencial do lote se um único evento for maior do que o tamanho preferencial. Por exemplo, se o tamanho preferencial for 4 KB e um evento de 10 KB for enviado para o Event Grid, o evento de 10 KB continuará a ser entregue no seu próprio lote em vez de ser removido.

Entrega em lote configurada numa base de subscrição por evento através do portal, da CLI, do PowerShell ou dos SDKs.

Comportamento de criação de lotes

  • Tudo ou nenhum

    O Event Grid funciona com semântica total ou nenhuma. Não suporta o sucesso parcial de uma entrega em lote. Os subscritores devem ter o cuidado de pedir apenas o número de eventos por lote que conseguirem processar razoavelmente em 30 segundos.

  • Criação de lotes otimista

    As definições de política de criação de lotes não são limites estritos no comportamento de criação de lotes e são respeitadas numa base de melhor esforço. Com taxas de eventos baixas, observará frequentemente que o tamanho do lote é menor do que os eventos máximos pedidos por lote.

  • A predefinição está definida como DESATIVADO

    Por predefinição, o Event Grid só adiciona um evento a cada pedido de entrega. A forma de ativar o batching é definir uma das definições mencionadas anteriormente no artigo no JSON da subscrição de eventos.

  • Valores predefinidos

    Não é necessário especificar as definições (Máximo de eventos por lote e Tamanho aproximado do lote em bytes de quilo) ao criar uma subscrição de evento. Se apenas uma definição estiver definida, o Event Grid utiliza valores predefinidos (configuráveis). Veja as secções seguintes para obter os valores predefinidos e como os substituir.

Portal do Azure:

Verá estas definições no separador Funcionalidades Adicionais da página Subscrição de Eventos .

Captura de ecrã a semear o separador Funcionalidades Adicionais da página Subscrição de Eventos com a secção Batching realçada.

CLI do Azure

Ao criar uma subscrição de evento, utilize os seguintes parâmetros:

  • max-events-per-batch - Número máximo de eventos num lote. Tem de ser um número entre 1 e 5000.
  • preferred-batch-size-in-kilobytes - Tamanho preferencial do lote em kilobytes. Tem de ser um número entre 1 e 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 obter mais informações sobre como utilizar a CLI do Azure com o Event Grid, veja Encaminhar eventos de armazenamento para o ponto final Web com a CLI do Azure.

Entrega Atrasada

À medida que um ponto final experimenta falhas de entrega, o Event Grid começa a atrasar a entrega e a repetição de eventos para esse ponto final. Por exemplo, se os primeiros 10 eventos publicados num ponto final falharem, o Event Grid pressupõe que o ponto final está a ter problemas e irá atrasar todas as repetições subsequentes e novas entregas durante algum tempo , em alguns casos até várias horas.

O objetivo funcional da entrega atrasada é proteger pontos finais em mau estado de funcionamento e o sistema do Event Grid. Sem o back-off e o atraso da entrega em pontos finais em mau estado de funcionamento, a política de repetição e as capacidades de volume do Event Grid podem facilmente sobrecarregar um sistema.

Eventos de cartas não entregues

Quando o Event Grid não consegue entregar um evento num determinado período de tempo ou depois de tentar entregar o evento um determinado número de vezes, pode enviar o evento não entregue para uma conta de armazenamento. Este processo é conhecido como mensagens não entregues. Event Grid dead-letters um evento quando uma das seguintes condições é cumprida.

  • O evento não é entregue dentro do período de tempo de vida .
  • O número de tentativas de entrega do evento excedeu o limite.

Se qualquer uma das condições for cumprida, o evento é ignorado ou não entregue. Por predefinição, o Event Grid não ativa as letras não entregues. Para a ativar, tem de especificar uma conta de armazenamento para conter eventos não entregues ao criar a subscrição de eventos. Extrai eventos desta conta de armazenamento para resolver entregas.

O Event Grid envia um evento para a localização de mensagens não entregues quando tenta todas as tentativas de repetição. Se o Event Grid receber um código de resposta 400 (Pedido Incorreto) ou 413 (Entidade de Pedido Demasiado Grande), agenda imediatamente o evento para mensagens não entregues. Estes códigos de resposta indicam que a entrega do evento nunca terá êxito.

A expiração do time-to-live é verificada APENAS na próxima tentativa de entrega agendada. Assim, mesmo que o time-to-live expire antes da próxima tentativa de entrega agendada, a expiração do evento é verificada apenas no momento da próxima entrega e, em seguida, não entregue.

Há um atraso de cinco minutos entre a última tentativa de entregar um evento e quando é entregue na localização da carta não entregue. Este atraso destina-se a reduzir o número de operações de armazenamento de Blobs. Se a localização da carta não entregue estiver indisponível durante quatro horas, o evento será removido.

Antes de definir a localização da letra não entregue, tem de ter uma conta de armazenamento com um contentor. Fornece o ponto final para este contentor ao criar a subscrição de eventos. O ponto final está no formato de: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-name>/blobServices/default/containers/<container-name>

Poderá querer ser notificado quando um evento tiver sido enviado para a localização da carta não entregue. Para utilizar o Event Grid para responder a eventos não entregues, crie uma subscrição de evento para o armazenamento de blobs de letras não entregues. Sempre que o armazenamento de blobs não entregue recebe um evento não entregue, o Event Grid notifica o processador. O processador responde com as ações que pretende efetuar para reconciliar eventos não entregues. Para obter um exemplo de como configurar uma localização sem mensagens não entregues e políticas de repetição, veja Políticas de repetição e cartas não entregues.

Nota

Se ativar a identidade gerida para mensagens não entregues, terá de adicionar a identidade gerida à função de controlo de acesso baseado em funções (RBAC) adequada na conta de Armazenamento do Azure que irá conter os eventos não entregues. Para obter mais informações, veja Destinos suportados e funções do Azure.

Formatos de eventos de entrega

Esta secção fornece-lhe exemplos de eventos e eventos não entregues em diferentes formatos de esquema de entrega (esquema do Event Grid, esquema CloudEvents 1.0 e esquema personalizado). Para obter mais informações sobre estes formatos, veja Artigos de esquema do Event Grid e Eventos na Cloud 1.0 .

Esquema do 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 de carta não entregue

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

Eis os valores possíveis de e as respetivas descrições lastDeliveryOutcome .

LastDeliveryOutcome Descrição
NotFound O recurso de destino não foi encontrado.
Desativado O destino desativou a receção de eventos. Aplicável a Azure Service Bus e Hubs de Eventos do Azure.
Completa Foi excedido o número máximo de operações permitidas no destino. Aplicável a Azure Service Bus e Hubs de Eventos do Azure.
Não autorizado O destino devolveu o código de resposta não autorizado.
BadRequest O destino devolveu o código de resposta de pedido incorreto.
Tempo Limite Excedido A operação de entrega excedeu o limite de tempo.
Ocupado O servidor de destino está ocupado.
PayloadTooLarge O tamanho da mensagem excedeu o tamanho máximo permitido pelo destino. Aplicável a Azure Service Bus e Hubs de Eventos do Azure.
Condicional O destino é colocado em liberdade condicional pelo Event Grid. A entrega não é tentada durante a condicional.
Cancelado Operação de entrega cancelada.
Abortada A entrega foi abortada pelo Event Grid após um intervalo de tempo.
SocketError Ocorreu um erro de comunicação de rede durante a entrega.
ResolutionError Falha na resolução de DNS do ponto final de destino.
A entregar Entrega de eventos ao destino.
SessionQueueNotSupported A entrega de eventos sem ID de sessão é tentada numa entidade, que tem o suporte de sessão ativado. Aplicável para Azure Service Bus destino da entidade.
Proibido A entrega é proibida pelo ponto final de destino (pode dever-se a firewalls de IP ou outras restrições)
InvalidAzureFunctionDestination A função do Azure de destino não é válida. Provavelmente porque não tem o tipo EventGridTrigger.

LastDeliveryOutcome: Condicional

Uma subscrição de evento é colocada em liberdade condicional durante um período pelo Event Grid se as entregas de eventos a esse destino começarem a falhar. O tempo de liberdade condicional é diferente para os diferentes erros devolvidos pelo ponto final de destino. Se uma subscrição de evento estiver em liberdade condicional, os eventos podem ser entregues ou removidos sem sequer tentar a entrega, dependendo do código de erro devido ao qual está em liberdade condicional.

Erro Duração da Condicional
Ocupado 10 segundos
NotFound 5 minutos
SocketError 30 segundos
ResolutionError 5 minutos
Desativado 5 minutos
Completa 5 minutos
Tempo Limite Excedido 10 segundos
Não autorizado 5 minutos
Proibido 5 minutos
InvalidAzureFunctionDestination 10 minutos

Nota

O Event Grid utiliza a duração da condicional para uma melhor gestão da entrega e a duração poderá mudar no 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 de cartas não entregues

{
    "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 de cartas não entregues

{
    "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 da entrega de mensagens

O Event Grid utiliza códigos de resposta HTTP para reconhecer a receção de eventos.

Códigos de êxito

O Event Grid considera apenas os seguintes códigos de resposta HTTP como entregas bem-sucedidas. Todos os outros códigos de estado são considerados entregas falhadas e serão repetidos ou inativos conforme adequado. Quando o Event Grid recebe um código de estado com êxito, considera a entrega concluída.

  • 200 OK
  • 201 Criado
  • 202 Aceite
  • 203 Informações Não Autoritativas
  • 204 Sem Conteúdo

Códigos de falha

Todos os outros códigos que não se encontram no conjunto acima (200-204) são considerados falhas e serão repetidos (se necessário). Alguns têm políticas de repetição específicas associadas às mesmas descritas abaixo, todas as outras seguem o modelo de back-off exponencial padrão. É importante ter em conta que, devido à natureza altamente paralela da arquitetura do Event Grid, o comportamento de repetição não é determinista.

Código de estado Comportamento de repetição
400 Pedido Incorreto Não repetido
401 Não Autorizado Repetir após 5 minutos ou mais para Pontos Finais de Recursos do Azure
403 Proibido Não repetido
404 Não Encontrado Repetir após 5 minutos ou mais para Pontos Finais de Recursos do Azure
408 Tempo Limite do Pedido Repetir após 2 minutos ou mais
413 Entidade de Pedido Demasiado Grande Não repetido
503 Serviço Indisponível Repetir após 30 segundos ou mais
Todos os outros Repetir após 10 segundos ou mais

Propriedades de entrega personalizadas

As subscrições de eventos permitem-lhe configurar cabeçalhos HTTP incluídos em eventos entregues. Esta capacidade permite-lhe definir cabeçalhos personalizados que são necessários por um destino. Pode configurar até 10 cabeçalhos ao criar uma subscrição de evento. Cada valor de cabeçalho não deve ser superior a 4.096 (4K) bytes. Pode definir cabeçalhos personalizados nos eventos que são entregues nos seguintes destinos:

  • Webhooks
  • Azure Service Bus tópicos e filas
  • Azure Event Hubs
  • Reencaminhar Ligações Híbridas

Para obter mais informações, veja Propriedades de entrega personalizadas.

Passos seguintes