Provider di archiviazione Durable Functions

Durable Functions è un set di trigger e associazioni 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 di Archiviazione di Azure predefinito per Durable Functions sia sufficiente ed è il più semplice da usare perché non richiede alcuna configurazione aggiuntiva. Tuttavia, esistono compromessi di costo, scalabilità e gestione dei dati che possono favorire l'uso di un provider di archiviazione alternativo.

Sono stati sviluppati due provider di archiviazione alternativi per l'uso con Durable Functions e Durable Task Framework, ovvero il provider di archiviazione Netherite e il provider di archiviazione 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. Se si vuole 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 lease blob 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 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 di determinazione prezzi basato sul consumo basato sull'utilizzo (altre informazioni).
  • Supporto ottimale degli strumenti: Archiviazione di Azure offre emulazione locale multipiattaforma e si integra con Visual Studio, Visual Studio Code e Funzioni di Azure Core Tools.
  • Più maturo: Archiviazione di Azure era il back-end di archiviazione originale e testato più da battaglia per Durable Functions.
  • Supporto in anteprima per l'uso dell'identità anziché dei segreti per la connessione al provider di archiviazione.

Il codice sorgente per i componenti DTFx del provider di archiviazione Archiviazione di Azure è disponibile nel repository GitHub azure/durabletask.

Nota

Gli account per utilizzo generico standard Archiviazione di Azure sono necessari 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 Archiviazione di Azure, vedere la documentazione di panoramica dell'account Archiviazione.

Netherite

Il back-end di archiviazione Netherite è stato progettato e sviluppato da Microsoft Research. Usa Hub eventi di Azure e la tecnologia di database FASTER oltre ai 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 è stata mostrata per aumentare di più di un ordine di grandezza rispetto al provider di Archiviazione di Azure predefinito.

I vantaggi principali del provider di archiviazione 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 Netherite, tra cui come iniziare a usarlo, vedere la documentazione di Netherite. Il codice sorgente per il provider di archiviazione Netherite è disponibile nel repository GitHub microsoft/durabletask-netherite . È disponibile anche una valutazione più approfondita del provider di archiviazione Netherite nel seguente documento di ricerca: Flussi di lavoro serverless con Durable Functions e Netherite.

Nota

Il nome Netherite ha origine dal mondo di Minecraft.

Microsoft SQL Server (MSSQL)

Il provider di archiviazione Microsoft SQL Server (MSSQL) mantiene tutti gli stati in un database di Microsoft SQL Server. È compatibile con le distribuzioni locali e ospitate nel cloud di SQL Server, incluse le database SQL di Azure.

I vantaggi principali del provider di archiviazione MSSQL includono:

  • Supporta gli ambienti disconnessi: non è necessaria connettività di Azure quando si usa un'installazione di SQL Server.
  • Portabile in più ambienti e cloud, tra cui Azure ospitato e locale.
  • Coerenza assoluta 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 MSSQL, tra cui come iniziare a usarlo, vedere la documentazione del provider Microsoft SQL. Il codice sorgente per il provider di archiviazione MSSQL è disponibile nel repository GitHub microsoft/durabletask-mssql .

Configurazione di provider di archiviazione alternativi

La configurazione di provider di archiviazione alternativi è in genere un processo in due passaggi:

  1. Aggiungere il pacchetto NuGet appropriato all'app per le funzioni (questo requisito è temporaneo per le app che usano bundle di estensioni).
  2. 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, il provider di Archiviazione di Azure verrà abilitato per impostazione predefinita.

Configurazione del 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 estensione. Il set completo di opzioni di configurazione host.json è disponibile qui sotto il extensions/durableTask/storageProvider percorso.

Connessioni

La connectionName proprietà in host.json è un riferimento alla configurazione dell'ambiente che specifica come l'app deve connettersi a Archiviazione di Azure. Può specificare:

  • Nome di un'impostazione dell'applicazione contenente un stringa di connessione. Per ottenere un stringa di connessione, seguire la procedura illustrata in Gestire le chiavi di accesso dell'account di archiviazione.
  • Nome di un prefisso condiviso per più impostazioni dell'applicazione, definendo insieme una connessione basata sull'identità.

