Entrega e repetição de mensagens da Grade de Eventos

A entrega proporcionada pela Grade de Eventos tem um tempo de duração. Ela tenta entregar cada mensagem pelo menos uma vez para cada assinatura correspondente imediatamente. Se o ponto de extremidade de um assinante não confirmar o recebimento de um evento ou se houver uma falha, a Grade de Eventos tentará a entrega novamente com base em uma agenda de repetição e em uma política de repetição. Por padrão, a Grade de Eventos entrega um evento de cada vez ao assinante. No entanto, o conteúdo é uma matriz com um evento único.

Observação

A Grade de Eventos não garante a ordem de entrega de eventos, portanto, os assinantes podem recebê-los fora de ordem.

Agenda de repetição

Quando a Grade de Eventos recebe um erro de uma tentativa de entrega de evento, ele decide se deve tentar novamente a entrega, armazena o evento como mensagem morta ou o remove de acordo com o tipo de erro.

Se o erro retornado pelo ponto de extremidade assinado for um erro relacionado à configuração que não pode ser corrigido com novas tentativas (por exemplo, se o ponto de extremidade for excluído), a Grade de Eventos armazena o evento como mensagem morta ou removerá o evento se o armazenamento de mensagens mortas não estiver configurado.

A seguinte tabela descreve os tipos de pontos de extremidade e erros para os quais não acontecem novas tentativas:

Tipo de Ponto de Extremidade Códigos do Erro
Recursos do Azure 400 (Solicitação incorreta), 413 (A entidade de solicitação é muito grande)
webhook 400 (Solicitação incorreta), 413 (A entidade de solicitação é muito grande), 401 (Não autorizada)

Observação

Se o Armazenamento de Mensagens Mortas não estiver configurado para um ponto de extremidade, os eventos serão removidos quando os erros acima ocorrerem. Considere configurar o Armazenamento de Mensagens Mortas se você não quiser que esses tipos de eventos sejam removidos. Eventos com mensagens mortas serão descartados quando o destino da mensagem morta não for encontrado.

Se o erro retornado pelo ponto de extremidade inscrito não estiver entre a lista acima, a Grade de Eventos executará a nova tentativa utilizando a política descrita abaixo:

A Grade de Eventos aguarda 30 segundos por uma resposta depois de entregar uma mensagem. Após 30 segundos, se o ponto de extremidade não tiver respondido, a mensagem será enfileirada para uma nova tentativa. A Grade de Eventos usa uma política de repetição de retirada exponencial para a entrega de eventos. A Grade de Eventos repete a entrega usando a seguinte agenda com base no melhor esforço:

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

Se o ponto de extremidade responder dentro de 3 minutos, a Grade de Eventos tentará remover o evento da fila de tentativas com o melhor esforço possível, mas duplicatas ainda poderão ser recebidas.

A Grade de Eventos adiciona uma pequena aleatoriedade a todas as etapas de repetição e pode ignorar oportunamente determinadas tentativas se um ponto de extremidade estiver não íntegro de modo consistente, inativo por um longo período ou parecer sobrecarregado.

Política de Repetição

Você pode personalizar a política de repetição ao criar uma assinatura de evento usando as duas configurações a seguir. Um evento é descartado se qualquer um dos limites da política de repetição for atingido.

  • Número máximo de tentativas – o valor precisa ser um número inteiro entre 1 e 30. O valor padrão é 30.
  • TTL (vida útil do evento) - O valor precisa ser um número inteiro entre 1 e 1440. O valor padrão é 1440 minutos

Para ver a CLI de exemplo e o comando do PowerShell para definir essas configurações, consulte Definir política de repetição.

Observação

Se você definir ambos Event time to live (TTL) e Maximum number of attempts, a Grade de Eventos usa o primeiro para expirar, a fim de determinar quando parar a entrega de eventos. Por exemplo, se você definir 30 minutos como vida útil (TTL) e um máximo de 5 tentativas de entrega. Quando um evento não é entregue após 30 minutos (ou) não é entregue após 5 tentativas, o que ocorrer primeiro, o evento é considerado morto. Se você definir o máximo de tentativas de entrega como 10, em relação à agenda de repetição exponencial, o número máximo de 6 tentativas de entrega ocorrerá antes de 30 minutos, a TTL será atingida, portanto, definir o número máximo de tentativas como 10 não terá impacto nesse caso e os eventos inativados após 30 minutos.

