Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 11 Min.

Fun with Flags

Erhalten Sie die volle Kontrolle über die Auslieferung Ihrer Lösung.
© dotnetpro
In Zeiten von DevOps zählen Feature-Flags wohl zu den wichtigsten Patterns überhaupt – und doch gibt es noch ­viele Teams, die sich noch nicht damit beschäftigt haben. Zu den DevOps-Praktiken gehört es auch, unterbrechungsfrei zu installieren (Zero-Downtime-Deployment), Deployments mit einem kleineren Benutzerkreis zu testen (Canary-Releases), Experimente mit unterschiedlichen Versionen von Software durchzuführen (A/B-Testing) und Funktionalität optional anzubieten (Opt-In). Das alles wird nur durch den Einsatz von Feature-Flags möglich.Feature-Flags sind ein Design-Pattern, bei dem bestimmte Funktionen (Features) abhängig von einer Konfiguration zur Laufzeit aktiviert oder deaktiviert werden können [1]. Ursprünglich wurden Feature-Flags wegen ihrer booleschen Natur als Feature-Toggle [2] bezeichnet. Ein anderer bekannter Name für dieses Pattern ist Feature-Switch. Mit der zunehmenden Bedeutung von A/B-Testing und Canary-Releases wurden die Toggles komplexer und es hat sich der Name Feature-Flags emanzipiert [3].Die Konfiguration von Feature-Flags kann von folgenden Bedingungen abhängen:
  • dem Benutzer oder einem Benutzerattribut (Land, Name, Gruppenmitgliedschaft et cetera),
  • der Umgebung (Server, Netzwerk, Mandant et cetera),
  • dem Zufall.
Einsatzvon Feature-Flags(Bild 1) © Autor
Eine Mischung dieser Bedingungen ist ebenfalls erlaubt. Zum Beispiel können Sie ein Feature für zwanzig Prozent aller Benutzer in einem bestimmten Land aktivieren (Bild 1). Je nach Einsatzgebiet unterscheidet man verschiedene Kategorien von Feature-Flags:
  • Release-Flags,
  • Deployment-Flags,
  • Experiment-Flags,
  • Operations-Flags (auch Ops-Flags genannt),
  • Permission-Flags.
