Funktionsumschaltung: Ansichten, Vorteile und Arbeiten mit ihnen in .NET


Der Funktionsschalter ist ein Tool, mit dem Sie von der alten zur neuen Funktionalität wechseln können, ohne die Anwendung neu zu erstellen und erneut freizugeben. Es wird implementiert, indem dem Code ein bedingter Operator ( if ) hinzugefügt wird, der es ermöglicht, das Verhalten des Programms durch einfaches Ändern des gewünschten Werts in der Konfigurationsdatei oder Datenbank zu steuern. Wenn Sie jemals die Einstellungen in einer INI-Datei bearbeitet haben, sind Sie mit dieser Technologie vertraut.

Wenn Sie tiefer graben, finden Sie eine Vielzahl verschiedener Optionen für die Schalter und die neuen Funktionen, die sie bieten. Dies wirft viele Fragen auf. Wo soll die Konfiguration platziert werden? Aber was ist, wenn es nicht mehr verfügbar ist? Vielleicht können Sie selbst ein einfaches Framework für die Arbeit mit Switches schreiben? Vielleicht ist es besser, eine fertige Lösung zu nehmen? Passt dies sowohl zu Monolithen als auch zu Microservices?

Dieses Material enthält grundlegende Informationen zu Funktionswechseln im Kontext der Entwicklung auf der .NET-Plattform. Der erste Teil enthält allgemeine Informationen zu den Schaltern. Sie sind völlig unabhängig von der spezifischen Implementierung und können für Fachleute nützlich sein, die mit einer Vielzahl von Plattformen arbeiten. Im zweiten Teil werden spezifische moderne Tools erläutert, die die Verwendung von Switches bei der Entwicklung für .NET erleichtern.

Ich habe versucht, einen Artikel zu schreiben, der Ihnen bei der Entscheidung hilft, ob und wie Funktionsumwandlungen in Ihrem speziellen Fall implementiert werden sollen. In unserer Abteilung werden Schalter bisher nur zur Lösung bestimmter Probleme verwendet. Beispielsweise muss unsere Anwendung häufig Rechts- und Buchhaltungsinformationen aus einem Katalog anfordern, die in zwei Formen dargestellt werden können: einem entfernten vollständigen Katalog und seiner lokalen Teilkopie. In den Anwendungseinstellungen können Benutzer auswählen, mit welchem ​​Verzeichnistyp die Anwendung gerade arbeiten soll. Die Pläne sehen die Einführung von Switches als gemeinsame Infrastruktur für das gesamte Projekt vor. Darauf aufbauend werden ähnliche Prozesse wie oben beschrieben aufgebaut.


Funktionsschalter Übersicht


Was ist das


In einfachen Worten ist die Bedeutung der Schalter wie folgt. Der Auftragnehmer geht unseren Code durch, der die Logik des Themenbereichs darstellt, und stößt auf eine bedingte Aussage. In dieser Erklärung fragt der Auftragnehmer, ob ein bedingter Code aus einer Registrierung ausgeführt werden muss, die weiß, wann und unter welchen Umständen die interessierende Funktionalität funktionieren sollte.


Infolgedessen geht der Executor entweder entlang eines Zweigs oder entlang eines anderen, und in einem entarteten Fall ist der andere Zweig einfach leer. Im einfachsten Fall nimmt der Schalter einen von zwei Werten ("Ein" und "Aus") unter der Kontrolle der verantwortlichen Person an, die die Registrierung verwaltet. Und Sie können sich etwas Komplizierteres einfallen lassen, z. B. Funktionen nur für bestimmte Benutzer oder für Benutzer aus bestimmten Ländern oder zu einem bestimmten Zeitpunkt.

Die Funktionsregistrierung kann verschiedene Formen annehmen. Der Punkt ist, an dem Sie diese Registrierung verwalten können, ohne die Anwendung anzuhalten oder erneut bereitzustellen. Switches können beispielsweise in einer Datei oder in einer Datenbank gespeichert werden oder über einen separaten Netzwerkdienst mit Switches verfügen. Im Folgenden wird die Bedienung der Schalter genauer betrachtet.

Ist das überhaupt relevant?


In seinem Artikel behauptet der Entwickler von featureflag.tech , dass Switches zur Standardpraxis in der Softwareentwicklung werden. Es gibt immer mehr Materialien zu Schaltern: theoretische Artikel, Geschichten über die Praxis der Implementierung von Schaltern, Berichte auf Konferenzen. Ich habe Links zu den interessantesten Materialien in den Text dieses Artikels aufgenommen. Alle Links sind im Abschnitt "Fazit" zusammengefasst .

Ich würde sagen, dass das Wachstum der Popularität von Schaltern durch Stabilisierung und Standardisierung in einigen Bereichen der Informationstechnologie erleichtert wird. In dem "blutigen Unternehmen" tauchen immer mehr Inseln der Stabilität auf. Eine Zunahme der Anzahl von Metriken in der Entwicklung, Automatisierung der Montage, Inspektion und Lieferung der Anwendung führt dazu, dass Entwicklungsprozesse transparenter und überschaubarer werden. Infolgedessen werden der Softwareentwicklung zunehmend Anforderungen an ein neues Level gestellt. Eine dieser Anforderungen ist der Wunsch, die Momente der Veröffentlichung der Anwendung und die Aufnahme neuer Funktionen, die von den Switches implementiert werden, rechtzeitig zu verbreiten. Die Fähigkeiten der Industrie sind bereits ausgereift, um diese industrielle Nachfrage zu befriedigen.

Es gibt sehr, sehr viele Tools für eine Vielzahl von Plattformen und für eine Vielzahl von Plattformen. Wahrscheinlich erklärt sich das Erscheinungsbild einer großen Anzahl von Tools durch die Einfachheit, mit der Sie die grundlegenden Funktionen von Switches implementieren können. Das Hinzufügen komplexerer und „schmackhafter“ Brötchen kann jedoch erhebliche Arbeitskosten erfordern. Daher werden viele Open-Source-Projekte, die Funktionswechsel implementieren, nicht mehr entwickelt und unterstützt. Dennoch bleibt eine beträchtliche Anzahl von Projekten, sowohl bezahlte als auch kostenlose, über Wasser. Die interessantesten davon (aus Sicht von .NET) werden im zweiten Teil des Artikels beschrieben .