Envio em lote de saída

A Grade de Eventos usa como padrão o envio individual de cada evento aos assinantes. O assinante recebe uma matriz com um único evento. Você pode configurar a Grade de Eventos para eventos em lote para entrega de um desempenho de HTTP aprimorado em cenários de alta taxa de transferência. O envio em lote é desativado por padrão e pode ser ativado por assinatura.

Política de envio em lote

A entrega em lote tem duas configurações:

  • Máximo de eventos por lote: número máximo de eventos que a Grade de Eventos entrega por lote. Esse número nunca será excedido, mas menos eventos poderão ser entregues se nenhum outro evento estiver disponível no momento da publicação. A Grade de Eventos não atrasará eventos de criação de lote se menos eventos estiverem disponíveis. Esse valor precisa estar entre 1 e 5.000.
  • Tamanho de lote preferencial em quilobytes – O limite de destino do tamanho do lote em quilobytes. Semelhante ao máximo de eventos, o tamanho do lote poderá ser menor se mais eventos não estiverem disponíveis no momento da publicação. É possível que um lote seja maior do que o tamanho de lote preferencial se um 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 por push para a Grade de Eventos, o evento de 10 KB ainda será entregue no próprio lote, em vez de ser removido.

A entrega em lote é configurada em uma assinatura por evento por meio do portal, da CLI, do PowerShell ou de SDKs.

Comportamento de envio em lote

  • Tudo ou nada

    A Grade de Eventos opera com a semântica tudo ou nada. Ela não dá suporte ao sucesso parcial de uma entrega em lote. Os assinantes devem ter o cuidado de solicitar apenas a quantidade de eventos por lote que puderem processar em 30 segundos.

  • Envio em lote otimista

    As configurações de política de envio em lote não são limites estritos no comportamento de envio em lote e são respeitadas com base no melhor esforço. Em taxas de eventos baixas, geralmente você observará que o tamanho do lote é menor do que o máximo de eventos solicitados por lote.

  • O padrão é definido como OFF

    Por padrão, a Grade de Eventos adiciona apenas um evento a cada solicitação de entrega. A maneira de ativar o envio em lote é definir qualquer uma das configurações mencionadas anteriormente no artigo no JSON da assinatura de evento.

  • Valores padrão

    Não é necessário especificar as configurações (máximo de eventos por lote e tamanho de lote aproximado em quilobytes) ao criar uma assinatura de evento. Se apenas uma configuração for definida, a Grade de Eventos usará valores padrão (configuráveis). Confira as seções a seguir para obter os valores padrão e como substituí-los.

Portal do Azure:

Você verá essas configurações na guia Recursos adicionais da página Assinatura do evento.

Captura de tela mostrando a guia Recursos adicionais da página Assinatura de Eventos com a seção de Envio em Lote realçada.

CLI do Azure

Ao criar uma assinatura de evento, use os seguintes parâmetros:

  • max-events-per-batch – Número máximo de eventos em um lote. O valor precisa ser um número entre 1 e 5000.
  • preferred-batch-size-in-kilobytes – Tamanho de lote preferencial em quilobytes. O valor precisa 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 usar a CLI do Azure com a Grade de Eventos, confira Rotear eventos de armazenamento para o ponto de extremidade da Web com a CLI do Azure.

Entrega atrasada

À medida que um ponto de extremidade experimenta falhas na entrega, a Grade de Eventos começa a atrasar a entrega e a repetição de eventos para esse ponto de extremidade. Por exemplo, se os primeiros 10 eventos publicados em um ponto de extremidade falharem, a Grade de Eventos assume que o ponto de extremidade está enfrentando problemas e atrasará todas as tentativas subsequentes e novas entregas por algum tempo, em alguns casos, até por várias horas.

A finalidade funcional da entrega atrasada é proteger os pontos de extremidade não íntegros e o sistema de Grade de Eventos. Sem retirada e atraso de entrega para pontos de extremidade não íntegros, a política de repetição da Grade de Eventos e as capacidades de volume podem facilmente sobrecarregar um sistema.

Eventos de mensagens mortas