Release-Flags erlauben es, unfertige Funktionalität im Master-Branch zu entwickeln und mit auszuliefern. Besonders DevOps-Teams, die Continuous Deployment praktizieren, verwenden diese Technik, um die Auslieferung von Funktionalität vom Deployment von Code zu trennen.Deployment-Flags werden teilweise auch den Release- oder Ops-Flags zugeordnet. Sie dienen dem „Scharfschalten" von neuen Versionen eines Features nach erfolgtem Deployment der Binaries. Sie sind oft erforderlich, wenn man unterbrechungsfreie Deplyoments (Zero-Downtime-Deployments) praktiziert. Deployment-Flags sind meistens sehr langlebig – deshalb empfiehlt es sich, diese von den anderen Arten zu unterscheiden.Mit Experiment-Flags betreibt man A/B-Testing. Zur Laufzeit erhalten Benutzer unterschiedliche Versionen einer bestimmten Funktionalität. Dabei misst man das Verhalten der Benutzer durch das Sammeln bestimmter Messwerte und kann so die Anwendung auf Basis erfasster Daten optimieren.Operations- oder Ops-Flags werden für den Betrieb der Software eingesetzt. Sie können verwendet werden, um kurzfristige Effekte auf die Infrastruktur zu testen. Sie können aber auch langfristig, als „Kill-Switches" oder manuelle Sicherheitsschalter (Circuit-Breaker) im Code verbleiben, um eine bestimmte Funktionalität kurzfristig – zum Beispiel beim Ausfall eines anderen Systems – zu aktivieren oder zu deaktivieren.Permission-Flags dienen dazu, unterschiedlichen Benutzergruppen ein jeweils anderes Anwendungsverhalten an­zubieten. So können zum Beispiel Premium-Features bestimmten zahlenden Kunden angeboten werden. Oder Tester, interne Mitarbeiter oder Administratoren erhalten zusätzliche Menüeinträge mit erweiterten Funktionen.Die Kategorien sind nicht in Stein gemeißelt und die Unterscheidung ist nicht immer ganz eindeutig. Da sich aber der Lebenszyklus und die Bedeutung der einzelnen Flags in einer Kategorie extrem unterscheiden, empfiehlt es sich, in jedem Team die verwendeten Kategorien zu definieren und ­eine Namenskonvention dafür einzuführen. So weiß jedes Teammitglied auf den ersten Blick, um was für ein Flag es sich handelt.Auf den ersten Blick wirkt es sehr einfach, Feature-Flags zu implementieren: Man muss nur einen neuen Eintrag in das Konfigurationssystem der Anwendung eintragen, zur Laufzeit auslesen und in einer If-Else-Abfrage im Code darauf reagieren. Damit kann aber nur ein Bruchteil der Möglichkeiten ausgeschöpft werden.Will man Feature-Flags wirklich richtig implementieren, dann benötigt man ein System, das den folgenden Anforderungen gerecht wird:
  • Verwaltung der Feature-Flags an einer zentralen Stelle außerhalb der Anwendung.
  • Änderung der Konfiguration zur Laufzeit ohne Downtime.
  • Gleichzeitiges Ändern der Konfiguration in allen Komponenten und auch auf allen Systemen.
  • Ändern der Konfiguration auf Basis von Benutzer, Ma­schine, prozentualer Anteile et cetera.
  • Optimale Performance und Ausfallsicherheit.