Ein bisschen mehr


Dieser Artikel enthält ein gutes Diagramm, das die Funktionsweise der Schalter veranschaulicht. Ich lade Sie ein, sich damit vertraut zu machen.


Wir beginnen unsere Betrachtung der Schaltung mit Code. Lassen Sie in unserem Beispiel eine neue Funktion - die Richtigkeit des Ausfüllens des Dokuments überprüfen. Wir stellen sicher, dass das Dokument nur geprüft wird, wenn diese Funktionalität aktiviert ist. Machen wir einen Schaltpunkt:

 var document = GetDocument(); if (feature.IsEnabled("Feature #123. Document validation")) { Validate(document); } 

In diesem Fall bezieht sich die Funktion auf die Infrastruktur, mit der unsere Anwendung mit dem Router und der Funktionsregistrierung kommunizieren kann. Mithilfe dieser Infrastruktur finden wir heraus, ob das Dokument überprüft werden muss, und wenn ja, überprüfen Sie es.

Der Router verwendet die ihm zur Verfügung stehenden Informationen: den Namen der Funktionalität, die wir als Argument übergeben haben, und was wir aus den ihm bekannten statischen Klassen extrahieren können, um zu bestimmen, ob die angeforderte Funktionalität in diesem Fall funktionieren soll. Der Router findet heraus, wie die Switches in der Registrierung konfiguriert sind. Wenn die Registrierung nicht verfügbar ist, müssen Sie entweder die zuvor zwischengespeicherten Daten verwenden oder in diesem Fall auf eine andere Strategie zurückgreifen. Sie können sich auch einen Router vorstellen, der explizit zusätzliche Informationen (den Kontext) über die Argumente der Methode empfängt, mit deren Hilfe er entscheiden kann, ob die Funktionalität derzeit aktiviert werden soll.

Verantwortliches Personal konfiguriert die Schalter auf die ausgewählte Weise. In der angenehmsten Option gehen sie zu der Site, die die Registrierung der Switches darstellt, und klicken mit der Maus auf die ausgewählten Switches.

Im Sinne von Artefakten besteht das Schaltersystem also aus zwei Teilen. Einerseits ist dies eine Infrastruktur für einen Programmierer, um herauszufinden, ob die Funktionalität in diesem Fall funktionieren sollte, und um die Ausführung entlang des entsprechenden Codezweigs zu steuern. Andererseits ist es ein Mechanismus, mit dem ein verantwortungsbewusster Mitarbeiter auswählen kann, welche Funktionen aktiviert und welche deaktiviert werden sollen. In entarteten Fällen (wenn die Registrierung in den Code eingenäht ist, siehe unten) können beide Artefakte zusammenfallen und der Programmierer kann die Ein- und Ausschaltfunktion steuern.

Mögliche Anforderungen an das Switch-System


Wie Sie sehen können, kann das Schaltersystem ziemlich kompliziert sein. Wir listen die grundlegenden Anforderungen auf, die an ein solches System gestellt werden können.

  1. Die Abhängigkeit der Ein- und Ausschaltfunktionalität verschiedener Parameter. Beispiele für Parameter: Benutzer (Rolle, Kennung, geografischer Standort), Uhrzeit (Tageslicht oder Dunkelheit, Arbeitstage oder Wochentage, bestimmte Zeiträume), Umgebung (für Entwicklung, Test, industriellen Betrieb).
  2. Erfassung von Nutzungsstatistiken bei der Analyse von Domänenprozessen: Welcher Benutzer hat unter welchen Bedingungen Funktionen gesehen oder nicht gesehen, wie oft er die neuen Funktionen verwendet hat.
  3. Eine Prüfung, was mit den Schaltern selbst passiert: Wer drückt sie, wann, was ändert sich.
  4. Bereitstellung einer flexiblen Auswahl zwischen lokalen und Remote-Registrierungsfunktionen oder einigen Strategien für den Fall, dass die Remote-Registrierung nicht verfügbar ist.
  5. Konfigurieren des Zugriffs auf das Vermittlungssystem für verschiedene Kategorien von Mitarbeitern sowohl beim Kunden als auch beim Auftragnehmer: technische Spezialisten, Spezialisten auf dem Fachgebiet sowie Anwendungsbenutzer selbst.

Natürlich ist es nicht notwendig, alle diese Anforderungen zu erfüllen. In vielen Fällen können einige Anforderungen im Gegenteil unerwünscht sein. Je mehr Anforderungen Sie erfüllen müssen, desto offensichtlicher ist die Entwicklung Ihres eigenen Vermittlungssystems. Dies bedeutet, dass irgendwann nach der Einführung der Switches die Unterstützung Ihres eigenen Systems unrentabel wird und es Zeit ist, eine vorgefertigte Lösung zu finden.

Technologischer Baum


Wir fassen die berücksichtigten Informationen zu den Funktionsschaltern zusammen und greifen dabei auf die Metapher des Technologiebaums aus Videospielen zurück. Stellen wir uns die Switches als eine Technologie vor, mit der das Unternehmen neue Funktionen einführen kann, ohne an die Momente der Montage und Bereitstellung der Anwendung gebunden zu sein. Diese Technologie hat bekannte Kosten (die Kosten für die Aufrechterhaltung der Lebenszyklen der Switches und der Registrierung) und die Voraussetzungen für die Implementierung: eine flexible Entwicklungsmethode plus kontinuierliche Integration. Natürlich ist eine kontinuierliche Integration keine Voraussetzung, aber sie macht die Switches viel effizienter und ermöglicht die kontinuierliche Bereitstellung der Anwendung. Darüber hinaus „öffnet“ die „Forschung“ der Schalter andere Technologien - A / B-Tests und kanarische Freisetzungen. Sie werden unten diskutiert.



Wo sich die Funktionsregistrierung befinden kann


