Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Le politiche di resilienza consentono di prevenire, rilevare e ripristinare in modo proattivo da eventuali errori dell'app contenitore. Questo articolo illustra come applicare criteri di resilienza per le applicazioni che usano Dapr per l'integrazione con servizi cloud diversi, ad esempio archivi di stato, broker di messaggi pub/sub, archivi di segreti e altro ancora.
È possibile configurare criteri di resilienza come nuovi tentativi, timeout e interruttori per le seguenti operazioni in uscita e in ingresso usando un componente Dapr.
-
Operazioni in uscita: chiamate da un sidecar Dapr a un componente, ad esempio:
- Permanenza o recupero dello stato
- Pubblicazione di un messaggio
- Richiamo di un'associazione di output
-
Operazioni in ingresso: chiamate dal sidecar Dapr all'app contenitore, ad esempio:
- Sottoscrizioni quando si recapita un messaggio
- Associazioni di input che generano un evento
Lo screenshot seguente mostra come un'applicazione usa un criterio di ripetizione per tentare di eseguire il ripristino da richieste non riuscite.
Criteri di resilienza supportati
Configurare i criteri di resilienza
È possibile scegliere se creare criteri di resilienza usando Bicep, l'interfaccia della riga di comando di Azure o il portale di Azure.
L'esempio di resilienza seguente illustra tutte le configurazioni disponibili.
resource myPolicyDoc 'Microsoft.App/managedEnvironments/daprComponents/resiliencyPolicies@2023-11-02-preview' = {
name: 'my-component-resiliency-policies'
parent: '${componentName}'
properties: {
outboundPolicy: {
timeoutPolicy: {
responseTimeoutInSeconds: 15
}
httpRetryPolicy: {
maxRetries: 5
retryBackOff: {
initialDelayInMilliseconds: 1000
maxIntervalInMilliseconds: 10000
}
}
circuitBreakerPolicy: {
intervalInSeconds: 15
consecutiveErrors: 10
timeoutInSeconds: 5
}
}
inboundPolicy: {
timeoutPolicy: {
responseTimeoutInSeconds: 15
}
httpRetryPolicy: {
maxRetries: 5
retryBackOff: {
initialDelayInMilliseconds: 1000
maxIntervalInMilliseconds: 10000
}
}
circuitBreakerPolicy: {
intervalInSeconds: 15
consecutiveErrors: 10
timeoutInSeconds: 5
}
}
}
}
Importante
Dopo aver applicato tutti i criteri di resilienza, è necessario riavviare le applicazioni Dapr.
Specifiche delle politiche
Timeout
I timeout vengono utilizzati per terminare anticipatamente operazioni a lunga durata. I criteri di timeout includono le proprietà seguenti.
properties: {
outbound: {
timeoutPolicy: {
responseTimeoutInSeconds: 15
}
}
inbound: {
timeoutPolicy: {
responseTimeoutInSeconds: 15
}
}
}
| Metadati | Obbligatorio | Descrizione | Esempio |
|---|---|---|---|
responseTimeoutInSeconds |
Sì | Timeout in attesa di una risposta dal componente Dapr. | 15 |
Tentativi
Definire una strategia di httpRetryPolicy per le operazioni non riuscite. La politica di ripetizione include le seguenti configurazioni.
properties: {
outbound: {
httpRetryPolicy: {
maxRetries: 5
retryBackOff: {
initialDelayInMilliseconds: 1000
maxIntervalInMilliseconds: 10000
}
}
}
inbound: {
httpRetryPolicy: {
maxRetries: 5
retryBackOff: {
initialDelayInMilliseconds: 1000
maxIntervalInMilliseconds: 10000
}
}
}
}
| Metadati | Obbligatorio | Descrizione | Esempio |
|---|---|---|---|
maxRetries |
Sì | Numero massimo di tentativi da eseguire per una richiesta HTTP non riuscita. | 5 |
retryBackOff |
Sì | Monitora le richieste e arresta tutto il traffico verso il servizio interessato quando vengono soddisfatti i criteri di timeout e ripetizione dei tentativi. | Non Disponibile |
retryBackOff.initialDelayInMilliseconds |
Sì | Ritardo tra il primo errore e il primo tentativo. | 1000 |
retryBackOff.maxIntervalInMilliseconds |
Sì | Ritardo massimo tra i tentativi. | 10000 |
Interruttori
Definire un circuitBreakerPolicy per monitorare le richieste che causano tassi di errore elevati e arrestare tutto il traffico verso il servizio interessato quando viene soddisfatto un determinato criterio.
properties: {
outbound: {
circuitBreakerPolicy: {
intervalInSeconds: 15
consecutiveErrors: 10
timeoutInSeconds: 5
}
},
inbound: {
circuitBreakerPolicy: {
intervalInSeconds: 15
consecutiveErrors: 10
timeoutInSeconds: 5
}
}
}
| Metadati | Obbligatorio | Descrizione | Esempio |
|---|---|---|---|
intervalInSeconds |
No | Periodo ciclico di tempo (in secondi) usato dall'interruttore per cancellare i conteggi interni. Se non specificato, l'intervallo viene impostato sullo stesso valore specificato per timeoutInSeconds. |
15 |
consecutiveErrors |
Sì | Numero di errori delle richieste consentiti prima che il circuito si attivi e si apra. | 10 |
timeoutInSeconds |
Sì | Periodo di tempo (in secondi) di stato aperto, direttamente dopo l'errore. | 5 |
Processo dell'interruttore automatico
Se si specifica consecutiveErrors (la condizione di attivazione del circuito come consecutiveFailures > $(consecutiveErrors)-1), si imposta il numero di errori consentiti prima che il circuito si attivi e si apra a metà.
Il circuito attende in stato semi-aperto per il periodo di tempo definito da timeoutInSeconds, durante il quale il numero di richieste consecutiveErrors deve avere esito positivo consecutivamente.
- Se le richieste hanno esito positivo, il circuito si chiude.
- Se le richieste hanno esito negativo, il circuito rimane in uno stato semi-aperto.
Se non è stato impostato alcun valore intervalInSeconds, il circuito viene reimpostato su uno stato chiuso dopo l'intervallo di tempo impostato per timeoutInSeconds, indipendentemente dall'esito positivo o negativo della richiesta consecutiva. Se si imposta intervalInSeconds su 0, il circuito non viene mai reimpostato automaticamente, passando solo da semi-aperto a chiuso completando consecutiveErrors richieste consecutivamente.
Se è stato impostato un valore di intervalInSeconds, che determina l'intervallo di tempo prima che il circuito venga reimpostato sullo stato chiuso, indipendentemente dal fatto che le richieste inviate in uno stato semi-aperto abbiano avuto esito positivo o negativo.
Registri di resilienza
Nella sezione Monitoraggio dell'app contenitore selezionare Log.
Nel riquadro Log scrivere ed eseguire una query per trovare la resilienza tramite i log di sistema dell'app contenitore. Ad esempio, per determinare se è stato caricato un criterio di resilienza:
ContainerAppConsoleLogs_CL
| where ContainerName_s == "daprd"
| where Log_s contains "Loading Resiliency configuration:"
| project time_t, Category, ContainerAppName_s, Log_s
| order by time_t desc
Selezionare Esegui per eseguire la query e visualizzare il risultato con il messaggio di log che indica che il criterio è in fase di caricamento.
È anche possibile trovare i criteri di resilienza effettivi abilitando i log di debug nell'app contenitore ed eseguendo query per verificare se viene caricata una risorsa di resilienza.
Dopo aver abilitato i log di debug, usare una query simile alla seguente:
ContainerAppConsoleLogs_CL
| where ContainerName_s == "daprd"
| where Log_s contains "Resiliency configuration ("
| project time_t, Category, ContainerAppName_s, Log_s
| order by time_t desc
Selezionare Esegui per eseguire la query e visualizzare il messaggio di log risultante con la configurazione dei criteri.