Besonders die Aspekte Ausfallsicherheit und Performance sind dabei nicht zu unterschätzen. Sind diese Aspekte nicht gegeben, dann werden Feature-Flags schnell zum Flaschenhals. Wer ein Feature-Flag-System selber bauen und dauerhaft betreiben will, darf die zu tätigenden Investitionen nicht unterschätzen. Es gibt jedoch etliche Frameworks, die Sie bei der Implementierung unterstützen. Für .NET sind das zum Beispiel FeatureSwitcher [4], NFeature [5], FlipIt [6], FeatureToggle [7] und FeatureBee [8].Die Frameworks unterscheiden sich hinsichtlich der Feature-Flags. Manche verwenden Strings, andere Enums oder Klassen. Alle sind aber sprachabhängig und keines hat meines Wissens ein zentrales Portal zur Verwaltung oder ein skalierbares Backend [9].Wer die Investition in den Aufbau eines eigenen Systems scheut, der kann Feature-Flags auch als Service von LaunchDarkly [10] beziehen. LaunchDarkly bietet eine komplette Lösung in der Cloud und unterstützt .NET, Java, Python, Ruby, Go, Node, JavaScript, iOS, Android und PHP. Es hat ein eigenes Portal zum Verwalten der Flags und man kann über das Portal auch Experimente durchführen.LaunchDarkly unterstützt die Integration mit Visual Studio Team Services, BitBucket, Slack, HipChat, Optimizly und New Relic. Es hat einen minimalen Footprint und kann daher auch in performantem Code eingesetzt werden [11].Die Preise von LaunchDarkly beginnen bei 79 US-Dollar pro Monat für zwei Projekte und 10.000 aktive Benutzer und gehen bis 699 US-Dollar pro Monat für eine unbegrenzte Anzahl an Projekten. Preise für den Enterprise Plan erhält man auf Anfrage. Es gibt auch Pläne für den akademischen Einsatz und für Non-Profit-Organisationen. Diese Preise erhält man ebenfalls auf Anfrage.Wer neu im Thema Feature-Flags ist, der tut sicherlich gut daran, erst einmal Erfahrung mit dem Cloud-Dienst zu sammeln. Wer schon Erfahrung hat und langfristig in das Thema investieren will, der kann sich selbst eine besser integrierte Lösung aufbauen.Für das erste Kennenlernen bietet LaunchDarkly einen kostenlosen 30-Tage-Test an. Dazu muss man sich unter [12] registrieren. Danach kann man im Portal ein neues Flag erstellen (Bild 2). Das Flag besteht aus einem Namen, einem Key und einer Beschreibung. Normale Flags sind boolean, geben also True oder False zurück. Es gibt aber auch multivariate Flags. Hier können Zahlen, Text oder JSON-Objekte zurückgegeben werden.
Ein Feature-Flagerstellen(Bild 2) © Autor
Dies kann sinnvoll sein, wenn man zum Beispiel Permis­sion-Flags für unterschiedliche Preismodelle verwenden möchte. So kann man in einem einzigen Flag zwischen Basic, Premium VIP et cetera unterscheiden und das Design und die Features entsprechend anpassen. Wird ein Flag nicht als permanent markiert, so bekommt man von LaunchDarkly eine Aufforderung, das Flag zu löschen, wenn es an alle Benutzer ausgerollt ist.Anschließend kann man dem Projekt in Visual Studio das NuGet-Paket LaunchDarkly.Client hinzufügen. Als Erstes muss man nun ein LdClient-Objekt erstellen. Diesem gibt man im Konstruktor den SDK-Key der gewünschten Umgebung (Dev/Test/Prod) mit. Dieser sollte natürlich aus der Konfiguration gelesen werden. Die SDK-Keys erhält man aus der Konfiguration der Umgebungen unter Account settings – ­siehe Bild 3. Dort kann man auch neue Umgebungen anlegen oder bestehende umbenennen.
Umgebungenverwalten(Bild 3) © Autor
Als Nächstes erstellt man ein Objekt vom Typ LaunchDarkly.Client.User. Das Objekt hat ein Fluent-Interface zum Setzen der Attribute. Es stehen unter anderem Key, Name, Vorname, Land, IPAdresse zur Verfügung – es können aber auch weitere Attribute hinzugefügt werden.Die Benutzer werden in LaunchDarkly automatisch angelegt und aktualisiert. Zum Prüfen von normalen Flags gibt es die Methode BoolVariation. Sie übernimmt das User-Objekt, den Namen des Flags und einen Standardwert als Parameter und gibt True oder False zurück.Für multivariante Flags gibt es die Methoden IntVariation, FloatVariation, StringVariation und JsonVariation mit denselben Parametern. Letztere liefert ein Objekt vom Typ Newtonsoft.Json.Linq.JToken.
Listing 1: Feature-Flag im Code
using (<span class="hljs-keyword">var</span> client = new LdClient(<br/>  ConfigurationManager.AppSettings[<span class="hljs-string">"EnvironmentKey"</span>])) <br/>{ <br/>  User user = LaunchDarkly.Client.User <br/>    .WithKey(<span class="hljs-keyword">this</span>.CurrentUser?.Id ?? <br/>      Session.SessionID) <br/>    .AndIpAddress(<br/>      <span class="hljs-keyword">this</span>.HttpContext.Request.UserHostAddress) <br/>    .AndAnonymous(<span class="hljs-keyword">this</span>.CurrentUser == <span class="hljs-literal">null</span>); <br/> <br/>  <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.CurrentUser != <span class="hljs-literal">null</span>) <br/>  { <br/>    user = user.AndEmail(<span class="hljs-keyword">this</span>.CurrentUser.Email) <br/>    .AndFirstName(<span class="hljs-keyword">this</span>.CurrentUser.FirstName) <br/>    .AndLastName(<span class="hljs-keyword">this</span>.CurrentUser.LastName) <br/>    .AndCountry(<span class="hljs-keyword">this</span>.CurrentUser.Country) <br/>    .AndCustomAttribute(<span class="hljs-string">"City"</span>, <span class="hljs-keyword">this</span>.CurrentUser.City) <br/>    .AndCustomAttribute(<span class="hljs-string">"Roles"</span>, <br/>      <span class="hljs-keyword">this</span>.CurrentUser.Roles?.Select(<br/>      x => x.RoleId).ToList()); <br/>  } <br/> <br/>  ViewBag.AccountType = client.BoolVariation(<br/>    <span class="hljs-string">"perm-premium-account"</span>, user, <span class="hljs-literal">false</span>) <br/>    ? <span class="hljs-string">"<<Premium Account>>"</span> <br/>    : <span class="hljs-string">"<<Normal Account>>"</span>; <br/> <br/>  ViewBag.AccountColor = client.StringVariation(<br/>    <span class="hljs-string">"perm-account-color"</span>, user, <span class="hljs-string">"green"</span>); <br/>}  
Den Code eines kompletten Beispiels aus einer ASP-Anwendung finden Sie in Listing 1.Bis auf ein paar Ausnahmen, die permanent in einer Anwendung bestehen, sollten Flags wieder entfernt werden, sobald das Feature an alle Benutzer ausgerollt ist. Wird dies nicht gemacht, dann entsteht eine technische Schuld – eine sogenannte technical debt [13]. Um diese zu kontrollieren, gilt es von vornherein ein System zu entwickeln, um Flags über ihren gesamten Lebenszyklus zu verwalten.Wie man ein Flag wieder entfernen kann, weiß man am besten zu dem Zeitpunkt, zu dem es erstellt wird. Wird nun ein Feature in einem Feature-Branch (zum Beispiel /features/awesome-xyz-support) entwickelt, dann wird dort ein Flag eingeführt.
<span class="hljs-params">...</span> 
<span class="hljs-keyword">if</span> (client.BoolVariation(
 <span class="hljs-string">"temp-awsome-xyz"</span>, user, <span class="hljs-literal">false</span>)) 
  do_new_thing(); 