Erwägen Sie verschiedene Optionen zum Platzieren der Funktionsregistrierung, um die Komplexität der Implementierung zu erhöhen.

  1. Nähen Sie die Konfiguration direkt in den Code, kommentieren Sie beispielsweise den unnötigen Code aus und kommentieren Sie den erforderlichen Code aus oder verwenden Sie die Anweisungen zur bedingten Kompilierung. Offensichtlich macht diese Option die Einführung von Switches zunichte, da Sie damit die Anwendung neu kompilieren und bereitstellen müssen, um die neuen Funktionen zu sehen. Zwei Schwierigkeiten sollten ebenfalls beachtet werden. Erstens benötigt ein Mitarbeiter mit Funktionen zusätzliche technische Fähigkeiten: das Bearbeiten des Quellcodes und die Fähigkeit, mit dem Versionskontrollsystem (SLE) zu arbeiten. Gott weiß natürlich, welche Fähigkeiten, aber höchstwahrscheinlich müssen die Programmierer selbst Funktionen einbeziehen. Zweitens ist die Funktionalität auf allen Knoten gleich, auf denen diese Version der Anwendung veröffentlicht wurde. Um zwischen der alten und der neuen Funktionalität zu wählen, benötigen Sie einen Balancer und mehrere Knoten mit der Anwendung.
  2. Platzieren Sie die Konfiguration in der Anwendungsumgebung, z. B. in Umgebungsvariablen. Diese Option wirkt etwas extravagant, da sie mit übermäßigen Abhängigkeiten von der Laufzeit oder vom Betriebssystem behaftet ist.
  3. Verwenden Sie Konfigurationsdateien, die ein Standardspeicherort für Anwendungseinstellungen sind. Der Nachteil dieser Option besteht darin, dass Konfigurationsdateien neben jeder Instanz der Anwendung separat verwaltet werden müssen. Dieser Nachteil ist in der vorherigen Version enthalten.
  4. Pflegen Sie eine Tabelle in der Datenbank, in der die Funktionsschalter beschrieben sind. Anwendungsinstanzen klopfen an diese Datenbank, um zu prüfen, ob die für sie interessante Funktionalität funktioniert. Bei dieser Option ist die Registrierung zentralisiert (im Gegensatz zur vorherigen Version), es ist jedoch möglich, Funktionen für jeden Knoten separat einzuschließen, wenn dies von der ausgewählten Switch-Infrastruktur unterstützt wird.
  5. Erhöhen Sie den Netzwerkdienst, auf den die Anwendungsinstanzen über das ausgewählte Netzwerkprotokoll zugreifen. Wenn in der vorherigen Version gemeint war, dass die Switches höchstwahrscheinlich zusammen mit den Entitäten des Themenbereichs gespeichert werden und daher die Kosten für die Abfrage der Switches vorhersehbar sind, haben wir hier zusätzlichen Zugriff über das Netzwerk. Die Kosten für zusätzliche Bearbeitung und die Möglichkeit der Dienstverweigerung sind schwerwiegende Nachteile dieser Option, aber das Zwischenspeichern ist natürlich nicht verboten. Bei Fehlern müssen Sie das Standardverhalten angeben.

Empfehlungen


In Bezug auf die Verwendung von Schaltern können die folgenden allgemeinen Empfehlungen gegeben werden.

Der Schaltpunkt und die Logik müssen nicht zusammen sein . Im einfachsten Beispiel implementiert der Code nach der bedingten Anweisung, in der wir den Status eines bestimmten Switches abfragen, sofort die enthaltene Funktionalität. Dies ist nicht sehr praktisch, da der Logik redundante Abhängigkeiten hinzugefügt werden: Kenntnisse über die Infrastruktur von Switches und den Namen einer bestimmten Funktionalität aus der Registrierung. In der Praxis erschwert dies den Test- und Entfernungsprozess des Schalters, wenn er nicht mehr benötigt wird.

Stellen Sie den Schaltpunkt höher ein . Entwicklung des vorherigen Absatzes. Die Punkte, an denen auf die Switch-Infrastruktur zugegriffen wird, sollten von der Logik des Themenbereichs bis zur letztmöglichen Gelegenheit ausgeschlossen werden, dh sie näher an den Ort "schieben", an dem die Anforderung empfangen wurde. So reduzieren wir die Abhängigkeit einzelner Module von Switches, vereinfachen die Prozesse ihrer Unterstützung und Prüfung.

Verwenden Sie Strategien anstelle von bedingten Anweisungen . Wenn der Switch für eine lange Zeit leben wird, kann der bedingte Operator zu einer Strategie verbessert werden und die umschaltbare Logik explizit in etwas isolieren, das separat befolgt und getestet wird.

Gruppieren Sie keine Schalter . Sie sollten keine Abhängigkeiten zwischen den Switches bilden, sie gruppieren und in Hierarchien zusammenstellen. Dies erleichtert die Verwaltung von Code mit neuen Funktionen und dem Lebenszyklus der Switches.

Konsolidieren Sie Schaltpunkte für eine Funktionalität . Es kann sich herausstellen, dass das Verhalten mehrerer Programmblöcke gleichzeitig von demselben Schalter abhängt. Wenn die Entwicklung schlecht koordiniert ist, können Schaltpunkte an verschiedenen Stellen dupliziert werden, was zu teureren Tests und Support führt. Wenn Sie diszipliniert versuchen, die Schaltpunkte zum Eingang der Anwendung zu „schieben“, wird diese Empfehlung - keine Punkte im gesamten System verteilen - normalerweise automatisch ausgeführt.

Die Hauptkategorien von Schaltern


Beachten Sie die in diesem Artikel angegebene Schalterklassifizierung. Es basiert darauf, wie lange der Schalter „lebt“ und wie oft sich sein Zustand ändert. Durch die Zuordnung eines Switches zu einer bestimmten Klasse können Sie bestimmen, wie der Switch im Code verwendet und wie der Status des Switches gespeichert wird.

Schalter loslassen

Dies ist die Hauptansicht der Schalter. Sie ermöglichen es Ihnen, die Entwicklung auf eine Hauptniederlassung zu konzentrieren, die darüber hinaus regelmäßig in den kommerziellen Betrieb übergeht. Anstatt in einem separaten Zweig zu entwickeln und in den Hauptzweig einzufügen, um die gewünschte Version freizugeben, führen wir einen Schaltpunkt in den Code ein, der die Funktionalität verbirgt, die noch nicht für Benutzer bereit ist. Wenn Sie fertig sind, starten die Switches neue Funktionen.