Se il valore configurato è una corrispondenza esatta per una singola impostazione e una corrispondenza di prefisso per altre impostazioni, viene usata la corrispondenza esatta. Se non viene specificato alcun valore in host.json, il valore predefinito è "AzureWebJobs Archiviazione".

Connessioni basate su identità

Se si usa la versione 2.7.0 o successiva dell'estensione e il provider di archiviazione di Azure, anziché usare un stringa di connessione con un segreto, è possibile che l'app usi un'identità Microsoft Entra. A tale scopo, è necessario definire le impostazioni con un prefisso comune che esegue il connectionName mapping alla proprietà 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 fornisce 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 nel normale funzionamento, è consigliabile usare i ruoli predefiniti seguenti:

L'applicazione potrebbe richiedere più autorizzazioni in base al codice scritto. Se si usa il comportamento predefinito o si imposta connectionName in modo esplicito su "AzureWebJobs Archiviazione", vedere Connessione per ospitare l'archiviazione con un'identità per altre considerazioni sulle autorizzazioni.

Configurazione del provider di archiviazione Netherite

L'abilitazione del provider di archiviazione Netherite richiede una modifica della configurazione in host.json. Per gli utenti 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 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 Netherite (solo .NET)

Nota

Se l'app usa bundle di estensioni, devi ignorare questa sezione perché i bundle di estensioni eliminano la necessità di gestire manualmente le estensioni.

È necessario installare la versione più recente dell'estensione Netherite in NuGet. Questo significa in genere includere un riferimento nel .csproj file e compilare il progetto.

Il pacchetto di estensione da installare dipende dal ruolo di lavoro .NET in uso:

Configurazione del provider di archiviazione MSSQL

L'abilitazione del provider di archiviazione MSSQL richiede una modifica della configurazione in host.json. Per gli utenti C#, è necessario anche un passaggio di installazione aggiuntivo.

host.json Configurazione

L'esempio seguente illustra 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 MSSQL.

Installare l'estensione MSSQL dell'attività durevole (solo .NET)

Nota

Se l'app usa bundle di estensioni, devi 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 MSSQL in NuGet. Questo significa in genere includere un riferimento nel .csproj file e compilare il progetto.

Il pacchetto di estensione da installare dipende dal ruolo di lavoro .NET in uso:

Confronto tra provider di archiviazione

Esistono molti compromessi significativi tra i vari provider di archiviazione supportati. La tabella seguente può essere usata per comprendere questi compromessi e decidere quale provider di archiviazione è più adatto alle proprie esigenze.

provider Archiviazione Archiviazione di Azure Netherite MSSQL
Stato di supporto ufficiale ✅ Disponibile a livello generale ✅ Disponibile a livello generale ✅ Disponibile a livello generale
Dipendenze esterne account Archiviazione di Azure (utilizzo generico v1) Hub eventi di Azure
account Archiviazione di Azure (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 contenitori Windows, Linux e Docker)
Configurazione dell'hub attività Esplicito Esplicito Implicit by default (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 per la scalabilità di KEDA 2.0
(altre informazioni)
❌ Non supportato ❌ Non supportato ✅ Supportato con il scaler MSSQL (altre informazioni)
Supporto per i bundle di estensioni (consigliato per le app non-.NET) ✅ Completamente supportato ✅ Completamente supportato ✅ Completamente supportato
Prestazioni di prezzo configurabili? ❌ No ✅ Sì (UR e UR di Hub eventi) ✅ Sì (vCPU SQL)
Supporto ambientale disconnesso ❌ Connettività di Azure necessaria ❌ Connettività di Azure necessaria ✅ Completamente supportato
Connessioni basate su identità ✅ Completamente supportato ❌ Non supportato ⚠️ Richiede il ridimensionamento basato sul runtime

Passaggi successivi