<span class="hljs-keyword">else</span> 
  do_old_thing(); 
<span class="hljs-params">...</span> 
 
Bevor jetzt ein Pull-Request erstellt wird, wird ein zweiter Branch (zum Beispiel /cleanup/awsome-xyz-support) angelegt. In diesem Branch wird das Flag wieder entfernt.

... 
do_new_thing(); 
... 
 
Hier ist es wichtig, gleich ein richtiges System an Konventionen zu implementieren.Das Feature-Flag wird in diesem Beispiel mit dem Präfix temp versehen. Dadurch ist sofort erkenntlich, dass das Flag nicht permanent im Code verbleiben soll. Der Branch unter cleanup erhält denselben Namen wie das Feature-Flag. Somit ist sofort ersichtlich, dass das Flag über diesen wieder entfernt werden kann, wenn es nicht mehr benötigt wird. Die Namenskonventionen sind nur Bespiele und können für jede Umgebung angepasst werden.Wird nun der erste Pull-Request erfolgreich abgeschlossen und das neue Feature zusammen mit dem Flag zusammengeführt, kann sofort ein neuer Pull-Request für den cleanup-Branch erstellt werden. Das Flag lässt sich dann jederzeit wieder durch Abschließen des Pull-Requests entfernen, solange es keine Merge-Konflikte gibt [14].Außerdem sollten Flags regelmäßig kontrolliert werden. Es empfiehlt sich, eine Kennzahl für temporäre Flags zusammen mit den anderen Kennzahlen für die technische Schuld zu überwachen.Auf diese Weise wird sichergestellt, dass die Anzahl an temporären Flags nicht kontinuierlich steigt. Ein regelmäßiger Review kann auch in Sprint-Meetings integriert werden. So ist gesichert, dass alle Teammitglieder über die aktuell ausgerollten Feature-Flags Bescheid wissen.Um die Feature-Flags zu aktivieren, gibt es mehrere Optionen (Bild 4). Generell hat ein Feature einen Kill-Switch, mit dem es komplett deaktiviert werden kann. Dieser ist sowohl in der Feature-Liste (1) als auch in der Verwaltungs­seite (2) verfügbar und wird gerne am Anfang übersehen. Über Prerequisites (3) können einem Flag andere Flags als Vorbedingung zugeordnet werden. So lassen sich neue Datenbanken oder API-Versionen unabhängig von neuen UI-Features entwickeln und neue Features trotzdem nur dann aktivieren, wenn die Vorbedingungen erfüllt sind.
Benutzerzuordnen(Bild 4) © Autor
Benutzer können dann entweder direkt (4) oder über Regeln (5) adressiert werden. Bei den Regeln kann das Flag entweder direkt angegeben werden, oder es wird ein prozen­tualer Anteil verwendet. So könnte ein Flag zum Beispiel für 50 Prozent aller Benutzer in Deutschland freigeschaltet werden. Es lassen sich beliebig viele Regeln angeben, die der Reihe nach abgearbeitet werden. Trifft keine Regel zu, dann gilt die Default-Regel (6). Diese kann Verwendung finden, wenn ein rein prozentualer Anteil ohne weitere Einschränkungen freigeschaltet werden soll.Um Experimente (A/B-Testing) durchführen zu können, unterstützt LaunchDarkly durch das Sammeln von Seitenaufrufen, Klicks und benutzerdefinierten Ereignissen. Für die ersten beiden muss das JavaScript-SDK installiert werden. Dieses kann entweder über den Node Paket Manager installiert (npm install --save ldclient-js) oder direkt aus dem CDN von LaunchDarkly geladen werden (siehe Listing 2).
Listing 2: Installation des JavaScript-SDK
&lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;script&lt;/span&gt; &lt;span class="hljs-attr"&gt;src&lt;/span&gt;=&lt;span class="hljs-string"&gt;"https://app.launchdarkly.com/snippet/&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;  ldclient.min.js"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class="undefined"&gt;&lt;/span&gt;&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;script&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;&lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;script&lt;/span&gt; &lt;span class="hljs-attr"&gt;type&lt;/span&gt;=&lt;span class="hljs-string"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class="actionscript"&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="actionscript"&gt;  &lt;span class="hljs-keyword"&gt;var&lt;/span&gt; user = { &lt;/span&gt;&lt;br/&gt;&lt;span class="actionscript"&gt;    &lt;span class="hljs-string"&gt;"key"&lt;/span&gt;: &lt;span class="hljs-string"&gt;"@ViewBag.UserKey"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="actionscript"&gt;  }; &lt;/span&gt;&lt;br/&gt;&lt;span class="actionscript"&gt;  &lt;span class="hljs-keyword"&gt;var&lt;/span&gt; ldclient = LDClient.initialize(&lt;/span&gt;&lt;br/&gt;&lt;span class="actionscript"&gt;    &lt;span class="hljs-string"&gt;'@ViewBag.EnvironmentKey'&lt;/span&gt;, user); &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;script&lt;/span&gt;&amp;gt;&lt;/span&gt;  
Der LDClient ist mit dem Key für die Umgebung und einem Benutzer zu ini­tialisieren. Wichtig: Es muss die Client-side ID und nicht der SDK-Key verwendet werden (siehe Bild 5). Um auch Klick-Events auswerten zu können, müssen Sie die Anzeige in einem IFrame erlauben. Dies klappt über die Angabe zusätzlicher HTTP-Header, wie in Listing 3. Ist dies alles geschehen, wird die eigene Seite – wie in Bild 5 – durch Eingabe des URL (1) in einem IFrame angezeigt. Mithilfe der Developer Tools des Browsers Chrome können Sie nun den CSS-Selector für das gewünschte Klickziel kopieren (2) und in das Feld CSS selector eingeben (3). Der Selector wird validiert und das Ergebnis grafisch neben dem Feld dargestellt.
Zielefestlegen(Bild 5) © Autor
Für benutzerdefinierte Ereignisse bietet der Client aus dem SDK die Methode Track an. Ihr übergeben Sie den Benutzer, den Namen des Ereignisses und optional einen Text mit zusätzlichen Daten. Mehr ist nicht notwendig.Um das Experiment durchzuführen, werden einem Feature-Flag über dessen Einstellungen nun ein oder mehrere Ziele zugeordnet. An dieser Stelle werden später auch die Ergebnisse dargestellt. Sie sollten allerdings nicht gleich nervös werden, wenn die ersten Ergebnisse auf sich warten lassen, denn diese werden immer mit einem Zeitversatz von fünf Minuten berechnet. Der Gewinner eines Experiments wird erst dann ausgewiesen, wenn mehr als 1.000 Benutzer teilgenommen haben und das Vertrauen in das Ergebnis (Confidence) über 95 Prozent liegt.
Listing 3: HTTP-Header für Klick-Events
&lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;system.webServer&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;httpProtocol&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;customHeaders&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;add&lt;/span&gt; &lt;span class="hljs-attr"&gt;name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"X-Frame-Options"&lt;/span&gt; &lt;span class="hljs-attr"&gt;value&lt;/span&gt;=&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-string"&gt;"ALLOW-FROM https://app.launchdarkly.com"&lt;/span&gt;/&amp;gt;&lt;/span&gt; &lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;add&lt;/span&gt; &lt;span class="hljs-attr"&gt;name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Content-Security-Policy"&lt;/span&gt; &lt;span class="hljs-attr"&gt;value&lt;/span&gt;=&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-string"&gt;"frame-ancestors 'self' &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;        https://app.launchdarkly.com"&lt;/span&gt;/&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;customHeaders&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;httpProtocol&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;system.webServer&lt;/span&gt;&amp;gt;&lt;/span&gt;  
LaunchDarkly lässt sich über eine Extension [15] in Visual Studio Team Services (VSTS) und Team Foundation Server (TFS) integrieren. Die Extension erlaubt es, einem WorkItem eines oder mehrere Feature-Flags zuzuordnen. Über einen Release-Task lässt sich dann ein prozentualer Rollout in die Release-Pipeline integrieren. Dies erlaubt es, vollautomatisierte prozentuale Rollouts (Canary-Releases) durchzuführen und den Prozentsatz schrittweise zu erhöhen, sofern vorgegebene Grenzwerte erreicht werden. Das Ergebnis des Rollouts steht dann im WorkItem-Formular.Arbeiten Sie nicht mit TFS/VSTS, können Sie LaunchDarkly auch in eine Bitbucket-Pipeline integrieren. Hilft das auch nicht weiter, können Sie sich mithilfe von Webhooks ­eine eigene Integration „basteln". So sollte eine Integration in jede DevOps-Lösung gewährleistet sein.Wer sich bisher noch nicht mit Feature-Flags beschäftigt hat, der sollte dringend damit beginnen. In Zeiten von DevOps kommt man an diesem Pattern kaum vorbei, denn es bietet enorme Möglichkeiten. Aber man sollte den Aufwand nicht unterschätzen. Ein eigenes System für die Verwaltung bedeutet einen hohen Aufwand – und wenn Sie noch keine Erfahrung mit dem Thema haben, ist die Chance groß, dass das Ganze im Chaos endet. Aus diesem Grund habe ich hier LaunchDarkly ausführlich vorgestellt. Als Feature-Flag as a Service bietet es einen leichten Einstieg in das Thema. Sie können sich voll auf die richtige Verwendung des vorgegebenen Systems konzentrieren und vermeiden damit Chaos und die Gefahr einer großen technischen Schuld.Richtig eingesetzt sind Feature-Flags eines der mächtigsten Patterns für DevOps. Man sollte das Thema deshalb ernst nehmen und richtig angehen. 