Solche Switches leben mehrere Tage oder Wochen - während die Entwicklung und Implementierung neuer Funktionen fortgesetzt wird. Wenn die Funktionalität getestet und als geeignet erachtet wurde, können der Schalter und der Schaltpunkt im Code entfernt werden. Der Status des Switches ändert sich normalerweise entweder, wenn eine neue Version veröffentlicht wird oder wenn sich die Anwendungskonfiguration ändert. Es ist zulässig, einen solchen Schalter in der Konfigurationsdatei zu speichern. Es besteht eine hohe Wahrscheinlichkeit, dass der Schaltpunkt für die neue Funktionalität der einzige ist. Es ist sinnvoll, sich nicht in eine konventionelle bedingte Aussage zu vertiefen.

Experimentschalter

Um neue Funktionen auszuführen, werden Switches verwendet, die mehrere Tage bis mehrere Monate dauern. Während des Experiments können Sie überwachen, wie Benutzer die Änderungen wahrnehmen und wie sich ihr Verhalten ändert. Es ist wünschenswert, dass sich der Zustand des Schalters bei jeder Anforderung sehr dynamisch ändern kann. Einige zentralisierte Speicher, wie z. B. eine Datenbank oder ein Netzwerkdienst, sind hier eher geeignet. Wenn das Experiment in eine vorhersehbare Anzahl von Problemen passt, kann der Schaltpunkt auch in Form einer bedingten Anweisung ausgegeben werden.

Technische Switches

Technische Switches helfen bei der Verwaltung der Infrastrukturteile einer Anwendung, die sich auf die Gesamtleistung auswirken. Sie können nützlich sein, wenn wir ein Update herausbringen, dessen Auswirkungen auf die Leistung schwer zu bewerten sind. In diesem Fall wäre es schön, einen „Schalter“ zu haben, der neue Funktionen sofort deaktiviert, wenn sich herausstellt, dass seine Verwendung katastrophale Folgen hat.

Höchstwahrscheinlich sind solche Switches mehrere Wochen oder länger aktiv und ändern ihren Status, wenn sich die Anwendungskonfiguration oder häufiger ändert. Die Kritikalität der von diesen Switches implementierten Funktion legt nahe, dass sie einen Netzwerkdienst oder zumindest eine Datenbank verwenden müssen. Sie müssen sicherstellen, dass im Code die Schaltpunkte für dieselbe Funktionalität nicht an verschiedenen Stellen verteilt sind.

Switches für die Zugriffskontrolle

Eine weitere offensichtliche Möglichkeit, Switches zu verwenden, besteht darin, nur einigen Benutzern Zugriff auf neue Funktionen zu gewähren. Dies kann sowohl für die kanarische Version (wenn neue Funktionen nach und nach immer mehr Benutzer abdecken) als auch für die Erstellung privater Bereiche erforderlich sein, auf die nur privilegierte Benutzer Zugriff haben.

Es scheint, dass solche Switches ziemlich lange leben (möglicherweise so lange wie die Anwendung selbst) und den Status bei jeder neuen Anforderung ändern können. Hier eignet sich auch ein Netzwerkdienst zum Speichern von Switches. Es wird empfohlen, einen zentralen Mechanismus zu verwenden, um zwischen alten und neuen Funktionen zu wählen und keine bedingten Anweisungen im gesamten Code zu verteilen.

,


Die Einführung von Funktionsschaltern hat nicht nur offensichtliche Vorteile, für die normalerweise alles gestartet wird (zeitliche Vielfalt beim Veröffentlichen der Anwendung und Einschalten neuer Funktionen, Reduzieren der Anzahl von Zweigen in Hartwährung), sondern kann auch einige Nebenprozesse vereinfachen. Wir listen sie auf und betrachten sie dann genauer.

A / B-Tests. Vergleich des Verhaltens von Benutzern, die die neue und die alte Version verwenden.

Kanarische Probleme. Allmähliche Erhöhung der Anzahl der Benutzer mit Zugriff auf neue Funktionen.

Blaugrüne Veröffentlichungen. Senden Sie Anforderungen mit dem Balancer entweder an den Server mit der alten Version oder an den Server mit der neuen Version.

Geplante extreme Funktionalität.Die Einbeziehung von Funktionen für einen kurzen Zeitraum, beispielsweise während der Promotion.

Gleichzeitige Einbeziehung von Funktionen an mehreren Stellen. Die gleichzeitige Einbeziehung von Funktionen sowohl auf der Website als auch in die mobile Anwendung. Oder die gleichzeitige Einbeziehung von Funktionen in verschiedene Module derselben Anwendung.

Wichtige Änderungen an der Infrastruktur. Zum Beispiel der Übergang zu einer anderen Art der Datenspeicherung.

Testen neuer Dinge durch Benutzer. Bieten Sie Benutzern die Möglichkeit, die neuen Funktionen ein- und auszuschalten und die Anwendung für sich selbst anzupassen.

A / B-Tests

Lassen Sie uns einen kurzen Blick auf die A / B-Tests werfen. Bei der Vorbereitung von A / B-Tests werden einige messbare Eigenschaften des Informationssystems oder des Benutzerverhaltens formuliert. Beispiele für diese Eigenschaft: 1) die Dauer eines bestimmten Prozesses im Themenbereich, 2) die relative Anzahl der Benutzer, die eine bestimmte Seite erreicht haben, 3) die Anzahl der von der Anwendung verwendeten Ressourcen. Außerdem wird angenommen, wie sich der Wert dieser Eigenschaft ändert, wenn neue Funktionen enthalten sind. Erhalten Benutzer eine schnellere Antwort? Werden sie mehr kaufen? Wird die App weniger essen?

Während des A / B-Tests wird dann für eine Gruppe die neue Funktionalität aktiviert und für die andere bleibt sie ausgeschaltet. Die während der Vorbereitung getroffenen Annahmen werden überprüft und anhand der Ergebnisse wird der Schluss gezogen, ob die neue Funktionalität etwas Gutes bringt und nicht zu etwas Schlechtem führt. Manchmal werden Benutzer in drei Gruppen eingeteilt, in zwei davon bleibt die Funktionalität alt. Wenn die Ergebnisse der beiden Kontrollgruppen sehr unterschiedlich sind, enthält der gesamte Test eine Art Fehler, sodass Schlussfolgerungen, die auf diesem Test basieren, unzuverlässig sind.

