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

A Grade de Eventos fornece uma entrega durável. Ele 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á novamente a entrega com base em uma agenda de repetição fixa e política de novas tentativas. Por padrão, a Grade de Eventos entrega um evento de cada vez ao assinante. A carga é, no entanto, uma matriz com um único evento.

Nota

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

Cronograma de novas tentativas

Quando a Grade de Eventos recebe um erro para uma tentativa de entrega de evento, a Grade de Eventos decide se deve repetir a entrega, enviar o evento por carta morta ou descartar o evento com base no tipo de erro.

Se o erro retornado pelo ponto de extremidade inscrito 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 executará letras mortas no evento ou descartará o evento se a letra morta não estiver configurada.

A tabela a seguir descreve os tipos de pontos de extremidade e erros para os quais a repetição não acontece:

Tipo de Ponto Final Códigos de erro
Recursos do Azure 400 (Solicitação incorreta), 413 (Entidade de solicitação é muito grande)
Webhook 400 (Solicitação incorreta), 413 (A entidade da solicitação é muito grande), 401 (Não autorizada)

Nota

Se a letra morta não estiver configurada para um ponto de extremidade, os eventos serão descartados quando os erros acima acontecerem. Considere configurar a letra morta se não quiser que esses tipos de eventos sejam descartados. Os eventos com letra morta serão descartados quando o destino da letra 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 usando 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 nova tentativa. A Grade de Eventos usa uma política de repetição de backoff exponencial para a entrega de eventos. A Grade de Eventos tenta novamente a entrega no seguinte cronograma 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 de extremidade responder dentro de 3 minutos, a Grade de Eventos tentará remover o evento da fila de tentativas com base no melhor esforço, mas duplicatas ainda poderão ser recebidas.

A Grade de Eventos adiciona uma pequena randomização a todas as etapas de repetição e pode ignorar oportunisticamente certas tentativas se um ponto de extremidade estiver consistentemente não íntegro, inativo por um longo período ou parecer estar 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 será descartado se qualquer um dos limites da política de repetição for atingido.

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

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

Nota

Se você definir ambos Event time to live (TTL) e Maximum number of attempts, a Grade de Eventos usará o primeiro a expirar para determinar quando interromper a entrega de eventos. Por exemplo, se você definir 30 minutos como tempo de vida (TTL) e 5 tentativas máximas de entrega. Quando um evento não é entregue após 30 minutos (ou) não é entregue após 5 tentativas, o que acontecer primeiro, o evento é escrito sem saída. Se você definir o número máximo de tentativas de entrega para 10, com relação ao cronograma exponencial de novas tentativas, o número máximo de 6 tentativas de entrega acontece antes de 30 minutos TTL será alcançado, portanto, definir o número máximo de tentativas para 10 não terá impacto neste caso e os eventos serão mortos após 30 minutos.

Criação de batches de saída

O padrão da Grade de Eventos é enviar cada evento individualmente para os assinantes. O assinante recebe uma matriz com um único evento. Você pode configurar a Grade de Eventos para eventos em lote para entrega para melhorar o desempenho HTTP em cenários de alta taxa de transferência. O envio em lote está desativado por padrão e pode ser ativado por assinatura.

Política de lotes

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. Este número nunca será excedido, no entanto, menos eventos podem ser entregues se nenhum outro evento estiver disponível no momento da publicação. A Grade de Eventos não atrasa eventos para criar um lote se houver menos eventos disponíveis. Deve ter entre 1 e 5.000.
  • Tamanho de lote preferido em kilobytes - Teto de destino para o tamanho do lote em kilobytes. Semelhante aos eventos máximos, o tamanho do lote pode 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 preferido se um único evento for maior do que o tamanho preferido. 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 em seu próprio lote, em vez de ser descartado.

Entrega em lote configurada em uma base de assinatura por evento por meio do portal, CLI, PowerShell ou SDKs.

