Recapito di messaggi di Griglia di eventi e nuovi tentativi

Griglia di eventi fornisce il recapito durevole. Tenta di recapitare ogni messaggio almeno una volta per ogni sottoscrizione corrispondente immediatamente. Se l'endpoint di un sottoscrittore non conferma la ricezione di un evento o se si verifica un errore, Griglia di eventi ritenta il recapito in base a una pianificazione dei tentativi fissa e a un criterio di ripetizione dei tentativi. Per impostazione predefinita, Griglia di eventi recapita un evento alla volta al sottoscrittore. Il payload è tuttavia una matrice con un singolo evento.

Nota

Poiché Griglia di eventi non garantisce l'ordine per il recapito degli eventi, è possibile che i sottoscrittori non li ricevano in ordine.

Pianificazione delle ripetizioni

Quando Griglia di eventi riceve un errore per un tentativo di recapito di eventi, Griglia di eventi decide se deve ritentare il recapito, l'evento non recapitato o eliminare l'evento in base al tipo dell'errore.

Se l'errore restituito dall'endpoint sottoscritto è un errore correlato alla configurazione che non può essere risolto con tentativi (ad esempio, se l'endpoint viene eliminato), Griglia di eventi eseguirà messaggi non recapitabili sull'evento o eliminerà l'evento se non è configurato un messaggio non recapitabile.

La tabella seguente descrive i tipi di endpoint e gli errori per i quali non si verifica alcun nuovo tentativo:

Tipo di endpoint Codici di errore
Risorse di Azure 400 (richiesta non valida), 413 (l'entità richiesta è troppo grande)
webhook 400 (richiesta non valida), 413 (entità richiesta troppo grande), 401 (non autorizzato)

Nota

Se i messaggi non recapitabili non sono configurati per un endpoint, gli eventi verranno eliminati quando si verificano gli errori precedenti. Prendere in considerazione la configurazione di messaggi non recapitabili se non si vuole eliminare questi tipi di eventi. Gli eventi non recapitabili verranno eliminati quando la destinazione dei messaggi non recapitabili non viene trovata.

Se l'errore restituito dall'endpoint sottoscritto non è incluso nell'elenco precedente, Griglia di eventi esegue il nuovo tentativo usando il criterio descritto di seguito:

Griglia di eventi attende 30 secondi per una risposta dopo il recapito di un messaggio. Dopo 30 secondi, se l'endpoint non ha risposto, il messaggio viene accodato per un nuovo tentativo. Griglia di eventi usa criteri per i tentativi di tipo backoff esponenziale per il recapito degli eventi. Griglia di eventi ritenta il recapito in base alla pianificazione seguente:

  • 10 secondi
  • 30 secondi
  • 1 minuto
  • 5 minuti
  • 10 minuti
  • 30 minuti
  • 1 ora
  • 3 ore
  • 6 ore
  • Ogni 12 ore fino a 24 ore

Se l'endpoint risponde entro 3 minuti, Griglia di eventi tenta di rimuovere l'evento dalla coda di ripetizione dei tentativi in modo ottimale, ma i duplicati potrebbero comunque essere ricevuti.

Griglia di eventi aggiunge una breve randomizzazione a tutte le fasi di ripetizione dei tentativi e può ignorare in modo opportunistico alcuni tentativi se un endpoint è costantemente non integro, inattivo per un lungo periodo o sembra essere sovraccarico.

Criterio di ripetizione dei tentativi

È possibile personalizzare i criteri di ripetizione dei tentativi durante la creazione di una sottoscrizione eventi usando le due configurazioni seguenti. Un evento viene eliminato se viene raggiunto uno dei limiti dei criteri di ripetizione dei tentativi.

  • Numero massimo di tentativi: il valore deve essere un intero compreso tra 1 e 30. Il valore predefinito è 30.
  • Durata (TTL) eventi: il valore deve essere un intero compreso tra 1 e 1440. Il valore predefinito è 1440 minuti

Per l'interfaccia della riga di comando di esempio e il comando di PowerShell per configurare queste impostazioni, vedere Impostare i criteri di ripetizione dei tentativi.

Nota

Se si impostano entrambi Event time to live (TTL) e Maximum number of attempts, la Griglia di eventi usa quello che scade per primo per stabilire quando interrompere la consegna dell'evento. Ad esempio, se si impostano 30 minuti come durata (TTL) e 5 tentativi di recapito massimo. Quando un evento non viene recapitato dopo 30 minuti (o) non viene recapitato dopo 5 tentativi, a seconda di quale evento si verifichi per primo, l'evento viene recapitato senza messaggi non recapitabili. Se si imposta il numero massimo di tentativi di recapito su 10, in relazione alla pianificazione esponenziale dei tentativi, verrà raggiunto il numero massimo di tentativi di recapito prima di 30 minuti, pertanto l'impostazione del numero massimo di tentativi su 10 non avrà alcun impatto in questo caso e gli eventi verranno recapitati senza messaggi non recapitabili dopo 30 minuti.

Suddivisione in batch per l'output

Griglia di eventi per impostazione predefinita invia ogni evento singolarmente ai sottoscrittori. Il sottoscrittore riceve una matrice con un singolo evento. È possibile configurare Griglia di eventi per inviare in batch gli eventi per il recapito per migliorare le prestazioni HTTP negli scenari con velocità effettiva elevata. L'invio in batch è disattivato per impostazione predefinita e può essere attivato per ogni sottoscrizione.

Criteri di invio in batch

Il recapito in batch ha due impostazioni:

  • Numero massimo di eventi per batch : numero massimo di eventi recapitati da Griglia di eventi per batch. Questo numero non verrà mai superato, tuttavia è possibile che venga recapitato un numero inferiore di eventi se non sono disponibili altri eventi al momento della pubblicazione. Griglia di eventi non ritarda gli eventi per creare un batch se sono disponibili meno eventi. Deve essere compreso tra 1 e 5.000.
  • Dimensioni batch preferite in KB: valore di destinazione per le dimensioni del batch in kilobyte. Analogamente al numero massimo di eventi, le dimensioni del batch possono essere inferiori se non sono disponibili altri eventi al momento della pubblicazione. È possibile che un batch superi le dimensioni del batch preferite se un singolo evento supera le dimensioni preferite. Ad esempio, se le dimensioni preferite sono 4 kB e viene eseguito il push di un evento da 10 kB a Griglia di eventi, l'evento da 10 kB verrà comunque recapitato nel proprio batch anziché essere eliminato.

Recapito in batch in configurato in base a una sottoscrizione per evento tramite il portale, l'interfaccia della riga di comando, PowerShell o gli SDK.

Comportamento di invio in batch

  • Tutti o nessuno

    Griglia di eventi funziona con semantica all-or-none. Non supporta l'esito positivo parziale di un recapito in batch. I Sottoscrittori devono prestare attenzione solo a richiedere il maggior numero di eventi per batch, in quanto possono ragionevolmente gestire in 30 secondi.

  • Batch ottimistico

    Le impostazioni dei criteri di invio in batch non sono limiti rigidi per il comportamento di invio in batch e vengono rispettate in base al massimo sforzo. A bassa frequenza di eventi, è spesso possibile osservare che le dimensioni del batch sono inferiori al numero massimo di eventi richiesti per batch.

  • Il valore predefinito è impostato su OFF

    Per impostazione predefinita, Griglia di eventi aggiunge un solo evento a ogni richiesta di recapito. Il modo per attivare l'invio in batch consiste nell'impostare una delle impostazioni indicate in precedenza nell'articolo nel codice JSON della sottoscrizione di eventi.

  • Valori predefiniti

    Non è necessario specificare entrambe le impostazioni (numero massimo di eventi per batch e dimensioni batch approssimative in kilobyte) durante la creazione di una sottoscrizione di eventi. Se è impostata una sola impostazione, Griglia di eventi usa valori predefiniti (configurabili). Vedere le sezioni seguenti per i valori predefiniti e come eseguirne l'override.

Portale di Azure:

Queste impostazioni vengono visualizzate nella scheda Funzionalità aggiuntive della pagina Sottoscrizione eventi .

Screenshot della scheda Funzionalità aggiuntive della pagina Sottoscrizione eventi con la sezione Batch evidenziata.

Interfaccia della riga di comando di Azure

Quando si crea una sottoscrizione di eventi, usare i parametri seguenti:

  • max-events-per-batch : numero massimo di eventi in un batch. Deve essere un numero compreso tra 1 e 5000.
  • preferred-batch-size-in-kilobyte - Dimensioni batch preferite in kilobyte. Deve essere un numero compreso tra 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

Per altre informazioni sull'uso dell'interfaccia della riga di comando di Azure con Griglia di eventi, vedere Instradare gli eventi di archiviazione all'endpoint Web con l'interfaccia della riga di comando di Azure.

Recapito ritardato

Man mano che un endpoint riscontra errori di recapito, Griglia di eventi inizia a ritardare il recapito e ripetere i tentativi di eventi a tale endpoint. Ad esempio, se i primi 10 eventi pubblicati in un endpoint hanno esito negativo, Griglia di eventi presuppone che l'endpoint stia riscontrando problemi e ritarderà tutti i tentativi successivi e le nuove consegne per un certo periodo di tempo, in alcuni casi fino a diverse ore.

Lo scopo funzionale del recapito ritardato consiste nel proteggere gli endpoint non integri e il sistema di Griglia di eventi. Senza il back-off e il ritardo del recapito agli endpoint non integri, i criteri di ripetizione dei tentativi e le funzionalità relative al volume di Griglia di eventi possono facilmente sovraccaricare un sistema.

Eventi relativi ai messaggi non recapitabili

Quando Griglia di eventi non riesce a recapitare un evento entro un determinato periodo di tempo o dopo aver tentato di recapitare l'evento per un determinato numero di volte, può inviare l'evento non recapitato a un account di archiviazione. Questo processo è noto come inserimento nella coda di eventi non recapitabili. Griglia di eventi inserisce un evento nella coda di eventi non recapitabili quando si verifica una delle condizioni seguenti.

  • L'evento non viene recapitato entro la durata specificata.
  • Il numero di tentativi di recapito dell'evento ha superato il limite.

Se viene soddisfatta una delle condizioni, l'evento viene eliminato o non inserito nella coda di eventi non recapitati. Per impostazione predefinita, Griglia di eventi non attiva l'inserimento nella coda di eventi non recapitabili. Per abilitarlo, è necessario specificare che un account di archiviazione deve contenere gli eventi non recapitati durante la sottoscrizione di eventi. Per risolvere le operazioni di recapito, viene eseguito il pull degli eventi da questo account di archiviazione.

Griglia di eventi invia un evento nel percorso dell'evento non recapitato quando ha eseguito tutti i tentativi di ripetizione. Se Griglia di eventi riceve un codice di risposta 400 (Richiesta non valida) o 413 (Entità della richiesta troppo grande), pianifica immediatamente l'invio dell'evento alla coda degli eventi non recapitabili. Questi codici di risposta indicano che recapito dell'evento non avrà mai esito positivo.

La scadenza time-to-live viene controllata SOLO al successivo tentativo di recapito pianificato. Pertanto, anche se la durata scade prima del successivo tentativo di recapito pianificato, la scadenza dell'evento viene verificata solo al momento del recapito successivo e successivamente non recapitabili.

È previsto un ritardo di cinque minuti tra l'ultimo tentativo di recapitare un evento e il momento in cui viene recapitato alla posizione dei messaggi non recapitabili. Tale ritardo ha lo scopo di ridurre il numero di operazioni di archiviazione BLOB. Se la posizione dei messaggi non recapitabili non è disponibile per quattro ore, l'evento viene eliminato.

Prima di impostare la posizione dei messaggi non recapitabili, è necessario avere un account di archiviazione con un contenitore. L'endpoint di questo contenitore deve essere specificato durante la creazione della sottoscrizione di eventi. Di seguito è indicato il formato dell'endpoint: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-name>/blobServices/default/containers/<container-name>

Potrebbe essere necessario ricevere una notifica quando un evento è stato inviato alla posizione dei messaggi non recapitabili. Per usare Griglia di eventi per rispondere a eventi non recapitati, creare una sottoscrizione di eventi per l'archivio BLOB di eventi non recapitabili. Ogni volta che l'archivio BLOB riceve un evento non recapitato, Griglia di eventi invia una notifica al gestore. Il gestore risponde con le azioni da eseguire per la riconciliazione degli eventi non recapitati. Per un esempio di configurazione di un percorso di messaggi non recapitabili e dei criteri di ripetizione dei tentativi, vedere Messaggi non recapitabili e criteri di ripetizione dei tentativi.

Nota

Se si abilita l'identità gestita per l'invio di messaggi non recapitabili, sarà necessario aggiungere l'identità gestita al ruolo di controllo degli accessi in base al ruolo appropriato nell'account di archiviazione di Azure che conterrà gli eventi non recapitabili. Per altre informazioni, vedere Destinazioni supportate e ruoli di Azure.

Formati di eventi di recapito

In questa sezione vengono forniti esempi di eventi e eventi non recapitabili in formati di schema di recapito diversi (schema di Griglia di eventi, schema CloudEvents 1.0 e schema personalizzato). Per altre informazioni su questi formati, vedere Gli articoli sullo schema di Griglia di eventi e sugli eventi cloud 1.0 .

Schema di Griglia di eventi

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 di messaggi non recapitabili

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

Ecco i valori possibili di lastDeliveryOutcome e le relative descrizioni.

LastDeliveryOutcome Descrizione
NotFound Risorsa di destinazione non trovata.
Disabled La destinazione ha disabilitato la ricezione di eventi. Applicabile per bus di servizio di Azure e Hub eventi di Azure.
Full È stato superato il numero massimo di operazioni consentite nella destinazione. Applicabile per bus di servizio di Azure e Hub eventi di Azure.
Non autorizzata Destinazione restituito codice di risposta non autorizzato.
BadRequest Destinazione ha restituito un codice di risposta di richiesta non valido.
TimedOut Timeout dell'operazione di recapito.
Busy Il server di destinazione è occupato.
PayloadTooLarge Le dimensioni del messaggio superano le dimensioni massime consentite dalla destinazione. Applicabile per bus di servizio di Azure e Hub eventi di Azure.
Prova La destinazione viene inserita in prova da Griglia di eventi. Il recapito non viene tentato durante la prova.
Cancellati Operazione di recapito annullata.
Aborted Il recapito è stato interrotto da Griglia di eventi dopo un intervallo di tempo.
Socketerror Errore di comunicazione di rete durante il recapito.
ResolutionError Risoluzione DNS dell'endpoint di destinazione non riuscita.
Recapito Recapito di eventi alla destinazione.
SessionQueueNotSupported Il recapito di eventi senza ID sessione viene tentato in un'entità che dispone del supporto della sessione abilitato. Applicabile per bus di servizio di Azure destinazione dell'entità.
Accesso negato Il recapito non è consentito dall'endpoint di destinazione (potrebbe essere a causa di firewall IP o altre restrizioni)
InvalidAzureFunctionDestination La funzione di Azure di destinazione non è valida. Probabilmente perché non ha il tipo EventGridTrigger.

LastDeliveryOutcome: Probation

Una sottoscrizione di eventi viene inserita in prova per una durata da Griglia di eventi se il recapito di eventi a tale destinazione ha esito negativo. Il tempo di probe è diverso per errori diversi restituiti dall'endpoint di destinazione. Se una sottoscrizione di eventi è in prova, gli eventi possono ricevere messaggi non recapitabili o eliminati senza nemmeno tentare il recapito a seconda del codice di errore a causa del quale è in prova.

Errore Durata del probe
Busy 10 secondi
NotFound 5 minuti
Socketerror 30 secondi
ResolutionError 5 minuti
Disabled 5 minuti
Full 5 minuti
TimedOut 10 secondi
Non autorizzata 5 minuti
Accesso negato 5 minuti
InvalidAzureFunctionDestination 10 minuti

Nota

Griglia di eventi usa la durata del probe per una migliore gestione del recapito e la durata potrebbe cambiare in futuro.

Schema 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 di messaggi non recapitabili

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

Schema personalizzato

Evento

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

Evento di messaggi non recapitabili

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

Stato di recapito del messaggio

Griglia di eventi usa i codici di risposta HTTP per confermare la ricezione degli eventi.

Codici di riuscita

Griglia di eventi considera solo i codici di risposta HTTP seguenti come consegne riuscite. Tutti gli altri codici di stato sono considerati consegne non riuscite e verranno ritentati o non recapitabili in base alle esigenze. Quando Griglia di eventi riceve un codice di stato riuscito, considera il recapito completo.

  • 200 - OK
  • 201 Creato
  • 202 - Accettato
  • 203 Informazioni non autorevoli
  • 204 No Content (Nessun contenuto)

Codici di errore

Tutti gli altri codici non inclusi nel set precedente (200-204) sono considerati errori e verranno ritentati (se necessario). Alcuni hanno criteri di ripetizione specifici associati a tali criteri, tutti gli altri seguono il modello di back-off esponenziale standard. È importante tenere presente che, a causa della natura altamente parallelizzata dell'architettura di Griglia di eventi, il comportamento di ripetizione dei tentativi non è deterministico.

Codice stato Comportamento in caso di nuovo tentativo
400 - Richiesta non valida Non ritentato
401 - Non autorizzato Riprovare dopo 5 minuti o più per gli endpoint delle risorse di Azure
403 - Accesso negato Non ritentato
404 - Non trovato Riprovare dopo 5 minuti o più per gli endpoint delle risorse di Azure
408 - Timeout richiesta Riprovare dopo 2 minuti o più
413 Entità della richiesta troppo grande Non ritentato
503 - Servizio non disponibile Riprovare dopo 30 secondi o più
Tutti gli altri Riprovare dopo 10 secondi o più

Proprietà di recapito personalizzate

Le sottoscrizioni di eventi consentono di configurare le intestazioni HTTP incluse negli eventi recapitati. Questa funzionalità consente di impostare le intestazioni personalizzate richieste da una destinazione. È possibile configurare fino a 10 intestazioni durante la creazione di una sottoscrizione di eventi. Ogni valore di intestazione non deve superare 4.096 byte (4K). È possibile impostare intestazioni personalizzate sugli eventi recapitati alle destinazioni seguenti:

  • Webhook
  • Argomenti del bus di servizio di Azure
  • Hub eventi di Azure
  • Inoltrare connessioni ibride

Per altre informazioni, vedere Proprietà di recapito personalizzate.

Passaggi successivi