Featureflags

Tipp

Diese Inhalte sind ein Auszug aus dem E-Book „Architecting Cloud Native .NET Applications for Azure“, verfügbar in der .NET-Dokumentation oder als kostenlos herunterladbare PDF-Datei, die offline gelesen werden kann.

Cloud Native .NET apps for Azure eBook cover thumbnail.

In Kapitel 1 haben wir bestätigt, dass es bei dem Begriff „cloudnativ“ vor allem um Geschwindigkeit und Agilität geht. Benutzer erwarten schnelle Reaktionszeiten, innovative Features und keine Downtime. Feature flags sind eine moderne Bereitstellungstechnik, die die Agilität für cloudnative Anwendungen erhöht. Sie ermöglichen es Ihnen, neue Features in einer Produktionsumgebung bereitzustellen, aber ihre Verfügbarkeit einzuschränken. Im Handumdrehen können Sie ein neues Feature für bestimmte Benutzer aktivieren, ohne die App neu zu starten oder neuen Code bereitzustellen. Sie trennen die Veröffentlichung neuer Features von ihrer Codebereitstellung.

Featureflags basieren auf bedingter Logik, die die Sichtbarkeit der Funktionalität für Benutzer zur Laufzeit steuern. In modernen cloudnativen Systemen ist es üblich, frühzeitig neue Features in der Produktion bereitzustellen, sie aber nur mit einer begrenzten Zielgruppe zu testen. Da die Konfidenz zunimmt, kann das Feature inkrementell für breitere Zielgruppen bereitgestellt werden.

Weitere Anwendungsfälle für Featureflags sind:

  • Beschränken von Premium-Funktionen auf bestimmte Kundengruppen, die bereit sind, höhere Abonnementgebühren zu zahlen.
  • Stabilisieren eines Systems, indem ein problematisches Feature schnell deaktiviert werden kann, um die Risiken eines Rollbacks oder sofortigen Hotfixes zu vermeiden.
  • Deaktivieren eines optionalen Features mit hohem Ressourcenverbrauch während der Spitzenauslastungszeiten.
  • Durchführen von experimental feature releases für kleine Benutzersegmente, um die Machbarkeit und Beliebtheit zu überprüfen.

Featureflags fördern auch die trunk-based Entwicklung. Es handelt sich um ein Branchmodell der Quellcodeverwaltung, bei dem Entwickler an Features eines einzelnen Branches zusammenarbeiten. Der Ansatz minimiert das Risiko und die Komplexität der Zusammenführung einer großen Anzahl zeitintensiver Featurebranches. Features sind bis zur Aktivierung nicht verfügbar.

Implementieren von Featureflags

Im Kern ist ein Featureflag ein Verweis auf ein einfaches decision object. Es gibt einen booleschen Zustand von on oder off zurück. Das Flag umschließt in der Regel einen Codeblock, der eine Featurefunktion kapselt. Der Zustand des Flags bestimmt, ob dieser Codeblock für einen bestimmten Benutzer ausgeführt wird. Abbildung 10-11 zeigt die Implementierung.

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

Abbildung 10-11: Einfache Implementierung von Featureflags.

Beachten Sie, wie dieser Ansatz die Entscheidungslogik vom Featurecode trennt.

In Kapitel 1 haben wir die Twelve-Factor App erörtert. Der Leitfaden empfiehlt, Konfigurationseinstellungen außerhalb des ausführbaren Codes der Anwendung beizubehalten. Bei Bedarf können Einstellungen aus der externen Quelle gelesen werden. Konfigurationswerte für Featureflags sollten auch unabhängig von ihrer Codebasis sein. Durch das Auslagern der Flagkonfiguration in einem separaten Repository können Sie den Flagzustand ändern, ohne die Anwendung zu ändern und erneut bereitzustellen.

Azure App Configuration bietet ein zentrales Repository für Featureflags. Sie können damit verschiedene Arten von Featureflags definieren und deren Zustände schnell und sicher ändern. Sie fügen Ihrer Anwendung die Clientbibliotheken für App Configuration hinzu, um Featureflagfunktionen zu aktivieren. Verschiedene Programmiersprachenframeworks werden unterstützt.

Featureflags können einfach in einem ASP.NET Core-Dienst implementiert werden. Durch die Installation der .NET-Featureverwaltungsbibliotheken und des App Configuration-Anbieters können Sie Ihrem Code deklarativ Featureflags hinzufügen. Sie aktivieren FeatureGate-Attribute, sodass Sie nicht manuell if-Anweisungen in Ihrer gesamten Codebasis schreiben müssen.

Nach der Konfiguration in Ihrer Startup-Klasse können Sie Featureflagfunktionen auf Controller-, Aktions- oder Middleware-Ebene hinzufügen. Abbildung 10-12 zeigt eine Controller- und Aktionsimplementierung:

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

Abbildung 10-12: Featureflagimplementierung in einem Controller und einer Aktion.

Wenn ein Featureflag deaktiviert ist, erhält der Benutzer den Statuscode 404 (Nicht gefunden) ohne Antworttext.

Featureflags können auch direkt in C#-Klassen eingefügt werden. Abbildung 10-13 zeigt das Einfügen von Featureflags:

public class ProductController : Controller
{
    private readonly IFeatureManager _featureManager;

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

Abbildung 10-13: Einfügen eines Featureflags in eine Klasse.

Die Featureverwaltungsbibliotheken verwalten den Lebenszyklus des Featureflags im Hintergrund. Damit z. B. die Anzahl der Aufrufe des Konfigurationsspeichers nicht zu hoch ist, speichern die Bibliotheken die Flagzustände für eine bestimmte Dauer im Cache. Sie können die Unveränderlichkeit von Flagzuständen während eines Anforderungsaufrufs garantieren. Sie bieten auch eine Point-in-time snapshot. Sie können den Verlauf eines beliebigen Schlüsselwerts rekonstruieren und den letzten Wert jederzeit innerhalb der vorherigen sieben Tage angeben.