Fussnoten

  1. Martin Fowler – Feature Toggles, http://www.dotnetpro.de/SL1707FeatureFlags1
  2. Wikipedia – Feature Toggle, http://www.dotnetpro.de/SL1707FeatureFlags2
  3. LaunchDarkly – Is it a feature flag or a feature toggle?, http://www.dotnetpro.de/SL1707FeatureFlags3
  4. FeatureSwitcher, http://www.dotnetpro.de/SL1707FeatureFlags4
  5. NFeature, http://www.dotnetpro.de/SL1707FeatureFlags5
  6. FlipIt, http://www.dotnetpro.de/SL1707FeatureFlags6
  7. FeatureToggle, http://www.dotnetpro.de/SL1707FeatureFlags7
  8. FeatureBee, http://www.dotnetpro.de/SL1707FeatureFlags8
  9. writeabout.net – There is no DevOps without feature flags!, http://www.dotnetpro.de/SL1707FeatureFlags9
  10. Homepage von LaunchDarkly, http://www.dotnetpro.de/SL1707FeatureFlags10
  11. writeabout.net – Roll out a service fabric application with LaunchDarkly and VSTS, http://www.dotnetpro.de/SL1707FeatureFlags11
  12. LaunchDarkly testen, http://www.dotnetpro.de/SL1707FeatureFlags12
  13. Technische Schuld (technical debt), http://www.dotnetpro.de/SL1707FeatureFlags13
  14. LaunchDarkly – How to use feature flags without technical debt, http://www.dotnetpro.de/SL1707FeatureFlags14
  15. LaunchDarkly Extension, http://www.dotnetpro.de/SL1707FeatureFlags15