Comportamento de envio em lote

  • Tudo ou nenhum

    A Grade de Eventos opera com semântica de tudo ou nada. Ele não suporta o sucesso parcial de uma entrega de lote. Os subscritores devem ter o cuidado de pedir apenas tantos eventos por lote quantos puderem razoavelmente processar em 30 segundos.

  • Lote otimista

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

  • O padrão está 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 processamento em lote é definir uma das configurações mencionadas anteriormente no artigo no evento de assinatura JSON.

  • Valores predefinidos

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

Portal do Azure:

Estas definições são apresentadas no separador Funcionalidades Adicionais da página Subscrição de Eventos .

Captura de tela semeando a guia Recursos Adicionais da página Assinatura de Evento com a seção Lotes 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. Deve ser um número entre 1 e 5000.
  • preferred-batch-size-in-kilobytes - Tamanho de lote preferido em kilobytes. Deve 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, consulte Rotear eventos de armazenamento para o ponto de extremidade da Web com a CLI do Azure.

Atraso na entrega

À medida que um ponto de extremidade sofre falhas de 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 assumirá que o ponto de extremidade está enfrentando problemas e atrasará todas as novas tentativas subsequentes e novas entregas por algum tempo - em alguns casos, até várias horas.

O objetivo funcional da entrega atrasada é proteger pontos de extremidade não íntegros e o sistema de grade de eventos. Sem back-off e atraso de entrega para pontos de extremidade não íntegros, a política de repetição e os recursos de volume da Grade de Eventos podem facilmente sobrecarregar um sistema.

Eventos de letra morta

Quando a Grade de Eventos não consegue entregar um evento dentro de um determinado período de tempo ou depois de tentar entregar o evento um determinado número de vezes, ele pode enviar o evento não entregue para uma conta de armazenamento. Este processo é conhecido como dead-lettering. Grade de Eventos é um evento quando uma das seguintes condições é atendida.

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

Se qualquer uma das condições for cumprida, o evento é descartado ou colocado em letra morta. Por padrão, a Grade de Eventos não ativa letras mortas. Para habilitá-lo, você deve especificar uma conta de armazenamento para armazenar eventos não entregues ao criar a assinatura do evento. Você extrai eventos dessa conta de armazenamento para resolver entregas.

A Grade de Eventos envia um evento para o local de letra morta quando ele tenta todas as suas tentativas de repetição. Se a Grade de Eventos receber um código de resposta 400 (Solicitação incorreta) ou 413 (Solicitação muito grande), ela agendará imediatamente o evento para letras mortas. Estes códigos de resposta indicam que a entrega do evento nunca terá sucesso.

O tempo de expiração é verificado APENAS na próxima tentativa de entrega agendada. Assim, mesmo que o tempo de vida expire antes da próxima tentativa de entrega programada, a expiração do evento é verificada apenas no momento da próxima entrega e, posteriormente, com letra morta.

Há um atraso de cinco minutos entre a última tentativa de entregar um evento e quando ele é entregue no local de letra morta. Esse atraso destina-se a reduzir o número de operações de armazenamento de Blob. Se o local da letra morta ficar indisponível por quatro horas, o evento será descartado.

Antes de definir o local de letra morta, você deve ter uma conta de armazenamento com um contêiner. Você fornece 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 for enviado para o local de letra morta. Para usar a Grade de Eventos para responder a eventos não entregues, crie uma assinatura de evento para o armazenamento de blob de letra morta. Sempre que o armazenamento de blob de letra morta 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 obter um exemplo de configuração de um local de letra morta e políticas de repetição de novas tentativas, consulte Políticas de letra morta e de nova tentativa.

Nota

Se você habilitar a identidade gerenciada para letras 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 letras mortas. Para obter mais informações, consulte Destinos suportados e funções do Azure.

Formatos de eventos de entrega

Esta seção fornece exemplos de eventos e eventos com letras mortas em diferentes formatos de esquema de entrega (esquema de grade de eventos, esquema do CloudEvents 1.0 e esquema personalizado). Para obter mais informações sobre esses formatos, consulte Esquema de grade de eventos e artigos de esquema de eventos de nuvem 1.0.

Esquema da Grelha 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 letra morta