Funktionsschalter erleichtern die Aufteilung und Verwaltung von Benutzern in Gruppen. Für jede Gruppe können Sie neue Funktionen aktivieren und deaktivieren, ohne auf die nächste Version der Anwendung warten zu müssen. Dies reduziert die Zeit, die erforderlich ist, um Annahmen zu überprüfen und den gesamten A / B-Testzyklus abzuschließen. Viele Unternehmen versuchen, mehrere Annahmen pro Woche zu überprüfen.

Lesen Sie mehr über diese Methode finden Sie in diesem Beitrag , hier und hier auf der „Habré“ und genauer ist sehenswert den Bericht «Feature Toggle, oder wie ausrollen die Eigenschaften ohne Freigabe“ , die mit einer Schaltfunktion einige interessante Feinheiten der A / B-Test zeigt.

Kanarische und blaugrüne Themen

Was hat der Kanarienvogel damit zu tun? Kanarienvögel wurden im Bergbau eingesetzt: Bergleute nahmen Kanarienvögel in einem Käfig mit, als sie in eine Mine hinabstiegen, in der eine hohe Konzentration explosiver Gase vermutet wurde. Kanarienvögel lieben saubere Luft sehr und fühlen sich viel früher als Menschen schädliche und gefährliche Verunreinigungen darin fühlen. Wenn der Kanarienvogel aufhört zu singen, sich ausschaltet oder stirbt, müssen die Menschen dringend evakuieren, bis er explodiert. Hier hier können Sie mehr über diese (auf Englisch) lesen.

Von hier, so wie ich es verstehe, kam der Ausdruck "Zeugnis des Kanarienvogels". Wenn Sie in einem Staat leben, der eine repressive Innenpolitik verfolgt (dh in einem beliebigen Staat), werden Sie möglicherweise eines Tages angewiesen, nicht nur die persönlichen Daten Ihrer Benutzer an autorisierte Abteilungen zu übertragen, sondern auch niemandem davon zu erzählen Sie wurden übergeben, nicht dass Sie einen solchen Auftrag erhalten hätten. Natürlich können Sie nicht raus, aber in einigen Fällen können Sie Ihren Benutzern regelmäßig Nachrichten dieser Art senden: "Im letzten Monat haben wir keinen Befehl zur Offenlegung Ihrer persönlichen Daten erhalten." So zwitschern Sie, zwitschern wie ein Kanarienvogel, und wenn Sie den Auftrag erhalten, persönliche Daten bereitzustellen, halten Sie den Mund. Auf diese Weise erfüllen Sie die Anforderungen der Behörden und geben Ihren Benutzern Grund zur Vorsicht.

Und es gibt kanarische Probleme. Hier funktioniert die Metapher folgendermaßen: Wenn ein kleiner Teil der Benutzer krank wird, „evakuieren“ wir dringend - wir deaktivieren eine neue Funktion, die dazu führte, dass Benutzer krank wurden, und ließen sie nicht alle Benutzer erreichen (lassen Sie sie nicht „ruckeln“). Dazu müssen Sie in der Lage sein, die neue Funktionalität auf verschiedene Gruppen zu erweitern. Hier kann man auf Schalter verzichten. Zum Beispiel haben wir einen Balancer und zwei Knoten, auf denen Anforderungen umgeleitet werden. Auf einem Knoten haben wir eine stabile Version bereitgestellt, auf dem zweiten eine experimentelle Version mit neuen Funktionen. Standardmäßig werden alle Anforderungen mit der stabilen Version an den Knoten gesendet, und mit Hilfe des Balancers werden einige Anforderungen mit der experimentellen Version an den Knoten gesendet.

Mit dem Switch können Sie jedoch mehr Flexibilität bei der Erweiterung der neuen Funktionen auf Benutzer erzielen. Im Switch können Sie verschiedene Parameter der empfangenen Anfragen kombinieren und verantwortungsbewussten Mitarbeitern eine praktische grafische Oberfläche für die Verwaltung des Kanarienproblems zur Verfügung stellen. Im Allgemeinen bleibt der Prozess derselbe: Wir bieten neue Funktionen für eine kleine Gruppe von Benutzern, z. B. für 1%. Danach überwachen wir den Status der Anwendung, das Verhalten von Benutzern, die mit der neuen Funktionalität arbeiten, und erstellen eine Prognose darüber, was passieren wird, wenn wir sie auf eine größere Anzahl von Benutzern ausweiten. Indem wir immer mehr Benutzer mit neuen Funktionen einbeziehen, können wir unsere Hypothesen testen und anpassen. Wenn wir negative Trends bemerken,dann kann die neue Funktionalität einfach deaktiviert werden.

Während der blaugrünen Version werden zwei Server verwendet, die vorläufig als blau und grün bezeichnet werden. Wir gehen davon aus, dass der Balancer vor der Veröffentlichung alle Anforderungen an den grünen Server sendet. Während der Version wird eine neue Version der Anwendung auf einem blauen Server bereitgestellt, auf dem der Balancer auch Anforderungen sendet. Wenn sich herausstellt, dass die neue Version der Anwendung Fehler enthält, wechseln wir zurück zum grünen Server.

Die Basisversion der blau-grünen Version schlägt vor, dass Benutzer entweder mit allen neuen Funktionen arbeiten, die in der neuen Version enthalten sind, oder mit keiner. Durch die Verwendung von Switches wird es während der Freigabe möglich, Anforderungen mit der neuen Version an den blauen Server zu senden, für die die Switches aller neuen Funktionen deaktiviert sind. Danach können Sie die neue Funktionalität schrittweise in Teile integrieren.

Sie können sehen, dass Sie mit den Funktionsschaltern die Vorteile von kanarischen und blaugrünen Versionen kombinieren können. Normalerweise gibt es während einer blaugrünen Version zwei klar getrennte Knoten mit der alten und der neuen Version der Anwendung, und mit Hilfe des Balancers leiten wir alle Anforderungen gleichzeitig an einen oder den anderen Knoten um. Und mit den Schaltern können wir Anforderungen mit der neuen Version an den Knoten umleiten, aber mit deaktivierter neuer Funktionalität, und sie dann schrittweise einschalten, wie während der kanarischen Version.

Ein wenig mehr über die kanarischen releases - in dem entsprechenden Hinweis auf der Website Fowler oder „Habré“, zum Beispiel hier . Über blaugrüne Veröffentlichungen - in einem Übersichtsartikel. Die Verwendung von Funktionsschaltern in blaugrünen Releases finden Sie hier .

Ändern der Art und Weise, wie Daten gespeichert werden.

Beim Studium von Programmiertechniken wie Abstraktion und Entwicklung von Schnittstellen stieß ich lange Zeit häufig auf die folgende Empfehlung: Versuchen Sie zu verhindern, dass Ihr Programm an eine bestimmte Methode der Datenspeicherung gebunden wird, z. B. an eine bestimmte Datenbank, weil in Zukunft Möglicherweise müssen Sie die Speichermethode ändern. Ich wickelte es auf meinen Schnurrbart und tat, was befohlen wurde. Seitdem haben sich jedoch die Gründe, warum ich die Domänenlogik und die Speichermethode teile, geändert, und im Gegenteil, ich war skeptisch gegenüber der Möglichkeit, die Datenbank in einem kommerziellen Produkt zu ändern.

Und während ich dieses Material vorbereitete, lernte ich die Leute kennen, die versicherndass viele Unternehmen das Ändern von Datenbanken in industriell betriebenen Produkten praktizieren. Darüber hinaus ist das Ändern der Datenbank angeblich völlig schmerzlos, wenn Sie die Funktionsschalter verwenden. Es ist klar, dass der erwähnte Artikel von Interessenten verfasst wurde (die Website wird vom Hersteller eines kommerziellen Tools zur Verwaltung von Switches unterstützt), aber es schadet nicht, die Strategie des Wechsels zu einer anderen von ihnen vorgeschlagenen Datenbank in Betracht zu ziehen.

Beschreiben Sie die Strategie kurz wie folgt. Der Prozess beginnt ab dem Moment, in dem unsere Anwendung mit einer (alten) Datenbank arbeitet. Mit den Funktionsschaltern zwingen wir unsere Anwendung nacheinander, zuerst Daten in eine neue Datenbank zu schreiben und dann Daten aus der neuen Datenbank zu lesen. Gleichzeitig bleibt die Interaktion mit der alten Datenbank erhalten: Wir schreiben und lesen beide aus beiden Datenbanken!

Wenn die Aufzeichnung mehr oder weniger klar ist, sollte das Lesen geklärt werden. Wenn eine Anwendung Daten benötigt, liest sie diese aus beiden Datenbanken. Diese beiden Lesepunkte liegen immer nebeneinander, sodass Sie nach dem Lesen die empfangenen Daten vergleichen und ihre Konsistenz überprüfen können. Nach der Stabilisierung der Anwendung (wenn beide Datenbanken beginnen, dieselben Daten stabil zurückzugeben) wird die Anwendung von der alten Datenbank getrennt und die Schalter werden gelöscht.

Eine detaillierte Beschreibung der Strategie für den Wechsel in eine neue Datenbank am Beispiel von MongoDB und DynamoDB.
MongoDB DynamoDB. DynamoDB: ( ) MongoDB. — , , , — . (DynamoDB).

, MongoDB, — DynamoDB. , DynamoDB ( MongoDB). , DynamoDB .



DynamoDB , MongoDB. - MongoDB. , . , («» «»), . - DynamoDB . , , . — .

MongoDB, DynamoDB. , , , , , , . - , , MongoDB, , . , , , . , .

, . , , DynamoDB. MongoDB, .

. , , , DynamoDB , MongoDB , DynamoDB 100 %. , .

Gleichzeitige Einbeziehung von Funktionen auf verschiedenen Plattformen

In dem bereits erwähnten Bericht „Funktionsumschaltungen oder Einführung von Funktionen ohne Freigabe“ haben wir über die Anforderung gesprochen, neue Funktionen gleichzeitig (Minute pro Minute!) Sowohl auf der Website als auch in der mobilen Anwendung zu aktivieren. Und dann müssen Sie es möglicherweise auch auf die gleiche Weise ausschalten.

Die Erfüllung einer solchen Anforderung ist nicht einfach, da es sehr schwierig ist, neue Versionen für verschiedene Plattformen bereitzustellen. Wenn die Server mit der Site unter Ihrer Kontrolle stehen, können Sie immer noch etwas erraten (und hoffen, dass die Bereitstellung diesmal wie eine Uhr funktioniert), und der Store für mobile Anwendungen kann die Richtlinie zum Aktualisieren von Updates nach Belieben ändern. In jedem Fall ist das Aktualisieren der Anwendung ein langer Prozess, der das Überprüfen der veröffentlichten Anwendung durch den Store selbst umfasst. Darüber hinaus sollten Sie nicht hoffen, dass die mobile Anwendung selbst regelmäßig Updates von ihrer API anfordert und diese "in" sich selbst installiert. Dieser Shop steht meines Wissens auch unter der sorgfältigen Aufsicht des Plattformbesitzers - es wird sicherlich Probleme mit der Ausführung von beliebigem Code geben.

Die Schalter tragen jedoch dazu bei, die Anforderung der gleichzeitigen Einbeziehung von Funktionen in Bedingungen zu erfüllen, in denen Sie die Bereitstellung der Anwendung nicht vollständig steuern können. Natürlich sollte die Lieferung bis zur erwarteten Aufnahme garantiert sein. Diese Methode wird sich wahrscheinlich in Zeiten vorübergehender Werbeaktionen wie dem Black Friday als nützlich erweisen.

Eine ähnliche Situation besteht bei mehreren Modulen eines Systems. Wenn sie separat veröffentlicht werden und gleichzeitig an der Unterstützung eines Prozesses des Themenbereichs beteiligt sind, können Sie mit den Schaltern auf der Seite verschiedener Module koordinierte Änderungen an diesem Prozess vornehmen.

Wechseln Sie die Tools in .NET