Neueste Beiträge

DWX hakt nach: Wie stellt man Daten besonders lesbar dar?
Dass das Design von Websites maßgeblich für die Lesbarkeit der Inhalte verantwortlich ist, ist klar. Das gleiche gilt aber auch für die Aufbereitung von Daten für Berichte. Worauf besonders zu achten ist, erklären Dr. Ina Humpert und Dr. Julia Norget.
3 Minuten
27. Jun 2025
DWX hakt nach: Wie gestaltet man intuitive User Experiences?
DWX hakt nach: Wie gestaltet man intuitive User Experiences? Intuitive Bedienbarkeit klingt gut – doch wie gelingt sie in der Praxis? UX-Expertin Vicky Pirker verrät auf der Developer Week, worauf es wirklich ankommt. Hier gibt sie vorab einen Einblick in ihre Session.
4 Minuten
27. Jun 2025
„Sieh die KI als Juniorentwickler“
CTO Christian Weyer fühlt sich jung wie schon lange nicht mehr. Woran das liegt und warum er keine Angst um seinen Job hat, erzählt er im dotnetpro-Interview.
15 Minuten
27. Jun 2025
Miscellaneous

Das könnte Dich auch interessieren

UIs für Linux - Bedienoberflächen entwickeln mithilfe von C#, .NET und Avalonia
Es gibt viele UI-Frameworks für .NET, doch nur sehr wenige davon unterstützen Linux. Avalonia schafft als etabliertes Open-Source-Projekt Abhilfe.
16 Minuten
16. Jun 2025
Mythos Motivation - Teamentwicklung
Entwickler bringen Arbeitsfreude und Engagement meist schon von Haus aus mit. Diesen inneren Antrieb zu erhalten sollte für Führungskräfte im Fokus stehen.
13 Minuten
19. Jan 2017
Evolutionäres Prototyping von Business-Apps - Low Code/No Code und KI mit Power Apps
Microsoft baut Power Apps zunehmend mit Features aus, um die Low-Code-/No-Code-Welt mit der KI und der professionellen Programmierung zu verbinden.
19 Minuten
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige