Condividi tramite


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 tenta di nuovo il recapito in base a una pianificazione di retry fissa e a criteri di ripetizione. Per impostazione predefinita, Griglia di eventi recapita al sottoscrittore un evento alla volta. 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 riceve un errore per un tentativo di recapito degli eventi, Griglia di eventi decide se ritentare il recapito, inserire l'evento nella coda degli eventi non recapitabili o eliminare l'evento in base al tipo di errore.

Se l'errore restituito dall'endpoint sottoscritto è un errore correlato alla configurazione che non può essere corretto con i 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 (entità della richiesta troppo grande)
Webhook 400 (richiesta non valida), 413 (entità della 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. È consigliabile configurare messaggi non recapitabili se non si vuole eliminare questi tipi di eventi. Gli eventi non recapitabili saranno eliminati se non viene trovata la destinazione per i messaggi non recapitabili.

Se l'errore restituito dall'endpoint sottoscritto non è incluso nell'elenco precedente, Griglia di eventi esegue il nuovo tentativo usando i criteri descritti 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 in base al miglior impegno:

  • 10 secondi
  • 30 secondi
  • 1 minuto
  • 5 minuti
  • 10 minuti
  • 30 minuti
  • 1 ora
  • 3 ora
  • 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 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 potrebbe ignorare in modo opportunistico alcuni tentativi se un endpoint è costantemente non integro, inattivo per un lungo periodo o sembra essere sovraccarico.

Criteri di ripetizione

È 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 massimi. Quando un evento non viene recapitato dopo 30 minuti (o) non viene recapitato dopo 5 tentativi, a seconda di quale evento si verifica per primo, l'evento viene recapitato senza messaggi non recapitabili. Se si imposta il numero massimo di tentativi di recapito su 10, per quanto riguarda pianificazione dei tentativi esponenziali, il numero massimo di tentativi di recapito si verifica prima che venga raggiunto il TTL 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.

Invio in batch dell'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 per l’invio in batch

Il recapito in batch ha due impostazioni:

  • Numero massimo di eventi per batch: numero massimo di eventi che Griglia di eventi recapita per ogni batch. Questo numero non verrà mai superato. Tuttavia, è possibile che vengano recapitati meno 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 Software Development Kit (SDK).

Comportamento di invio in batch

  • Tutti o nessuno

    Griglia di eventi funziona con la semantica tutti o nessuno. Non supporta l'esito parziale di un recapito batch. I sottoscrittori devono prestare attenzione e richiedere solo il numero di eventi per batch che possono ragionevolmente gestire in 30 secondi.

  • Invio in batch Optimistic

    Le impostazioni dei criteri di invio in batch non presentano limiti rigorosi per il comportamento di invio in batch, e il rispetto delle stesse avviene su una base di massimo impegno. A bassa frequenza di eventi, spesso si osserva che le dimensioni del batch sono inferiori al massimo di eventi richiesti per batch.

  • Il valore predefinito è impostato su OFF

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

  • Valori predefiniti

    Durante la creazione di una sottoscrizione di eventi, non è necessario specificare entrambe le impostazioni (Numero massimo di eventi per batch e Dimensioni batch approssimative in kilobyte). Se è configurata una sola impostazione, Griglia di eventi usa i valori predefiniti (configurabili). Per i valori predefiniti e informazioni su come eseguirne l'override, vedere le sezioni seguenti.

Portale di Azure:

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

Screenshot della scheda Funzionalità aggiuntive nella pagina Sottoscrizione di eventi con la sezione Invio in 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-kilobytes: dimensioni batch desiderate 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 Indirizzare gli eventi di archiviazione all'endpoint Web con l'interfaccia della riga di comando di Azure.

Recapito ritardato

Se in un endpoint si verificano errori di recapito, Griglia di eventi ritarda il recapito e la ripetizione degli eventi nell'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 i nuovi recapiti 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 della durata viene controllata SOLO al tentativo di recapito pianificato successivo. Pertanto, anche la durata scade prima del successivo tentativo di recapito pianificato, la scadenza dell'evento viene controllata solo al momento del recapito successivo, e in seguito diviene non recapitabile.

Tra l'ultimo tentativo di recapitare un evento e il momento in cui questo viene recapitato alla posizione dei messaggi non recapitabili, trascorre un intervallo di cinque minuti. 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>

Quando un evento è stato inviato al percorso di messaggi non recapitabili potrebbe essere opportuno ricevere una notifica. 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 una posizione non recapitata e dei criteri di ripetizione dei tentativi, vedere Messaggi non recapitabili e i criteri di ripetizione dei tentativi.

Nota

Se si abilita l'identità gestita per i messaggi non recapitabili, è 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 degli eventi di recapito

In questa sezione vengono forniti esempi di eventi ed 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 Schema di Griglia di eventi e Schema di Eventi cloud 1.0.

Schema di griglia di eventi

Event

{
    "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 La risorsa di destinazione non è stata trovata.
Disabilitata La destinazione ha disabilitato la ricezione di eventi. Applicabile per il bus di servizio di Azure e Hub eventi di Azure.
Completo È stato superato il numero massimo di operazioni consentite nella destinazione. Applicabile per il bus di servizio di Azure e Hub eventi di Azure.
Non autorizzata La destinazione ha restituito un codice di risposta non autorizzato.
BadRequest La destinazione ha restituito un codice di risposta di richiesta non valido.
TimedOut Timeout dell'operazione di recapito.
Occupato Il server di destinazione è occupato.
PayloadTooLarge Le dimensioni del messaggio superano le dimensioni massime consentite dalla destinazione. Applicabile per il bus di servizio di Azure e Hub eventi di Azure.
Prova La destinazione viene inserita in prova da Griglia di eventi. La consegna non viene tentata durante la prova.
Annullati Operazione di recapito annullata.
interrotto Il recapito è stato interrotto da Griglia di eventi dopo un intervallo di tempo.
SocketError Si è verificato un 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à con supporto sessione abilitato. Applicabile per la destinazione dell'entità del bus di servizio di Azure.
Non consentito Il recapito non è consentito dall'endpoint di destinazione (potrebbe essere causato da firewall IP o altre restrizioni)
InvalidAzureFunctionDestination La funzione di Azure di destinazione non è valida. Probabilmente perché non ha il tipo EventGridTrigger.

LastDeliveryOutcome: in prova

Una sottoscrizione di eventi viene inserita in prova per una durata da Griglia di eventi se gli eventi recapitati a tale destinazione hanno esito negativo. Il tempo di prova varia a seconda dei diversi errori restituiti dall'endpoint di destinazione. Per una sottoscrizione di eventi in prova, gli eventi possono ricevere messaggi non recapitabili o eliminati anche senza tentare il recapito, a seconda del codice di errore che ne causa la messa in prova.

Error Durata della prova
Occupato 10 secondi
NotFound 5 minuti
SocketError 30 secondi
ResolutionError 5 minuti
Disabilitata 5 minuti
Completa 5 minuti
TimedOut 10 secondi
Non autorizzata 5 minuti
Non consentito 5 minuti
InvalidAzureFunctionDestination 10 minuti

Nota

Griglia di eventi usa la durata della messa in prova per una migliore gestione del recapito e tale durata potrebbe cambiare in futuro.

Schema CloudEvents 1.0

Event

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

Event

{
    "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 come recapito con esito positivo solo i codici di risposta HTTP seguenti. Tutti gli altri codici di stato sono giudicati come recapiti con esito negativo e sarà eseguito il retry o considerati non recapitabili, a seconda del caso. Quando Griglia di eventi riceve un codice di stato riuscito, considera il recapito come completato.

  • 200 OK
  • 201 Creato
  • 202 - Accettato
  • 203 Informazioni non autorevoli
  • 204 No Content

Codici di errore

Tutti gli altri codici non inclusi nel set (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, data la natura altamente parallelizzata dell'architettura di Griglia di eventi, il comportamento dei retry è non deterministico.

Codice di stato Comportamento in caso di nuovo tentativo
400 Richiesta non valida Retry non eseguito
401 - Non autorizzato Eseguire il retry dopo 5 minuti o più per gli endpoint delle risorse di Azure
403 Negato Retry non eseguito
404 Not Found Eseguire il retry dopo 5 minuti o più per gli endpoint delle risorse di Azure
408 - Timeout richiesta Eseguire il retry dopo 2 minuti o più
413 Entità della richiesta troppo grande Retry non eseguito
503 Servizio non disponibile Eseguire il retry dopo 30 secondi o più
Tutti gli altri Eseguire il retry 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:

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

Per altre informazioni, vedere Proprietà di recapito personalizzate.