Condividi tramite


Flag di funzionalità

Suggerimento

Questo contenuto è un estratto dell'eBook, Progettazione di applicazioni .NET native del cloud per Azure, disponibile in .NET Docs o come PDF scaricabile gratuitamente che può essere letto offline.

Cloud Native .NET apps for Azure eBook cover thumbnail.

Nel capitolo 1, è stato affermato che il cloud nativo è relativo per lo più alla velocità e all'agilità. Gli utenti si aspettano tempi di risposta rapidi, funzionalità innovative e tempi di inattività pari a zero. Feature flags sono una tecnica di distribuzione moderna che consente di aumentare l'agilità delle applicazioni native del cloud. Consentono di distribuire nuove funzionalità in un ambiente di produzione, ma limitandone la disponibilità. Tramite un commutatore, è possibile attivare una nuova funzionalità per utenti specifici senza riavviare l'app o distribuire nuovo codice. Viene separato il rilascio delle nuove funzionalità dalla distribuzione del codice.

I flag di funzionalità sono basati sulla logica condizionale che controlla la visibilità delle funzionalità per gli utenti in fase di esecuzione. Nei sistemi moderni nativi del cloud, è comune distribuire nuove funzionalità nell'ambiente di produzione in anticipo, testandole con un gruppo di destinatari limitato. Con l'aumentare dell'attendibilità, la funzionalità può essere implementata in modo incrementale a gruppi di destinatari più ampi.

Altri casi d'uso dei flag di funzionalità includono:

  • Limitare la funzionalità Premium a specifici gruppi di clienti disposti a pagare tariffe di sottoscrizione più elevate.
  • Stabilizzare un sistema disattivando rapidamente una funzionalità problematica, evitando i rischi di un ripristino dello stato precedente o di un aggiornamento rapido immediato.
  • Disabilitare una funzionalità facoltativa con un utilizzo elevato delle risorse durante i periodi di utilizzo di picco.
  • Condurre experimental feature releases a segmenti di utenti di piccole dimensioni per convalidare la fattibilità e la popolarità.

I flag di funzionalità promuovono anche lo sviluppo trunk-based. Si tratta di un modello di diramazione del controllo del codice sorgente in cui gli sviluppatori collaborano alle funzionalità in un singolo ramo. L'approccio riduce al minimo il rischio e la complessità dell'unione di un numero elevato di rami di funzionalità a esecuzione prolungata. Le funzionalità non sono disponibili fino all'attivazione.

Implementazione di flag di funzionalità

Un flag di funzionalità è principalmente un riferimento a un semplice decision object. Restituisce uno stato booleano di on o off. Il flag esegue in genere il wrapping di un blocco di codice che incapsula una capacità della funzionalità. Lo stato del flag determina se il blocco di codice viene eseguito per un determinato utente. La figura 10-11 mostra l'implementazione.

if (featureFlag) {
    // Run this code block if the featureFlag value is true
} else {
    // Run this code block if the featureFlag value is false
}

Figura 10-11 - Implementazione semplice del flag di funzionalità.

Si noti che questo approccio separa la logica decisionale dal codice della funzionalità.

Nel capitolo 1, si è discusso di Twelve-Factor App. Le indicazioni consigliate consentono di mantenere le impostazioni di configurazione esterne dal codice eseguibile dell'applicazione. Quando necessario, le impostazioni possono essere lette dall'origine esterna. I valori di configurazione dei flag di funzionalità devono anche essere indipendenti dalla codebase. Esternalizzando la configurazione dei flag in un repository separato, è possibile modificare lo stato del flag senza modificare e ridistribuire l'applicazione.

Configurazione app di Azure fornisce un repository centralizzato per i flag di funzionalità. Con esso, si definiscono diversi tipi di flag di funzionalità e si modificano i relativi stati in modo rapido e sicuro. È possibile aggiungere le librerie client di Configurazione app all'applicazione per abilitare la funzionalità del flag di funzionalità. Sono supportati vari framework di linguaggi di programmazione.

I flag di funzionalità possono essere facilmente implementati in un servizio ASP.NET Core. L'installazione delle librerie di gestione delle funzionalità .NET e del provider di Configurazione app consente di aggiungere in modo dichiarativo flag di funzionalità al codice. Abilitano gli attributi FeatureGate in modo che non sia necessario scrivere manualmente istruzioni if nella codebase.

Dopo averli configurati nella classe Startup, è possibile aggiungere funzionalità di flag a livello di controller, azione o middleware. La figura 10-12 presenta l'implementazione del controller e dell'azione:

[FeatureGate(MyFeatureFlags.FeatureA)]
public class ProductController : Controller
{
    ...
}
[FeatureGate(MyFeatureFlags.FeatureA)]
public IActionResult UpdateProductStatus()
{
    return ObjectResult(ProductDto);
}

Figura 10-12 - Implementazione del flag di funzionalità in un controller e in un'azione.

Se un flag di funzionalità è disabilitato, l'utente riceverà un codice di stato 404 (Non trovato) senza corpo della risposta.

I flag di funzionalità possono anche essere inseriti direttamente nelle classi C#. La figura 10-13 mostra l'inserimento di flag di funzionalità:

public class ProductController : Controller
{
    private readonly IFeatureManager _featureManager;

    public ProductController(IFeatureManager featureManager)
    {
        _featureManager = featureManager;
    }
}

Figura 10-13 - Inserimento di flag di funzionalità in una classe.

Le librerie di Gestione funzionalità gestiscono il ciclo di vita dei flag di funzionalità in background. Ad esempio, per ridurre al minimo un numero elevato di chiamate all'archivio di configurazione, gli stati del flag della cache delle librerie per una durata specificata. Possono garantire l'immutabilità degli stati di flag durante una chiamata di richiesta. Offrono anche un oggetto Point-in-time snapshot. È possibile ricostruire la cronologia di qualsiasi valore chiave e specificare il valore passato in qualsiasi momento entro i sette giorni precedenti.