Werkzeuge zum Arbeiten mit Schaltern können in drei Gruppen unterteilt werden. Erstens handelt es sich hierbei um universelle Heavy-Produkte (Mähdrescher), zu denen normalerweise ein Netzwerkdienst gehört, der mit einem Anbieter zusammenarbeitet, sowie eine Reihe von Bibliotheken, mit denen Sie mit diesem Dienst für verschiedene Programmiersprachen kommunizieren können. Fast immer muss man für die Verwendung solcher Produkte bezahlen (und viel). Zweitens handelt es sich um Projekte, bei denen es sich um Netzwerkdienste handelt, die auf ihren Computern ausgeführt werden müssen und auf die Clients über die REST-API zugreifen können. Von den Projekten in dieser Gruppe (der Kürze halber werden wir sie Server nennen) wurden nur diejenigen in die Übersicht aufgenommen, die über eine gut dokumentierte API oder einen offiziellen Client für .NET verfügen. Drittens sind dies einfache (im Vergleich zu den beiden vorherigen Gruppen) Bibliotheken für .NET.Sie schlagen vor, die Funktionsregistrierung in Konfigurationsdateien zu speichern oder über das Netzwerk auf eine Remote-Registrierung zuzugreifen, die nicht Teil dieser Projekte ist.

Ein aufmerksamer Leser wird feststellen, dass es eine andere Gruppe von Softwaretools gibt, die nicht in die Überprüfung einbezogen wurden. Dies sind Produkte, die als Konfigurations-Repository für ein verteiltes System verwendet werden können. Bekannte Vertreter solcher Produkte sind Apache ZooKeeper , Consul und etcd . In den Kommentaren zu diesem Artikel wird auch Spring Cloud Config Server erwähnt, der leicht mit .NET befreundet werden kann. In ihren grundlegenden Funktionen sind Switches Konfigurations-Repositorys sehr ähnlich, sodass diese Tools als Ausgangspunkt für die Erstellung Ihrer eigenen Switch-Infrastruktur verwendet werden können. Aufgrund der Tatsache, dass der Zweck der Funktionsschalter bestimmte Besonderheiten aufweist, werden mit der Entwicklung der Kultur der Schalter innerhalb des Projekts die Nachteile universeller Konfigurations-Repositorys zu spüren sein. Aus diesem Grund werden ähnliche Produkte nicht weiter diskutiert.

Erntemaschinen


LaunchDarkly

Es scheint, dass dies das am meisten gehypte und "wütende" Produkt im Bereich der Funktionsschalter ist. Man hat das Gefühl, dass in dieses Produkt fast alles passt, was einem nur in den Sinn kommt, wenn es um Schalter geht. Dies gilt für die Funktionen der Plattform selbst, die Vielzahl der verfügbaren Clients und die Arten der Integration in verschiedene Tools wie Jira und Visual Studio Code. Alles ist sehr detailliert und mit Beispielen dokumentiert. Das Tool ist natürlich kostenpflichtig, kann aber während der 30-tägigen Testphase kostenlos verwendet werden.

Catamorphic Co., der Hersteller dieses Produkts, sponsert auch eine spezielle Referenzseite für Feature-Switches .

Microsoft.FeatureManagement

Microsoft-Entwicklung für .NET Core, die auf zwei Arten verwendet werden kann: Erstens als Client-Bibliothek, mit der Sie mit Switches arbeiten und deren Status in einer Konfigurationsdatei speichern können, und zweitens als Mähdrescher, der zusätzlich zu dieser Bibliothek einen zentralen Speicherort enthält zum Verwalten von Switches in Azure. Das Tool scheint auf der allgemeineren Azure App-Konfigurationsinfrastruktur zu basieren, für die es eine dokumentierte API gibt .

Die Client-Bibliothek bietet interessante Möglichkeiten für die Integration in ASP.NET Core, z. B. zusätzliche Filter für die Aktionen von Controllern und die bedingte Visualisierung einer Ansicht, abhängig vom Status der Switches.

In den Kommentaren zu diesem Artikel wird empfohlen, sich mit der nützlichen Reihe von Notizen vertraut zu machen .Microsoft.FeatureManagement

Rollout

Die Website sieht gut aus, aber wenn Sie versuchen, bestimmte Informationen abzurufen, treten Probleme auf. Beispielsweise wird angegeben, dass das Produkt viele interessante Funktionen zum Überwachen von Schaltern, Überwachen der Verwendung von Funktionen und Durchführen von Experimenten aufweist. Gleichzeitig legen die Hersteller jedoch keine Preisrichtlinien offen (es ist nur klar, dass es eine 14-tägige kostenlose Testversion gibt) und führen eine recht grobe Dokumentation ihrer REST-API. Die Dokumentation für Client-Bibliotheken ist jedoch in Ordnung. Das System unterstützt das Speichern von Switches in Konfigurationsdateien.

Optimizely

Im Allgemeinen ist Optimizely eine coole Plattform zum Sammeln von Analysen und Durchführen von Experimenten. Das System verfügt über einen kostenlosen Rollout- Teil .Bereitstellung grundlegender Switch-Funktionen. Es steht geschrieben, dass dieser kostenlose Teil neben der Unterstützung des Targeting ("Rollout" der Funktionalität für bestimmte Benutzergruppen) eine unendliche Anzahl von Switches und Projekten unterstützt. Darüber hinaus können beliebig viele Mitarbeiter dieses System nutzen. Es ist erwähnenswert, dass die Kosten vieler anderer Produkte genau durch diese quantitativen Merkmale bestimmt werden. Wie viel es kostet, auf eine voll funktionsfähige Plattform umzusteigen, ist ein Geheimnis.

Hochgeschwindigkeitszug

Diese Plattform sieht ziemlich einfach aus. Es gibt keine speziellen Funktionen wie die Analytics-Sammlung - nur die Hauptfunktionen der Switches. Wenn Sie die Plattform auf Ihren eigenen Servern platzieren, können Sie sie kostenlos verwenden.

Teilen

Eine andere Plattform, die hinter ihren Preisen zurückbleibt. Von den zusätzlichen "Chips" bietet Integration mit einigen anderen Entwicklungswerkzeugen und Unterstützung für die Durchführung von Experimenten (A / B-Tests).

ConfigCat

Und hier ist ein Produkt mit einer lustigen Seite, auf der es Katzen gibt. Es sieht provokativ aus. Es ist jedoch verdächtig, dass die Dokumentation für die REST-API nicht darauf veröffentlicht ist. Mit dem Client unter .NET ist alles in Ordnung. Übrigens gibt es einen kostenlosen Plan.

Moggles

