High Scalability erwähnt hier Feature-Flags:
5 Dinge, die für die Skalierbarkeit giftig sind , "5. Fehlen von Feature-Flags"
Was genau sind Feature-Flags?
High Scalability erwähnt hier Feature-Flags:
5 Dinge, die für die Skalierbarkeit giftig sind , "5. Fehlen von Feature-Flags"
Was genau sind Feature-Flags?
Antworten:
Ein 'Feature-Flag' (oder Feature Toggle ) ist die Möglichkeit, Features (Unterabschnitte) Ihrer Anwendung auf einfache Weise ein- und auszuschalten:
Ich denke, das Beispiel dort war, dass es praktisch ist, die Steuerung zu haben, um den Funktionsumfang etwas zu reduzieren, wenn Sie beispielsweise Datenbankabfragen reduzieren müssen, wenn die Last zu hoch ist.
Es gibt jedoch noch viele andere Gründe , warum Sie dies verwenden möchten. Einer der Hauptgründe ist die Aktivierung der kontinuierlichen Bereitstellung : Sie können die Produktion / Live-Funktion aktivieren und die Funktion deaktivieren / umschalten, bis sie abgeschlossen ist. Wir verwenden häufig ein sogenanntes "Dev-Cookie", um unvollständige Funktionen nur dem Entwicklerteam anzuzeigen. Auf diese Weise können wir teilweise abgeschlossene Arbeiten in der Produktion (oh yeh! Gibt es eine bessere Integration?) Über mehrere Releases / Bereitstellungen testen, bevor wir sie deaktivieren (abgeschlossen) und sie für die Öffentlichkeit sichtbar werden.
Hier ist ein einfaches Paket, das Ihnen dabei hilft, dies in ASP.NET MVC zu tun: https://github.com/cottsak/DevCookie (vollständige Offenlegung: Ich bin der Autor)
Fowler hat auch einen viel längeren Artikel als den oben verlinkten mit viel mehr Details .
In diesem Beitrag (auch auf Fowlers Website) werden die verschiedenen Arten von Umschaltstrategien erläutert . DevCookie unterstützt die Mainline- / Trunk-basierte Strategie und wird im Artikel als " Release Toggle " bezeichnet.
In der Antwort von Adil wird hervorgehoben, dass es viele Begriffe und Gründe gibt, warum Sie möglicherweise einen Teil dieser Infrastruktur benötigen. Denken Sie daran, dass Sie möglicherweise nur einige dieser Dinge benötigen. Zum Beispiel möchte ich möglicherweise nur einen einfachen und agilen Bereitstellungs- / Bereitstellungsworkflow aktivieren, sodass eine einfache Infrastruktur ausreicht. Wenn Sie sich dann dafür entscheiden, mit # / eanstartup- Experimenten mit A / B, Kohortentests und Dingen wie kontrolliertem Roll-out zu experimentieren, sollten Sie ein Analysetool (z. B. Heap ) in Betracht ziehen , das diese datengesteuerten Entwicklungsmethoden als eindeutige Lösung erleichtert . Eine umschaltbare Infrastruktur, die alle oben genannten Aufgaben erfüllt, führt zu Aufblähung und unnötiger Komplexität.
Wenn Sie es bis hierher geschafft haben, möchten Sie vielleicht einige meiner anderen Gedanken zur Mainline-Entwicklung, zum Umschalten von Funktionen und zu anderen albernen Ideen wie TEST, QA, SIT, STAND, CROUCH lesen .
Feature Flag ist eine Technik, mit der Sie einige Funktionen Ihrer Anwendung über die Konfiguration deaktivieren können, ohne neuen Code bereitzustellen.
Feature-Flags spielen eine Schlüsselrolle im CI-Schema, in dem Features ständig bereitgestellt, aber nicht unbedingt für die Produktion "freigegeben" werden.
Mehr Infos hier:
- BEARBEITEN:
Feature-Flags, Feature-Toggles, Experimente und kontrollierte Rollouts sind Synonyme für eine einfache, aber leistungsstarke Idee: Separate Codebereitstellungen von Feature-Rollouts. Im Klartext ist es die Möglichkeit, die Commits Ihres Features auf die Produktion zu übertragen, während Sie auswählen, wer unter Ihren Kunden - wenn überhaupt jemand - dieses Feature sehen darf.
Sie wurden teilweise von Facebooks Gatekeeper populär gemacht . LinkedIn LiX ist ein weiteres gutes Beispiel.
Die Umsetzung dieser einfachen Idee bildet die Grundlage für viele Best Practices, darunter:
Kontinuierliche Bereitstellung / Bereitstellung - Mehrere Codes werden an einem Tag in die Produktion übertragen.
Trunk / Mainline-Entwicklung - Feature-Zweige sollten nur für Pull-Anforderungen erstellt werden, nicht für die langlebige Feature-Entwicklung.
Keine Release-Züge mehr um die Dinge festzumachen.
QA / Perf Testing in der Produktion - echte QA- und Leistungstests finden in der Produktionsinfrastruktur mit Produktionsverkehr statt. Verschwenden Sie keine Zeit damit, umfangreiche Leistungslabors und Staging-Umgebungen aufzubauen.
Experimentieren - wissen Sie, wie eine neue Funktion die Nadel in Ihren KPIs bewegt.
Vermeiden von Hotfixes oder Code-Rollbacks, wenn Probleme auftreten - Sowohl Hotfixes als auch Code-Rollbacks sind stressig, dauern lange und führen zu mehr Problemen als nötig. Schalten Sie stattdessen die Funktion aus oder fahren Sie sie herunter.
Andere haben Open-Source-Bibliotheken erwähnt. Ein gutes Beispiel für eine vollständige Lösung - wie Gatekeeper und LiX - ist Split . Ich arbeite für Split.
Hier gibt es viele gute Antworten, die alle auf der wichtigen, grundlegenden Definition basieren, die im Beitrag von Martin Fowler populär gemacht wurde :
Es handelt sich um Code-Teile, mit denen "Teams das Systemverhalten ändern können, ohne den Code zu ändern".
Wir haben sie also historisch als durch den Pseudocode dargestellt betrachtet:
if(app_settings["beta-mode"] == "true")
showAwesomeNewGui();
else
sameOldSnoozeFeset();
Das ist eine absolut genaue Art, darüber nachzudenken, und sowohl Matt als auch Adil erweitern es mit einer Vielzahl von taktischen Anwendungsfällen für das Feature-Flag.
Aber ich möchte eine überarbeitete Definition anbieten, die widerspiegelt, wie sich die Realität in den sechs Jahren entwickelt und verändert hat, seit dotnetdev die ursprüngliche Frage gestellt hat. Ich arbeite für Rollout.io , eine Plattform mit Feature-Flag, also hatte ich einen Sitz in der ersten Reihe für diese Entwicklung.
Einfach ausgedrückt, Feature-Flags sind nicht mehr nur eine Möglichkeit, Funktionen in Ihrer Anwendung ein- und auszuschalten. Das ist so, als würde man auf "Was ist eine Rechnungsposition" antworten, indem man sagt "Es ist eine Beschreibung und ein Währungsbetrag". Stimmt, aber es fährt nicht an der breiteren Stelle der Rechnung selbst.
Feature-Flags sind die taktischen Elemente einer übergreifenden strategischen Lösung in moderner Software. Mit diesen Mitteln verschieben Sie wichtige Entscheidungslogiken in Ihrem Code bis zur Laufzeit, wenn Sie weitere Informationen haben. Und vielleicht am wichtigsten ist, dass sie nicht mehr nur isoliert auftreten, sondern nur noch einmal überprüft werden, ob die Versionsnummer größer als 2,7 ist oder nicht. Unternehmen, die sie verwenden, schließen sie normalerweise als Teil eines umfassenden systemweiten Produktansatzes ein.
Wie andere bereits erwähnt haben, haben Facebook und LinkedIn Pionierarbeit geleistet, aber 2018 tun dies viele Unternehmen. Sie verschieben Entscheidungslogikfragen für die Laufzeit als Teil der Entwicklungsstrategie, der Betriebsstrategie (oder der DevOps-Strategie, wenn Sie möchten) und der Produktstrategie. Hier sind Beispiele für solche Fragen.
Um eine Anwendung zu haben, die eine erhebliche Anzahl solcher Entscheidungen bis zur Laufzeit aufschiebt, können Sie keine Feature-Flags ad-hoc in Ihre Anwendung werfen, oder Sie begraben sich in technischen Schulden. Heutzutage benötigen Sie eine umfassende Strategie zur Verwaltung von Feature-Flags, die einige verschiedene Komponenten umfasst.
Was sind also am Ende Feature-Flags?
Nun, sie sind ein wichtiger Bestandteil einer umfassenderen Strategie für eine Anwendung, die sowohl an technische als auch an Marktanforderungen angepasst werden kann.
Ein Feature-Flag (auch als Feature-Flipping oder Feature-Toggle bezeichnet ) ist ein Schalter zum Aktivieren oder Deaktivieren eines potenziell teuren Features nach Bedarf (z. B. wenn eine Site mit unerwartetem Datenverkehr überhäuft wird). Dies verschafft Ihnen ein wenig Zeit, bis Sie skalieren oder bis die Lastspitze verschwindet.
Hier ist ein Beispiel aus der SWIG-Dokumentation .
In meiner Firma hatten wir dafür eine eigene Lösung. Wir haben einen Dienst erstellt, der eine herunterladbare config ( .json
) - Datei für jede App bereitstellt . In dieser Konfiguration haben wir die Flags für die Features gespeichert. Basierend auf dieser Konfiguration kann die App die aktuelle Funktion ein- oder ausblenden. (Zum Beispiel einen Menüpunkt in der Seitenleiste ein- oder ausblenden).
Wir haben auch eine interne Administrationsseite erstellt, auf der wir die Feature-Flags konfigurieren können. Es hat eine Weile ziemlich gut funktioniert, aber danach hätten wir gerne User Targeting und A / B-Tests durchgeführt. Eigenentwicklung Da es zu aufwändig schien, haben wir uns für eine Lösung von Drittanbietern entschieden. Wie bereits hier erwähnt, gibt es dafür viele Lösungen.
Wir haben uns für ConfigCat entschieden, weil es angepasste Zielgruppen und prozentuales Rollout gleichzeitig unterstützt. Sie können die unterstützten Open-Source-SDKS auf Github überprüfen .
Mit Feature-Flags (oder Feature-Umschaltern) können Sie Features remote in einer Anwendung aktivieren, ohne die Anwendung neu erstellen / bereitstellen zu müssen. Auf diese Weise können Sie den Code für die Produktion bereitstellen, die Funktion jedoch erst freigeben, wenn Sie bereit sind. Sie können bestimmte Benutzer ansprechen, sodass Sie Ihren Beta-Benutzern eine neue Funktion zum Testen aktivieren können.
In unserem Unternehmen haben wir zuvor LaunchDarkly und andere Vorschläge von FeatureFlags.io verwendet . Wir haben auch versucht, die Remote-Konfiguration von Firebase zu verwenden, um diese Funktion zu gewährleisten. Wir haben jedoch festgestellt, dass sie für diesen Zweck nicht wirklich geeignet ist.
Am Ende haben wir unsere eigene Version namens Bullet Train entwickelt , die wir als Open-Source- Version haben. Es kombiniert sowohl Feature Flags / Toggles als auch Remote Config.
Feature Flags werden für verschiedene Zwecke verwendet. Die allgemeine Idee besteht darin, die Kontrolle darüber, welcher Benutzer welche Funktion sieht, an ein Remote-Dashboard oder ein Back-Office zu delegieren.
Sobald eine Funktion im Code markiert ist, können Sie jetzt mithilfe verschiedener Methoden bestimmen, welcher Benutzer sie in Ihrer Anwendung sieht: 1. Ein / Aus - Zeigen Sie die Funktion allen oder keinem Ihrer Benutzer an. 2. Allmähliche Freigabe - Zeigen Sie die Funktion nur einem Prozentsatz Ihrer Benutzer an und zeigen Sie sie dann schrittweise allen Benutzern an. 3. Targeting - Zeigen Sie die Funktion bestimmten Benutzern basierend auf den Eigenschaften oder Merkmalen dieses Benutzers.
Tools, die bei der Steuerung von Feature-Flags (Booleschen Werten) und Feature-Konfigurationen (Zeichenfolgen, Zahlen usw.) helfen, werden normalerweise als Feature-Management-Plattformen bezeichnet. Für das Feature-Management gibt es einen großartigen Service namens Configz.io
Unter dem Gesichtspunkt der Codierung kann ein Feature-Flag so einfach sein wie eine if
Anweisung, die einen neuen Code umgibt, den Sie schreiben. Wenn die if
Anweisung true ergibt (das Feature-Flag ist aktiviert), wird der neue Code ausgeführt.
In einem realen Beispiel für die Bereitstellung von Software wird die if
oben beschriebene Anweisung je nach Umgebung, in der die Software ausgeführt wird, unterschiedlich bewertet. Wenn die Anwendung beispielsweise auf Ihrem QS-Server ausgeführt wird, gibt das Feature-Flag true zurück und das neue Feature ist gesehen. Wenn es auf Ihrem Produktionsserver ausgeführt wird, gibt das Feature-Flag false zurück und das Feature wird ausgeblendet.
Aus meiner persönlichen Erfahrung während meiner Karriere habe ich Feature-Flags auf folgende Weise verwendet:
Entkopplung von Codebereitstellungen von der Freigabe von Funktionen an Kunden. Dies war meine erste Verwendung von Feature-Flags in unserem Entwicklungsprozess. Wir haben es verwendet, um die Abhängigkeit zwischen unserem Marketing- und Produktteam und dem Engineering-Team, das die Entwicklung und Releases durchgeführt hat, zu beseitigen. Mithilfe von Feature-Flags konnten wir unseren Code Wochen vor dem Start bereitstellen, während wir zuvor in der Nacht vor einer Veröffentlichung Code bereitgestellt haben!
Testen in der Produktion. Bevor wir bei der Veröffentlichung unseres Codes Feature-Flags verwendet haben, war dies ein Alles-oder-Nichts-Ereignis. Entweder haben alle unsere Kunden das Feature erhalten oder keiner von ihnen hat es getan. Wir haben Feature-Flags verwendet, um eine neue Funktion für einen kleinen Prozentsatz der Benutzer gleichzeitig bereitzustellen. Auf diese Weise konnten wir wertvolles Feedback und Daten zu einer neuen Funktion sammeln, ohne potenzielle Probleme für den gesamten Kundenstamm zu riskieren.
Aktivieren / Deaktivieren einer Funktion pro Umgebung im Entwicklungslebenszyklus. Wir haben dies in der Entwicklung ausgiebig genutzt, um einen reibungsloseren Bereitstellungsprozess zu ermöglichen. Wir verfügen über eine CI / CD-Pipeline, in der die Verwendung von Feature-Flags von entscheidender Bedeutung ist.
Erstellen eines Kill-Schalters. Wir haben bestimmte Funktionen unserer Anwendung mit einem Funktionsflag versehen, mit dem wir diese Funktion bei Problemen mit der Anwendung zu diesem Zeitpunkt "beenden" können. Wenn wir uns beispielsweise unter starker Last befinden, können wir bestimmte nicht wesentliche Funktionen der Website deaktivieren, um das Problem zu beheben.
Weitere Informationen zu Feature-Flags finden Sie hier.
Sie können Ihrem Code auf verschiedene Arten Feature-Flags hinzufügen.
Das Schreiben einer eigenen Bibliothek scheint zunächst eine gute Idee zu sein, und normalerweise kann es so beginnen. Es kann jedoch bald zu Problemen kommen, wenn Sie die erweiterten Anwendungsfälle von Feature-Flags implementieren möchten, z. B. die Bereitstellung für einen bestimmten Prozentsatz der Benutzer oder die Ausrichtung auf bestimmte Benutzergruppen. Ein weiteres Problem beim Erstellen Ihrer eigenen Feature-Flag-Implementierung besteht darin, dass Sie Ihren Code mehrmals implementieren müssen, wenn Sie mehrere Sprachen verwenden.
Der beste und einfachste Weg, Feature-Flags zu verwenden, ist die Verwendung eines Online-Feature-Flag-Verwaltungsdienstes wie Floodgate . Auf diese Weise können Sie die Plattform für all das schwere Heben nutzen, sodass Sie sich darauf konzentrieren können, die Funktion für Ihre Anwendung zu erstellen.
Hier ist ein Beispiel für das Hinzufügen eines Floodgate-Funktionsflags zu einer Anwendung mithilfe des .NET SDK.
using FloodGate.SDK;
var floodgateClient = new FloodGateClient("API-KEY");
var flag = floodgateClient.GetValue("a-new-feature", false);
if (flag)
{
// Execute the code for my new feature here...
}
Wenn Sie in einem Entwicklungsteam arbeiten und keine Feature-Flags verwenden und Probleme bei der Bereitstellung und Codeverwaltung im Team auftreten. Die Verwendung von Feature-Flags kann eine gute Möglichkeit sein, diese Probleme zu beheben. Es gibt auch einen netten Nebeneffekt von Feature-Flags, die die Entwicklungsgeschwindigkeit Ihres Teams beschleunigen.
Martin Fowler gibt hier eine sehr ausführliche Beschreibung der Feature-Flags , die ich Ihnen zum Lesen empfehle.
Ich verstehe, dass Feature-Flags Ihnen dabei helfen, die Funktionalität zu verbessern, indem Sie entscheiden, welche Benutzer bestimmte Features erhalten.
Angenommen, Sie möchten nur, dass Ihre Beta-Benutzer eine neue Funktion sehen. Sie würden diese Funktion für Beta-Benutzer "umschalten" und der Rest Ihrer Benutzer würde sie nicht sehen.
LDUser user = new LDUser("user@test.com");
boolean showFeature = ldClient.toggle("your.feature.key", user, false);
if (showFeature) {
// application code to show the feature
}
else {
// the code to run if the feature is off
}
Ich teste die Funktionsflags von LaunchDarkly für einige Front-End-JS-A / B-Tests - scheint gut zu funktionieren. Sie können diese Site auch auf Feature-Toggles und Feature-Flag-Bibliotheken überprüfen .
Mit Feature Flags können Sie ein Feature grundsätzlich ein- und ausschalten, ohne Änderungen am Code vornehmen oder eine neue Version veröffentlichen zu müssen. Dies ist eine wichtige Lösung, insbesondere für Entwickler mobiler Anwendungen, da sie keine Kontrolle über Benutzer haben, die ihre Anwendung auf eine neue Version aktualisieren möchten.
Es gibt mehrere Unternehmen, die diesen Service für Entwickler mobiler Anwendungen anbieten.
In meinem Unternehmen verwenden wir Feature-Flags für jedes neue Feature, das wir in unserer SaaS-App einführen. Abgesehen von den Vorteilen für die Leistung können wir damit auch neue Funktionen schrittweise einführen - indem wir den Hauptbenutzern zuerst neue Funktionen einführen, Feedback von ihnen erhalten und sie improvisieren, bevor wir sie allen Benutzern zur Verfügung stellen können.
Außerdem können wir das Angebot an einzelne Benutzer anpassen - Hauptbenutzer möchten alle Funktionen; Einfache Benutzer möchten möglicherweise nur die grundlegenden Dinge und werden möglicherweise von all den leistungsstarken komplexen Funktionen verwirrt. Es ermöglicht unserem Verkaufsteam auch, Upselling zu betreiben.
Und natürlich können wir, wie andere bereits betont haben, diese eine Funktion einfach deaktivieren, wenn wir feststellen, dass eine Funktion zu einer Leistungsverschlechterung führt (entweder für alle Clients oder für den einen Client, der ein Problem verursacht).