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.
Il modello di esecuzione affidabile di Durable Functions richiede che le orchestrazioni siano deterministiche, che crea una sfida quando si distribuiscono gli aggiornamenti. Quando una distribuzione contiene modifiche importanti — ad esempio firme di funzioni di attività modificate o logica dell'agente di orchestrazione alterata — le istanze di orchestrazione in corso non riescono. Questa situazione è particolarmente un problema per le orchestrazioni a esecuzione prolungata, che richiedono ore o giorni di lavoro.
Annotazioni
Le strategie descritte in questo articolo presuppongono che si stia usando il provider di Archiviazione di Azure predefinito per Durable Functions. Se si usa un provider di archiviazione diverso, le indicazioni potrebbero non essere valide. La strategia di controllo delle versioni dell'orchestrazione è l'eccezione; funziona con qualsiasi back-end di archiviazione. Per ulteriori informazioni sulle opzioni dei provider di archiviazione, consultare i provider di archiviazione di Durable Functions.
La tabella seguente confronta quattro strategie per ottenere una distribuzione senza tempi di inattività. Scegliere la strategia più adatta al carico di lavoro:
| Strategia | Quando utilizzare | Pros | Svantaggi |
|---|---|---|---|
| Controllo delle versioni dell'orchestrazione (scelta consigliata) | Applicazioni con modifiche di rilievo che richiedono più versioni di orchestrazione in esecuzione simultaneamente. | Abilita distribuzioni senza tempi di inattività con modifiche di rilievo. Funzionalità predefinita che richiede una configurazione minima. Funziona con qualsiasi back-end di archiviazione. |
Richiede un'attenta modifica del codice del software di orchestrazione per la compatibilità delle versioni. |
| Controllo delle versioni basato sui nomi | Applicazioni con modifiche di rilievo poco frequenti in cui è preferibile la semplicità. | Facile da implementare. | Aumento delle dimensioni dell'app per le funzioni in memoria e numero di funzioni. Duplicazione del codice. |
| Controllo dello stato con slot | Sistemi con orchestrazioni di breve durata (meno di 24 ore) e gap prevedibili tra le esecuzioni. | Codebase semplice. Non richiede una gestione aggiuntiva delle app per le funzioni. |
Richiede un account di archiviazione aggiuntivo o una gestione dell'hub attività. Richiede periodi di tempo in cui non sono in esecuzione orchestrazioni. |
| Instradamento dell'applicazione | Sistemi con orchestrazioni in esecuzione continua (oltre 24 ore) o esecuzioni spesso sovrapposte senza finestre inattive. | Gestisce le nuove versioni dei sistemi con orchestrazioni in esecuzione continuamente con modifiche di rilievo. | Richiede un router applicazione intelligente. Potrebbe esaurire il numero massimo di applicazioni di funzione consentite dalla sottoscrizione (il valore predefinito è 100). |
Versionamento dell'orchestrazione
La funzionalità di controllo delle versioni dell'orchestrazione è la strategia consigliata per le distribuzioni senza tempi di inattività con modifiche importanti. Consente a versioni diverse di orchestrazioni di coesistere ed eseguire simultaneamente senza conflitti.
Con il controllo delle versioni dell'orchestrazione:
- Ogni istanza di orchestrazione ottiene una versione associata in modo permanente alla versione al momento della creazione.
- Gli operatori che eseguono versioni più recenti dell'orchestratore possono continuare a svolgere istanze di versioni precedenti.
- Gli operatori che eseguono versioni di orchestrazione precedenti non possono eseguire istanze di versioni più recenti.
- Le funzioni dell'agente di orchestrazione possono esaminare la versione e l'esecuzione del ramo di conseguenza.
Questo approccio facilita gli aggiornamenti progressivi, in cui operatori di versioni diverse dell'applicazione possono coesistere in sicurezza. A differenza delle altre strategie descritte in questo articolo, il controllo delle versioni dell'orchestrazione è indipendente dal back-end e funziona con qualsiasi provider di archiviazione.
Per i passaggi di implementazione completi, tra cui come configurare il controllo delle versioni, gestire la diramazione delle versioni nel codice dell'agente di orchestrazione e gestire gli aggiornamenti in sequenza, vedere Controllo delle versioni dell'orchestrazione.
Le strategie rimanenti sono alternative per gli scenari in cui il controllo delle versioni dell'orchestrazione non è adatto.
Controllo delle versioni basato sui nomi
Con questa strategia, si creano nuove versioni delle funzioni insieme alle versioni precedenti nella stessa app per le funzioni. La versione di ogni funzione diventa parte del nome , ad esempio MyOrchestrator_v1, MyOrchestrator_v2. Dato che le versioni precedenti vengono mantenute, le istanze di orchestrazione in corso possono continuare a farvi riferimento. Le richieste di nuove istanze di orchestrazione chiamano la versione più recente, a cui la funzione client di orchestrazione può fare riferimento da un'impostazione dell'app. Il diagramma seguente illustra questo approccio.
Screenshot del diagramma della strategia di versioning basata su nomi che illustra come coesistano le versioni delle funzioni in un'applicazione Durable Functions.
In questa strategia, ogni funzione deve essere copiata e i relativi riferimenti ad altre funzioni devono essere aggiornati. È possibile semplificare la scrittura di uno script. Ecco un progetto di esempio con uno script di migrazione.
Annotazioni
Questa strategia usa gli slot di distribuzione per evitare tempi di inattività durante la distribuzione. Per informazioni più dettagliate su come creare e usare nuovi deployment slots di Funzioni di Azure, vedere Funzioni di Azure deployment slots.
Controllo dello stato con slot
Mentre la versione corrente dell'app per le funzioni è in esecuzione nello slot di produzione, distribuire la nuova versione dell'app per le funzioni nello slot di staging. Prima di scambiare gli slot di produzione e di staging, verificare se sono presenti istanze di orchestrazione in esecuzione. Al termine di tutte le istanze di orchestrazione, è possibile eseguire lo scambio. Questa strategia funziona quando si hanno periodi prevedibili quando non sono in esecuzione istanze di orchestrazione. Questo è l'approccio migliore quando le orchestrazioni non sono a esecuzione prolungata e quando le esecuzioni di orchestrazione non si sovrappongono di frequente.
Configurazione dell'app per le funzioni
Utilizzare la procedura seguente per configurare questo scenario.
Aggiungere slot di distribuzione all'app per le funzioni per la gestione temporanea e la produzione.
Per ogni slot, impostare l'impostazione dell'applicazione AzureWebJobsStorage sulla connessione di un account di archiviazione condiviso. Questa connessione all'account di archiviazione viene usata dal runtime di Funzioni di Azure per archiviare in modo sicuro le chiavi di accesso delle funzioni. Per il livello di sicurezza più elevato, è consigliabile usare una connessione di identità gestita all'account di archiviazione.
Per ogni slot, creare una nuova impostazione dell'app, ad esempio
DurableManagementStorage. Impostarne il valore nella stringa di connessione di diversi account di archiviazione. Questi account di archiviazione vengono usati dall'estensione Durable Functions per l'esecuzione affidabile. Usare un account di archiviazione separato per ogni slot. Non contrassegnare questa impostazione come impostazione dello slot di distribuzione. Anche in questo caso, le connessioni gestite basate su identità sono le più sicure.Nella sezione durableTask del file host.json dell'app per le funzioni specificare
connectionStringName(Durable 2.x) oazureStorageConnectionStringName(Durable 1.x) come nome dell'impostazione dell'app creata nel passaggio 3.
Il diagramma seguente illustra la configurazione descritta degli slot di distribuzione e degli account di archiviazione. In questo potenziale scenario di pre-distribuzione, la versione 2 di un'app per le funzioni è in esecuzione nello slot di produzione, mentre la versione 1 rimane nello slot di staging.
esempio di host.json
Il frammento JSON seguente mostra l'impostazione stringa di connessione nel file host.json.
{
"version": 2.0,
"extensions": {
"durableTask": {
"hubName": "MyTaskHub",
"storageProvider": {
"connectionStringName": "DurableManagementStorage"
}
}
}
}
Annotazioni
Per le app legacy di Funzioni 1.x, usare la azureStorageConnectionStringName proprietà direttamente nella durableTask sezione anziché storageProvider.connectionStringName.
Configurazione della pipeline CI/CD
Configurare la pipeline CI/CD per la distribuzione solo quando l'app per le funzioni non ha istanze di orchestrazione in sospeso o in esecuzione. Quando si usa Azure Pipelines, è possibile creare una funzione che verifica la presenza di queste condizioni, come nell'esempio C# seguente. Lo stesso modello si applica ad altri linguaggi: interrogare le istanze di orchestrazione con stato Pending o Running e restituire se ne esistono.
[FunctionName("StatusCheck")]
public static async Task<IActionResult> StatusCheck(
[HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestMessage req,
[DurableClient] IDurableOrchestrationClient client,
ILogger log)
{
var runtimeStatus = new List<OrchestrationRuntimeStatus>();
runtimeStatus.Add(OrchestrationRuntimeStatus.Pending);
runtimeStatus.Add(OrchestrationRuntimeStatus.Running);
var result = await client.ListInstancesAsync(new OrchestrationStatusQueryCondition() { RuntimeStatus = runtimeStatus }, CancellationToken.None);
return (ActionResult)new OkObjectResult(new { HasRunning = result.DurableOrchestrationState.Any() });
}
Configurare quindi il gate di staging per attendere che non siano in esecuzione orchestrazioni. Per altre informazioni, vedere Rilasciare il controllo della distribuzione tramite gate
Azure Pipelines controlla che l'app per le funzioni esegua istanze di orchestrazione prima dell'avvio della distribuzione.
Ora la nuova versione dell'app per le funzioni deve essere distribuita nello slot di staging.
Infine, scambiare slot.
Anche le impostazioni dell'applicazione non contrassegnate come impostazioni dello slot di distribuzione vengono scambiate, quindi l'app versione 2 mantiene il riferimento all'account di archiviazione A. Poiché lo stato dell'orchestrazione viene rilevato nell'account di archiviazione, tutte le orchestrazioni in esecuzione nell'app versione 2 continuano a essere eseguite nel nuovo slot senza interruzioni.
Per usare lo stesso account di archiviazione per entrambi gli slot, è possibile modificare i nomi degli hub attività. In questo caso, devi gestire lo stato degli slot e le impostazioni HubName dell'app. Per altre informazioni, vedere Task hub in Durable Functions.
Instradamento delle applicazioni
Questa strategia è la più complessa, ma è l'unica opzione per i sistemi con orchestrazioni in esecuzione continua che non hanno mai una finestra inattiva per gli scambi di slot.
Per questa strategia, si crea un router application router davanti al Durable Functions, ad esempio una funzione Azure con trigger HTTP o un'istanza di Gestione API che instrada in base alle intestazioni di versione. Il router è responsabile di:
- Distribuzione dell'app per le funzioni.
- Gestione della versione dell'app attiva.
- Instradamento delle richieste di orchestrazione all'app per le funzioni corretta in base alla versione.
La prima volta che viene ricevuta una richiesta di orchestrazione, il router esegue le attività seguenti:
- Crea una nuova app per le funzioni in Azure.
- Distribuisce il codice dell'app per le funzioni nella nuova app per le funzioni in Azure.
- Inoltra la richiesta di orchestrazione alla nuova app.
Il router gestisce lo stato di quale versione del codice dell'app viene distribuita in quale app per le funzioni in Azure.
Schermata del flusso di routing e distribuzione iniziale delle applicazioni per la distribuzione senza tempi di inattività di Durable Functions.
Il router indirizza le richieste di distribuzione e orchestrazione all'app per le funzioni appropriata in base alla versione inviata con la richiesta. Ignora la versione della patch.
Quando si distribuisce una nuova versione dell'app senza apportare modifiche di rilievo, è possibile incrementare la versione della patch. Il router viene distribuito nell'app per le funzioni esistente e invia richieste per le versioni precedenti e nuove del codice, indirizzate alla stessa app per le funzioni.
Quando si distribuisce una nuova versione dell'app con una modifica che causa un'interruzione, è possibile incrementare la versione principale o secondaria. Il router per l'applicazione crea quindi una nuova app per le funzioni in Azure, la distribuisce e instrada le richieste per la nuova versione dell'app. Nel diagramma seguente, l'esecuzione di orchestrazioni nella versione 1.0.1 dell'app continua a essere in esecuzione, ma le richieste per la versione 1.1.0 vengono instradate alla nuova app per le funzioni.
Il router monitora lo stato delle orchestrazioni nella versione 1.0.1 e rimuove le app al termine di tutte le orchestrazioni.
Impostazioni dell'archivio di rilevamento
Ogni app per le funzioni deve usare code di pianificazione separate, possibilmente in account di archiviazione separati. Se si desidera eseguire query su tutte le istanze di orchestrazione in tutte le versioni dell'applicazione, è possibile condividere tabelle di istanza e cronologia tra le app per le funzioni. È possibile condividere le tabelle configurando le impostazioni trackingStoreConnectionStringName e trackingStoreNamePrefix nel file delle impostazioni host.json in modo che usino tutti gli stessi valori.
Per altre informazioni, vedere Gestire le istanze in Durable Functions in Azure.