Ein Open Source-Projekt, das einen Server mit einer Site zum Verwalten von Switches und einen Client enthält. Zum Starten des Servers ist SQL Server erforderlich. Sieht ziemlich ausgereift aus.

Server


Entfesseln

Ein ziemlich ausgereiftes Open-Source-Projekt, bei dem ein System auf Unternehmensservern gehostet wird. Enthält eine einfache Switch-Management-Site. Es gibt integrierte einfache Tools, um die Verwendung von Funktionen zu berücksichtigen. Die Installation ist recht einfach; PostgreSQL erforderlich.

Es gibt keine offizielle .NET-Clientbibliothek, aber es wurden bereits mehrere von Drittanbietern erstellt. Darüber hinaus können Sie dank der dokumentierten API theoretisch Ihre eigene Bibliothek erstellen.

Gitlab-Feature-Flags

GitLab hat sein Switch-System auf Unleash aufgebaut, sodass für die Interaktion mit GitLab dieselben Client-Bibliotheken verwendet werden wie für Unleash. Es unterscheidet sich von Unleash selbst darin, dass Sie bei der Installation weniger Zeit benötigen (mit Ausnahme der Installation von GitLab selbst), aber Sie müssen bezahlen: Funktionsschalter sind ab GitLab Premium-Plänen (wenn GitLab auf Ihren eigenen Servern ausgeführt wird) und GitLab Silver (wenn GitLab ausgeführt wird) verfügbar läuft auf den Servern des Providers).

Feature Flags API in Go

Dieses Open Source-Projekt ist ein Dienst mit einer API (ein wenig dokumentiert), über die Sie Switches verwalten können. Anscheinend gibt es keine grafische Oberfläche. Geschrieben in Go; verwendet integrierte Datenbanken und einen Netzwerkserver, daher ist die Einstellung nach den Anweisungen trivial. Bietet rudimentäre Targeting-Funktionen. Zuletzt bearbeitet im Repository: 20. Februar 2019.

Bandiera

Auch ein offenes Projekt. Service mit API und GUI. Geschrieben in Ruby; erfordert MySQL oder PostgreSQL, um zu funktionieren, oder kann von Docker installiert werden. Es gibt Clients für Ruby, Node, Scala, PHP, jedoch nicht für .NET. Unterstützt einen ziemlich vielfältigen Satz von Schaltertypen.

Flagr

Ein weiteres Open Source Projekt auf Go. Von Docker installiert. Es gibt eine grafische Oberfläche sowie Clients für Ruby, Go, JavaScript, Python. Es bietet integrierte einfache Tools zur Berücksichtigung der Verwendung von Funktionen und Experimenten. Jeder Switch kann flexibel konfiguriert und mit einer eigenen Konfiguration ausgestattet werden.

Client-Bibliotheken


Es gibt eine große Anzahl von Bibliotheken für .NET, die die Grundfunktionen von Switches bereitstellen. Aber die meisten von ihnen sind in einem verlassenen Zustand. Eine kurze Überprüfung ergab, dass 2019 nur zwei Projekte Änderungen in den Repositories hatten. Über die Links in den Kommentaren zu diesem Artikel habe ich zwei weitere interessante Projekte gefunden. Alle von ihnen sind unten dargestellt.

Esquio

Das interessanteste, am besten dokumentierte und funktionalste Projekt seiner Gruppe. Die integrierte Speicher-Engine ist entweder eine Konfigurationsdatei oder ein EF Core. Es lässt sich ein wenig in ASP.NET Core integrieren (wie Microsoft.FeatureManagement). In der Dokumentation heißt es, dass die Verwendung von Azure die Switch-Konfiguration vereinfachen kann.

Funktionsschalter

Es kann den Status des Switches sowohl aus der Konfigurationsdatei als auch remote anfordern (es wird mithilfe von Raumklassen konfiguriert FeatureSwitch.Strategies). Das Kit enthält ein einfaches Website-Framework, mit dem Sie Switches verwalten können. Es ist unklar, ob ein komplexerer Wechsel als ein / aus möglich ist.

Toggle.Net

Die einfachste Bibliothek zum Arbeiten mit Schaltern, die in einer Textdatei gespeichert wird. Anscheinend werden nur Ein / Aus-Schalter unterstützt.

RimDev.FeatureFlags-Clientbibliothek

für ASP.NET Core. Zusätzlich zur Verwendung von Funktionsschaltern wird zusammen mit dem Hauptprojektstandort eine zusätzliche Seite angezeigt, auf der die Schalter gesteuert werden können. Die integrierte Konfigurationsspeicher-Engine ist SQL Server.

( ) .


«» .

. , , .

. , , , .

. , A/B-.

. .

. .

Fazit


Es scheint, dass es in vielen Unternehmen bereits üblich ist, Schalter zu verwenden, um die Momente der Veröffentlichung der Version und der Aufnahme neuer Funktionen zu überbrücken. Darüber hinaus tragen Schalter dazu bei, den Wahnsinn beim Zusammenführen von Zweigen in einem Versionskontrollsystem zu verringern. Darüber hinaus eröffnen sie den Weg zu beliebten Techniken wie Kanarienproblemen und A / B-Tests.

Für die Arbeit mit Switches wurde so viel kostenpflichtige und kostenlose Software erstellt, dass jedes Unternehmen das Tool nach seinen Wünschen auswählen kann.

Infolgedessen werde ich die Merkmale der Funktionsschalter auflisten und sie freiwillig (wie üblich) in Vor- und Nachteile aufteilen.

Die Vorteile


  1. , — , , .
  2. , . , .
  3. , . , , , , .
  4. , . . , «» .
  5. , . , . , .

Nachteile


  1. . , . : , . , , .
  2. . , , . : , , , , . : ( ), .
  3. . ? , ? . , , . ? ? : , .
  4. — , . , . : (); ( ); .
  5. — , . : (); «/».
  6. , . : ; (, ).
  7. . , ? : , , , ( ).

Referenzen


( )
( Medium)
( HighLoad++)
- ( )


- («»)
(«»)
(«»)
- ( Featureflags.io)
( Featureflags.io)
Microsoft ( )


( )
( Smithsonian)
(«»)

15.08.2019
15.08.2019 alex1t
17.08.2019 pashuk

Source: https://habr.com/ru/post/de463471/


All Articles