Quando a Grade de Eventos não puder entregar um evento dentro de um determinado período ou depois de tentar entregar o evento um determinado número de vezes, ela poderá enviar o evento não entregue a uma conta de armazenamento. Esse processo é conhecido como armazenamento de mensagens mortas. A Grade de Eventos armazena mensagens mortas de um evento quando uma das condições a seguir é atendida.

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

Se qualquer uma das condições for atendida, o evento será removido ou armazenado como mensagem morta. Por padrão, a Grade de Eventos não ativa o armazenamento de mensagens mortas. Para habilitá-lo, você deve especificar uma conta de armazenamento para reter eventos que não foram entregues ao criar a assinatura do evento. Você aciona eventos dessa conta de armazenamento para resolver as entregas.

A Grade de Eventos enviará um evento ao local de mensagens mortas quando ela tiver tentado todas as suas tentativas de repetição. Se a Grade de Eventos receber um código de resposta 400 (Solicitação Inválida) ou 413 (Entidade de Solicitação Muito Grande), ela agendará imediatamente o evento para o armazenamento de mensagens mortas. Esses códigos de resposta indicam que a entrega do evento nunca terá êxito.

O término da vida útil é verificado APENAS na próxima tentativa de entrega agendada. Portanto, mesmo se a vida útil expirar antes da próxima tentativa de entrega agendada, a expiração do evento será verificada somente no momento da próxima entrega e o armazenamento de mensagens mortas será realizado em seguida.

Há um atraso de cinco minutos entre a última tentativa de entrega de um evento e quando ele é entregue para o local de inatividade. Esse atraso tem como objetivo reduzir o número de operações de Armazenamento de Blobs. Se o local de mensagens mortas não estiver disponível por quatro horas, o evento será descartado.

Antes de configurar o local de mensagens mortas, você deve ter uma conta de armazenamento com um contêiner. É possível fornecer o ponto de extremidade para esse contêiner ao criar a assinatura do evento. O ponto de extremidade está no formato de: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-name>/blobServices/default/containers/<container-name>

Talvez você queira ser notificado quando um evento tiver sido enviado para a localização das mensagens mortas. Para usar a Grade de Eventos para responder a eventos não entregues, crie uma assinatura de evento para o armazenamento de blob de mensagens mortas. Toda vez que seu armazenamento de blob de mensagens mortas recebe um evento não entregue, a Grade de Eventos notifica o manipulador. O manipulador responde com ações que você deseja executar para reconciliar eventos não entregues. Para ver um exemplo de como configurar uma localização de mensagens mortas e políticas de repetição, confira Mensagens mortas e políticas de repetição.

Observação

Se você habilitar a identidade gerenciada para mensagens mortas, precisará adicionar a identidade gerenciada à função RBAC (controle de acesso baseado em função) apropriada na conta de Armazenamento do Azure que conterá os eventos com mensagens mortas. Para obter mais informações, consulte Funções do Azure e destinos compatíveis.

Formatos de evento de entrega

Esta seção fornece exemplos de eventos e eventos de mensagens mortas em formatos de esquema de entrega diferentes (esquema de Grade de Eventos, esquema do CloudEvents 1.0 e esquema personalizado). Para obter mais informações sobre esses formatos, confira os artigos Esquema da Grade de Eventos e Esquema do Cloud Events 1.0.

Esquema da Grade de Eventos

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 mensagens mortas

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

Aqui estão os valores possíveis de lastDeliveryOutcome e suas descrições.