{
    "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 e lastDeliveryOutcome suas descrições.

LastDeliveryOutcome Description
NotFound O recurso de destino não foi encontrado.
Desativado O destino desativou o recebimento de eventos. Aplicável ao Barramento de Serviço do Azure e Hubs de Eventos do Azure.
Total Excedeu o número máximo de operações permitidas no destino. Aplicável ao Barramento de Serviço do Azure e Hubs de Eventos do Azure.
Não autorizado O destino retornou o código de resposta não autorizado.
BadRequest O destino retornou o código de resposta de solicitação incorreta.
Tempo Limite Excedido A operação de entrega expirou.
Ocupado O servidor de destino está ocupado.
Carga útilTooLarge O tamanho da mensagem excedeu o tamanho máximo permitido pelo destino. Aplicável ao Barramento de Serviço do Azure e Hubs de Eventos do Azure.
Liberdade condicional O destino é colocado em liberdade condicional pela Grade de Eventos. O parto não é tentado durante a liberdade condicional.
Cancelada Operação de entrega cancelada.
Abortado A entrega foi abortada pela Grade de Eventos após um intervalo de tempo.
Erro de soquete Ocorreu um erro de comunicação de rede durante a entrega.
ResoluçãoErro Falha na resolução DNS do ponto de extremidade de destino.
Entrega Entrega de eventos no destino.
SessionQueueNotSupported A entrega de eventos sem ID de sessão é tentada em uma entidade, que tem o suporte à sessão habilitado. Aplicável ao destino da entidade do Barramento de Serviço do 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 não tem o tipo EventGridTrigger.

LastDeliveryOutcome: Liberdade condicional

Uma assinatura de evento é colocada em liberdade condicional por um período pela Grade de Eventos se as entregas de eventos para esse destino começarem a falhar. O tempo de teste é diferente para diferentes erros retornados pelo ponto de extremidade de destino. Se uma assinatura de evento estiver em liberdade condicional, os eventos podem ser cancelados ou descartados sem sequer tentar a entrega, dependendo do código de erro devido ao qual está em liberdade condicional.

Erro Duração da liberdade condicional
Ocupado 10 segundos
NotFound 5 minutos
Erro de soquete 30 segundos
ResoluçãoErro 5 minutos
Desativado 5 minutos
Total 5 minutos
Tempo Limite Excedido 10 segundos
Não autorizado 5 minutos
Proibido 5 minutos
InvalidAzureFunctionDestination 10 minutos

Nota

A Grade de Eventos usa a duração da liberdade condicional para um melhor gerenciamento da 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 letra morta

{
    "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 letra morta

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

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 seguintes códigos de resposta HTTP como entregas bem-sucedidas. Todos os outros códigos de status são considerados entregas falhadas e serão repetidos ou deadlettered conforme apropriado. Quando a Grade de Eventos recebe um código de status bem-sucedido, ela considera a entrega concluída.

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

Códigos de falha

Todos os outros códigos que não estão no conjunto (200-204) são considerados falhas e serão repetidos (se necessário). Alguns têm políticas específicas de repetição vinculadas a eles descritas aqui, todos os outros seguem o modelo de back-off 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 estado Comportamento de repetição
400 Pedido Incorreto Não repetido
401 Não Autorizado Tente novamente após 5 minutos ou mais para os Pontos de Extremidade de Recursos do Azure
403 Proibido Não repetido
404 Não Encontrado Tente novamente após 5 minutos ou mais para os Pontos de Extremidade de Recursos do Azure
408 Tempo Limite do Pedido Tente novamente após 2 minutos ou mais
413 Entidade de Pedido Demasiado Grande Não repetido
503 Serviço Indisponível Tente novamente após 30 segundos ou mais
Todos os outros Tente novamente 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. Esse recurso permite que você defina cabeçalhos personalizados que são exigidos por um destino. Você pode configurar até 10 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 cabeçalhos personalizados nos eventos que são entregues para os seguintes destinos:

  • Webhooks
  • Tópicos e filas do Barramento de Serviço do Azure
  • Hubs de Eventos do Azure
  • Conexões híbridas de relé

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

Próximos passos