Provider di archiviazione Durable Functions
Durable Functions è un set di trigger e associazioni di Funzioni di Azure basati internamente su Durable Task Framework (DTFx). DTFx supporta vari provider di archiviazione back-end, incluso il provider di Archiviazione di Azure usato da Durable Functions. A partire da Durable Functions v2.5.0, gli utenti possono configurare le app per le funzioni per l'uso di provider di archiviazione DTFx diversi dal provider di Archiviazione di Azure.
Nota
Per molte app per le funzioni, è probabile che il provider predefinito di Archiviazione di Azure per Durable Functions sia sufficiente ed è il più semplice da usare perché non richiede alcuna configurazione aggiuntiva. Tuttavia, compromessi in termini costo, scalabilità e gestione dei dati possono favorire l'uso di un provider di archiviazione alternativi.
Sono stati sviluppati due provider di archiviazione alternativi per l'uso con Durable Functions e Durable Task Framework, ovvero il provider di archiviazione di Netherite e il provider di archiviazione di Microsoft SQL Server (MSSQL). Questo articolo descrive tutti e tre i provider supportati, li confronta tra loro e fornisce informazioni di base su come iniziare a usarli.
Nota
Non è attualmente possibile eseguire la migrazione dei dati da un provider di archiviazione a un altro. Per usare un nuovo provider di archiviazione, è necessario creare una nuova app configurata con il nuovo provider di archiviazione.
Archiviazione di Azure
Archiviazione di Azure è il provider di archiviazione predefinito per Durable Functions. Usa code, tabelle e BLOB per rendere persistente l'orchestrazione e lo stato dell'entità. Usa anche BLOB e concede BLOB in lease per gestire le partizioni. In molti casi, l'account di archiviazione usato per archiviare lo stato di runtime di Durable Functions corrisponde all'account di archiviazione predefinito usato da Funzioni di Azure (AzureWebJobsStorage
). Tuttavia, è anche possibile configurare Durable Functions con un account di archiviazione separato. Il provider di Archiviazione di Azure è integrato nell'estensione Durable Functions e non ha altre dipendenze.
I vantaggi principali del provider di Archiviazione di Azure includono:
- Nessuna configurazione necessaria: è possibile usare l'account di archiviazione creato automaticamente dall'esperienza di configurazione dell'app per le funzioni.
- Modello di fatturazione serverless con costi minimi: Archiviazione di Azure ha un modello tariffario a consumo interamente basato sull'utilizzo (altre informazioni).
- Supporto ottimale per gli strumenti: Archiviazione di Azure offre un’emulazione locale multipiattaforma e si integra con Visual Studio, Visual Studio Code e Azure Functions Core Tools.
- Essendo più maturo: Archiviazione di Azure è il back-end di archiviazione originale e più rodato per Durable Functions.
- Supporta l'uso di identità anziché di segreti per la connessione al provider di archiviazione.
Il codice sorgente per i componenti DTFx del provider di Archiviazione di Azure è disponibile nel repository Azure/durabletask GitHub.
Nota
Sono necessari account di Archiviazione di Azure per utilizzo generico standard quando si usa il provider di Archiviazione di Azure. Tutti gli altri tipi di account di archiviazione non sono supportati. È consigliabile usare account di archiviazione per utilizzo generico v1 legacy perché gli account di archiviazione v2 più recenti possono essere notevolmente più costosi per i carichi di lavoro di Durable Functions. Per altre informazioni sui tipi di account di Archiviazione di Azure, vedere la documentazione Panoramica dell'account di archiviazione.
Netherite
Il backend di archiviazione di Netherite è stato progettato e sviluppato da Microsoft Research. Usa Hub eventi di Azure e una tecnologia di database PIÙ VELOCE oltre a BLOB di pagine di Azure. La progettazione di Netherite consente un'elaborazione significativamente più elevata della velocità effettiva di orchestrazioni ed entità rispetto ad altri provider. In alcuni scenari di benchmark la velocità effettiva ha mostrato di aumentare di più di un ordine di grandezza rispetto al provider di Archiviazione di Azure predefinito.
I vantaggi principali del provider di Netherite includono:
- Velocità effettiva significativamente più elevata a un costo inferiore rispetto ad altri provider di archiviazione.
- Supporta l'ottimizzazione delle prestazioni dei prezzi, consentendo di aumentare le prestazioni in base alle esigenze.
- Supporta fino a 32 partizioni di dati con SKU Basic e Standard di Hub eventi.
- Più conveniente rispetto ad altri provider per carichi di lavoro con velocità effettiva elevata.
Per altre informazioni sui dettagli tecnici del provider di archiviazione di Netherite, tra cui come iniziare a usarlo, vedere la documentazione di Netherite. Il codice sorgente per il provider di archiviazione di Netherite è disponibile nel repository microsoft/durabletask-netherite GitHub. Una valutazione più approfondita del provider di archiviazione di Netherite è disponibile anche nel seguente documento di ricerca: Flussi di lavoro serverless con Durable Functions e Netherite.
Nota
Il nome Netherite proviene dal mondo di Minecraft.
Microsoft SQL Server (MSSQL)
Il provider di archiviazione di Microsoft SQL Server (MSSQL) mantiene tutti gli stati in un database di Microsoft SQL Server. È compatibile sia con le distribuzioni di SQL Server locali che con quelle ospitate nel cloud, tra cui il Database SQL di Azure.
I vantaggi principali del provider di archiviazione di MSSQL includono:
- Supporta gli ambienti disconnessi: non è necessaria una connessione ad Azure quando si usa un'installazione di SQL Server.
- Portabile in più ambienti e cloud, tra cui gli ambienti ospitati in Azure e in locale.
- Coerenza robusta dei dati, abilitazione del backup/ripristino e failover senza perdita di dati.
- Supporto nativo per la crittografia dei dati personalizzata (funzionalità di SQL Server).
- Si integra con applicazioni di database esistenti tramite stored procedure predefinite.
Per altre informazioni sui dettagli tecnici del provider di archiviazione di MSSQL, tra cui come iniziare a usarlo, vedere la documentazione del provider di Microsoft SQL. Il codice sorgente per il provider di archiviazione di MSSQL è disponibile nel repository microsoft/durabletask-mssql GitHub.
Configurare altri provider di archiviazione
La configurazione di provider di archiviazione alternativi è in genere un processo in due passaggi:
- Aggiungere il pacchetto NuGet appropriato all'app per le funzioni (questo requisito è temporaneo per le app che usano bundle di estensioni).
- Aggiornare il file host.json per specificare il provider di archiviazione da usare.
Se nessun provider di archiviazione è configurato in modo esplicito in host.json, per impostazione predefinita verrà abilitato il provider di Archiviazione di Azure.
Configurare il provider di Archiviazione di Azure
Il provider di Archiviazione di Azure è il provider di archiviazione predefinito e non richiede alcuna configurazione esplicita, riferimenti al pacchetto NuGet o riferimenti al bundle di estensioni. È possibile trovare il set completo di opzioni di configurazione host.json qui sotto il percorso extensions/durableTask/storageProvider
.
Connessioni
La proprietà connectionName
in host.json è un riferimento alla configurazione dell'ambiente che specifica come l'app deve connettersi ad Archiviazione di Azure. Può specificare:
- Nome di un'impostazione dell'applicazione contenente una stringa di connessione. Per ottenere una stringa di connessione, seguire la procedura descritta in Gestire le chiavi di accesso dell’account di archiviazione.
- Nome di un prefisso condiviso per più impostazioni dell'applicazione, insieme alla definizione di una connessione basata su identità.
Se il valore configurato è sia una corrispondenza esatta per una singola impostazione che una corrispondenza di prefisso per altre impostazioni, viene usata la corrispondenza esatta. Se non viene specificato alcun valore in host.json, il valore predefinito è "AzureWebJobsStorage".
Connessioni basate su identità
Se si usa la versione 2.7.0 o successiva dell'estensione e il provider è Archiviazione di Azure, è possibile fare usare all’app un’identità di Microsoft Entra anziché una stringa di connessione con un secreto. A tale scopo, è necessario definire le impostazioni in un prefisso comune che esegue il mapping alla proprietà connectionName
nella configurazione del trigger e dell'associazione.
Per usare una connessione basata su identità per Durable Functions, configurare le impostazioni dell'app seguenti:
Proprietà | Modello di variabile di ambiente | Descrizione | Valore di esempio |
---|---|---|---|
URI del servizio BLOB | <CONNECTION_NAME_PREFIX>__blobServiceUri |
URI del piano dati del servizio BLOB dell'account di archiviazione, usando lo schema HTTPS. | https://<storage_account_name>.blob.core.windows.net |
URI del servizio di accodamento | <CONNECTION_NAME_PREFIX>__queueServiceUri |
URI del piano dati del servizio di accodamento dell'account di archiviazione, usando lo schema HTTPS. | https://<storage_account_name>.queue.core.windows.net |
URI del servizio tabelle | <CONNECTION_NAME_PREFIX>__tableServiceUri |
URI del piano dati di un servizio tabelle dell'account di archiviazione, usando lo schema HTTPS. | https://<storage_account_name>.table.core.windows.net |
È possibile impostare proprietà aggiuntive per personalizzare la connessione. Vedere Proprietà comuni per le connessioni basate su identità.
Quando sono ospitate nel servizio Azure Functions, le connessioni basate su identità usano una identità gestita. Per impostazione predefinita, viene usata l’identità assegnata a livello di sistema, ma è comunque possibile specificare un’identità assegnata dall’utente a cui siano associate le proprietà credential
e clientID
. Si noti che la configurazione di un'identità assegnata dall'utente con un ID risorsa non è supportata. Quando viene eseguita in altri contesti, ad esempio lo sviluppo locale, viene usata l'identità dello sviluppatore, anche se può essere personalizzata. Vedere Sviluppo locale con connessioni basate su identità.
Concedere l'autorizzazione all'identità
Qualsiasi identità usata deve avere le autorizzazioni necessarie per eseguire le azioni previste. Per la maggior parte dei servizi di Azure, questo significa che è necessario assegnare un ruolo nel controllo degli accessi in base al ruolo di Azure, usando ruoli predefiniti o personalizzati che forniscono tali autorizzazioni.
Importante
È possibile che alcune autorizzazioni esposte dal servizio di destinazione non siano necessarie per tutti i contesti. Laddove possibile, rispettare il principio dei privilegi minimi e concedere all’identità solo i privilegi necessari. Ad esempio, se l'app deve essere in grado di leggere solo da un'origine dati, usare un ruolo che disponga solo dell'autorizzazione per la lettura. Sarebbe inappropriato assegnare un ruolo che consenta anche la scrittura in tale servizio, in quanto sarebbe eccessiva l'autorizzazione per un'operazione di lettura. Analogamente, è consigliabile assicurarsi che l'assegnazione di ruolo sia con ambito solo sulle risorse che devono essere lette.
È necessario creare un'assegnazione di ruolo che fornisca l'accesso ad Archiviazione di Azure in fase di esecuzione. I ruoli di gestione come Proprietario non sono sufficienti. Quando si usa l'estensione Durable Functions in condizioni di normale funzionamento, è consigliabile usare i ruoli predefiniti seguenti:
- Collaboratore dati BLOB di archiviazione
- Collaboratore ai dati della coda di archiviazione
- Collaboratore ai dati della tabella di archiviazione
L'applicazione potrebbe richiedere più autorizzazioni in base al codice scritto. Se si usa il comportamento predefinito o si imposta in modo esplicito connectionName
su "AzureWebJobsStorage", vedere Connessione all'archiviazione host con un'identità per altre considerazioni sulle autorizzazioni.
Configurare il provider di archiviazione di Netherite
Per abilitare il provider di archiviazione di Netherite, è necessario modificare la configurazione nel host.json
. Per gli utenti di C#, è necessario anche un passaggio di installazione aggiuntivo.
host.json
Configurazione
L’esempio host.json seguente mostra la configurazione minima necessaria per abilitare il provider di archiviazione ei Netherite.
{
"version": "2.0",
"extensions": {
"durableTask": {
"storageProvider": {
"type": "Netherite",
"storageConnectionName": "AzureWebJobsStorage",
"eventHubsConnectionName": "EventHubsConnection"
}
}
}
}
Per istruzioni di configurazione più dettagliate, vedere la documentazione introduttiva di Netherite.
Installare l'estensione di Netherite (solo .NET)
Nota
Se l'app usa un bundle di estensioni, è consigliabile ignorare questa sezione perché i bundle di estensioni eliminano la necessità di gestire manualmente le estensioni.
È necessario installare la versione più recente dell’estensione di Netherite in NuGet. In genere ciò comporta includere un riferimento all’estensione nel file .csproj
e compilare il progetto.
Il pacchetto di estensione da installare dipende dal ruolo di lavoro .NET in uso:
- Per il ruolo di lavoro .NET In-Process installare
Microsoft.Azure.DurableTask.Netherite.AzureFunctions
. - Per il ruolo di lavoro .NETIsolato, installare
Microsoft.Azure.Functions.Worker.Extensions.DurableTask.Netherite
.
Configurare il provider di archiviazione di MSSQL
Per abilitare il provider di archiviazione di MSSQL, è necessario modificare la configurazione nel host.json
. Per gli utenti di C#, è necessario anche un passaggio di installazione aggiuntivo.
host.json
Configurazione
L’esempio seguente mostra la configurazione minima necessaria per abilitare il provider di archiviazione MSSQL.
{
"version": "2.0",
"extensions": {
"durableTask": {
"storageProvider": {
"type": "mssql",
"connectionStringName": "SQLDB_Connection"
}
}
}
}
Per istruzioni di configurazione più dettagliate, vedere la documentazione introduttiva del provider di MSSQL.
Aggiungere l'estensione Durable Task MSSQL (solo .NET)
Nota
Se l'app usa un bundle di estensioni, è consigliabile ignorare questa sezione perché i bundle di estensioni eliminano la necessità di gestire manualmente le estensioni.
È necessario installare la versione più recente dell’estensione del provider di archiviazione di MSSQL in NuGet. In genere ciò comporta includere un riferimento all’estensione nel file .csproj
e compilare il progetto.
Il pacchetto di estensione da installare dipende dal ruolo di lavoro .NET in uso:
- Per il ruolo di lavoro .NET In-Process installare
Microsoft.DurableTask.SqlServer.AzureFunctions
. - Per il ruolo di lavoro .NETIsolato, installare
Microsoft.Azure.Functions.Worker.Extensions.DurableTask.SqlServer
.
Confrontare i provider di archiviazione
Esistono molti compromessi significativi tra i vari provider di archiviazione supportati. È possibile usare la tabella seguente per comprendere questi compromessi e decidere quale provider di archiviazione è più adatto alle proprie esigenze.
Provider di archiviazione | Archiviazione di Azure | Netherite | MSSQL |
---|---|---|---|
Stato del supporto ufficiale | ✅ Disponibile a livello generale (GA) | ✅ Disponibile a livello generale (GA) | ✅ Disponibile a livello generale (GA) |
Dipendenze esterne | Account di Archiviazione di Azure (uso generico v1) | Hub eventi di Azure Account di Archiviazione di Azure (per utilizzo generico) |
SQL Server 2019 o Database SQL di Azure |
Opzioni di sviluppo e emulazione locali | Azurite v3.12+ (multipiattaforma) | Supporta l'emulazione in memoria degli hub attività (altre informazioni) | SQL Server Developer Edition (supporta Windows, Linux e i contenitori Docker) |
Configurazione dell'hub attività | Esplicito | Esplicito | Implicita per impostazione predefinita (altre informazioni) |
Velocità effettiva massima | Moderato | Molto alto | Moderato |
Scalabilità orizzontale massima di orchestrazione/entità (nodi) | 16 | 32 | N/D |
Scalabilità orizzontale massima dell'attività (nodi) | N/D | 32 | N/D |
Supporto di durable entities | ✅ Supporto completo | ✅ Supporto completo | ⚠️ Supportato tranne quando si usa .NET Isolato |
Supporto della scalabilità KEDA 2.0 (altre informazioni) |
❌ Non supportato | ❌ Non supportato | ✅ Supportato tramite lo scaler MSSQL (altre informazioni) |
Supporto per i bundle di estensioni (consigliato per le app non.NET) | ✅ Supporto completo | ✅ Supporto completo | ✅ Supporto completo |
Prestazioni di prezzo configurabili? | ❌ No | ✅ Sì (TU e CU di Hub eventi) | ✅ Sì (vCPU SQL) |
Supporto dell'ambiente disconnesso | ❌ Connettività di Azure necessaria | ❌ Connettività di Azure necessaria | ✅ Supporto completo |
Connessioni basate su identità | ✅ Supporto completo | ❌ Non supportato | ⚠️ Richiede il ridimensionamento basato su runtime |
Piano A consumo Flex | ✅ Completamente supportato (vedere le note) | ❌ Non supportato | ❌ Non supportato |