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 .
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
- Per visualizzare lo stato di recapito degli eventi, vedere Monitorare il recapito dei messaggio di Griglia di eventi di Azure.
- Per personalizzare le opzioni di recapito di eventi, vedere Messaggi non recapitabili e criteri di ripetizione dei tentativi.