LastDeliveryOutcome Descrição
NotFound O recurso de destino não foi encontrado.
Desabilitado O destino desabilitou eventos de recebimento. Aplicável ao Barramento de Serviço do Azure e aos Hubs de Eventos do Azure.
Completo Número máximo excedido de operações permitidas no destino. Aplicável ao Barramento de Serviço do Azure e aos Hubs de Eventos do Azure.
Não Autorizado O destino retornou um código de resposta não autorizado.
BadRequest O destino retornou um código de resposta de solicitação ruim.
TimedOut A operação de entrega atingiu o tempo limite.
Ocupado O servidor de destino está ocupado.
PayloadTooLarge O tamanho da mensagem excedeu o tamanho máximo permitido pelo destino. Aplicável ao Barramento de Serviço do Azure e aos Hubs de Eventos do Azure.
Avaliação O destino é colocado em avaliação pela Grade de Eventos. A entrega não é tentada durante a avaliação.
Canceled Operação de entrega cancelada.
Anulado A entrega foi anulada pela Grade de Eventos após um intervalo de tempo.
SocketError Ocorreu um erro de comunicação de rede durante a entrega.
ResolutionError Falha na resolução do DNS do ponto de extremidade de destino.
Fornecimento Entrega de eventos para o destino.
SessionQueueNotSupported A entrega de eventos sem a ID da sessão é tentada em uma entidade que tem suporte de sessão habilitado. Aplicável ao destino da entidade do Barramento de Serviço Azure.
Proibido A entrega é proibida pelo ponto de extremidade de destino (pode ser devido a firewalls IP ou outras restrições)
InvalidAzureFunctionDestination A função do Azure de destino não é válida. Provavelmente porque ele não tem o tipo EventGridTrigger.

LastDeliveryOutcome: Avaliação

Uma assinatura de evento será colocada em avaliação por uma duração pela Grade de Eventos se as entregas de eventos para esse destino começarem a falhar. O tempo de avaliação é diferente para erros diferentes retornados pelo ponto de extremidade de destino. Se uma assinatura de evento estiver em avaliação, os eventos poderão receber mensagens mortas ou descartadas sem nem mesmo tentar a entrega, dependendo do código de erro, devido ao qual ela está em avaliação.

Erro Duração da avaliação
Ocupado 10 segundos
NotFound 5 minutos
SocketError 30 segundos
ResolutionError 5 minutos
Desabilitado 5 minutos
Completo 5 minutos
TimedOut 10 segundos
Não Autorizado 5 minutos
Proibido 5 minutos
InvalidAzureFunctionDestination 10 minutos

Observação

A Grade de Eventos usa a duração da avaliação para um melhor gerenciamento de entrega e a duração pode mudar no futuro.

Esquema do 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 mensagens mortas

{
    "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 mensagens mortas

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

Status de entrega da mensagem

A Grade de Eventos usa códigos de resposta HTTP para confirmar o recebimento de eventos.

Códigos de sucesso

A Grade de Eventos considera apenas os códigos de resposta HTTP a seguir como entregas bem-sucedidas. Todos os outros códigos de status são considerados entregas com falha e serão repetidos ou armazenados como mensagens mortas, conforme apropriado. Quando a Grade de Eventos recebe um código de status bem-sucedido, considera a entrega concluída.

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

Códigos de falha

Todos os outros códigos que não estão no conjunto acima (200 a 204) são considerados falhas e serão repetidos (se necessário). Alguns têm políticas de repetição específicas ligadas a eles descritas abaixo e todos os outros seguem o modelo de retirada exponencial padrão. É importante ter em mente que, devido à natureza altamente paralelizada da arquitetura da Grade de Eventos, o comportamento de repetição é não determinístico.

Código de status Tentar comportamento novamente
400 Solicitação Inválida Não tentar novamente
401 Não Autorizado Tentar novamente após cinco minutos ou mais para os Pontos de Extremidade de Recursos do Azure
403 Proibido Não tentar novamente
404 Não Encontrado Tentar novamente após cinco minutos ou mais para os Pontos de Extremidade de Recursos do Azure
408 Tempo Limite da Solicitação Tentar novamente após dois minutos ou mais
Solicitação 413 entidade muito grande Não tentar novamente
503 Serviço Indisponível Tentar novamente após 30 segundos ou mais
Todos os outros Tentar novamente após dez segundos ou mais

Propriedades de entrega personalizadas

As assinaturas de evento permitem que você configure cabeçalhos HTTP que estão incluídos nos eventos entregues. Essa funcionalidade permite que você defina cabeçalhos personalizados que são exigidos por um destino. Você pode configurar até dez cabeçalhos ao criar uma assinatura de evento. Cada valor de cabeçalho não deve ser maior que 4.096 (4K) bytes. Você pode definir os cabeçalhos personalizados nos eventos que são entregues aos seguintes destinos:

  • Webhooks
  • Tópicos e filas do Barramento de Serviço do Azure
  • Hubs de eventos do Azure
  • Conexões híbridas de retransmissão

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

Próximas etapas