Feature Toggles

Feature Toggles

Feature Toggles
Varianten
Pros and Cons
Best Practices
German

60134178a94193fb4b8a28cdb4771440?s=128

elitau

July 19, 2017
Tweet

Transcript

  1. Feature Toggles Eduard Litau, studitemps.tech Wir suchen Entwickler ;‑)

  2. Inhalt Wofür eignen sich Feature Toggles Varianten Toggles im Code

    Konfiguration Vor‑ und Nachteile Best Practices
  3. Wofür? Ein‑/Ausschalten von Code Vereinfacht trunk‑based Development und damit Continuous

    Integration/Delivery Unfertige Features können jederzeit integriert und getestet werden
  4. Varianten Release Toggles Experiment Toggles Ops Toggles Permissioning Toggles

  5. Release Toggles Integration von Code unabhängig vom Release Toggles sollten

    bald nach dem Release entfernt werden Toggle Änderung per Deploy ausreichend
  6. Experiment Toggles Vereinfacht datengetriebene Entwicklung, z. B. mittels A/B Tests

    Toggle Änderung per Deploy ausreichend Toggle verbleibt für längere Zeit im Code
  7. Ops Toggles Kann genutzt werden, um z. B. unwichtige Teile

    einer Applikation bei großer Last auszuschalten Agieren wie manuelle Circuit Breaker Toggle Änderung per Request notwendig, um schnell reagieren zu können (ohne Deploy) Toggle verbleibt für sehr lange Zeit im Code
  8. Permissioning Toggles Beispiele: Ausrollen von Features für Alpha und Beta

    Nutzer Begrenzung von Features für Nutzergruppen, z. B. Premium und Free Nutzer Toggle Wert Änderung per Request/User notwendig
  9. Management von Toggles Unterschiedliche Varianten von Toggles sollten auch an

    unterschiedlichen Orten vorgehalten werden Mögliche Dimesionen sind Statische vs. dynamische Toggles Kurzlebige vs. langlebige Toggles
  10. None
  11. Wie werden Toggles im Code realisiert?

  12. Toggle an der Außenkante: Einstieg in neue/geänderte Funktion in UI

    umschalten An dieser Stelle sind die meisten Informationen verfügbar: z. B. Nutzer, Request Gut für "per Request" Toggles Restlicher Code ist größtenteils befreit von Feature Toggle Logik Funktionen sind evtl. öffentlich verfügbar, jedoch muss dafür die genaue URL erraten werden < % = i f F e a t u r e S y s t e m [ : r e c o m m e n d a t i o n s ] . e n a b l e d ? % > < % = r e n d e r ' r e c o m m e n d a t i o n s _ s e c t i o n ' % > < % e n d % >
  13. Toggle tief im Code Eher technischer Natur, z. B. Wechsel

    interner Logik via Branch by Abstraction i f F e a t u r e S y s t e m [ : f a s t e r _ s e a r c h ] . e n a b l e d ? N e w S e a r c h . n e w ( o p t i o n s ) e l s e S e a r c h . n e w ( o p t i o n s ) e n d
  14. Ruby Gems

  15. flipper: feature flipping for ANYTHING Gates: Boolean, Groups, Actors, %

    of Actors, and % of Time Adapters: Mongo, Redis, Cassandra, Active Record... Instrumentation: ActiveSupport::Notifications, Statsd and Metriks Optimization: Memoization middleware and Cache adapters Web‑Interface: Point and click... API: HTTP API interface
  16. flipper Beispiel r e q u i r e '

    f l i p p e r ' # p i c k a n a d a p t e r r e q u i r e ' f l i p p e r / a d a p t e r s / m e m o r y ' a d a p t e r = F l i p p e r : : A d a p t e r s : : M e m o r y . n e w # g e t a h a n d y d s l i n s t a n c e f l i p p e r = F l i p p e r . n e w ( a d a p t e r ) # c h e c k i f t h a t f e a t u r e i s e n a b l e d i f f l i p p e r [ : s e a r c h ] . e n a b l e d ? p u t s ' S e a r c h a w a y ! ' e l s e p u t s ' N o s e a r c h f o r y o u ! ' e n d
  17. rollout: Fast feature flags based on Redis. Groups Specific Users

    User Percentages Frontend / UI
  18. rollout Beispiel # F e a t u r e

    F l i p p e r i s a n A c t i v e R e c o r d a d a p t e r c l a s s F e a t u r e S y s t e m = R o l l o u t . n e w ( F e a t u r e F l i p p e r ) F e a t u r e S y s t e m . d e f i n e _ g r o u p ( : s t a f f ) d o | u s e r | ! R a i l s . e n v . p r o d u c t i o n ? | | u s e r & & u s e r . e m a i l . t o _ s . e n d _ w i t h ? ( ' @ s t u d i t e m p s . d e ' ) e n d D E V _ A C C O U N T _ I D S = [ 4 2 , 2 3 ] . f r e e z e F e a t u r e S y s t e m . d e f i n e _ g r o u p ( : d e v s ) d o | u s e r | ! R a i l s . e n v . p r o d u c t i o n ? | | u s e r & & u s e r . i d . i n ? ( D E V _ A C C O U N T _ I D S ) e n d F e a t u r e S y s t e m . a c t i v a t e _ g r o u p ( : r e c o m m e n d a t i o n s , : s t a f f ) F e a t u r e S y s t e m . a c t i v a t e _ g r o u p ( : f a s t e r _ s e a r c h , : d e v s )
  19. Toggle Konfiguration Statische, kurzlebige Toggles sind vorzuziehen Code ist verständlicher

    Führen in allen Umgebungen zu gleichen Auswirkungen Persistierung Konfigurationsdatei, z. B. YAML Datenbank Eigener (Micro‑)Service Cookie Aktuelle Toggle‑Werte sollten einfach einsehbar sein, z. B. im HTML Quellcode oder HTTP Header
  20. Vorteile Ermöglicht CI und CD Kein Merging von langlebigen Branches

    Schrittweiser Release von Features, z. B. zuerst an Beta Tester oder eine kleine Nutzergruppe (Canary Releases) Code‑Reviews: durch kontinuierliche Integration können die Code‑Chunks kleiner sein Testen von abhängigen Features durch Einschalten der jeweiligen Toggles Einfache Integration von globalen Änderungen, wie z. B. neues CSS für unterschiedliche Features
  21. Nachteile Komplexität wird gesteigert: Jeder Toggle ist technische Schuld, die

    beglichen werden muss Weitere globale Abhängigkeit im Code Unfertiger, ungetesteter, inkompatibler Code wird ausgeliefert und könnte damit auch bei den Nutzern landen Alle Code‑Zweige müssen getestet werden. Theoretisch müssten alle Kombinationen auch gestestet werden, aber nur selten überschneiden sich durch Feature Toggles abgetrennte Code‑Zweige Langlebige Toggles sind Code und erhöhen dementsprechend den Wartungsaufwand
  22. Best Practices Anzahl an Toggles klein halten und nach Feature

    Release aufräumen Am Besten Toggles an sich vermeiden, wenn das neue Feature auch inkrementell ausgeliefert werden kann Toggles regelmäßig bewerten und bei Bedarf entfernen Bewusst die Kosten langlebiger Toggles wahrnehmen
  23. Quellen Feature Toggles, https://martinfowler.com/articles/feature‑ toggles.html Branch By Abstraction, https://martinfowler.com/bliki/BranchByAbstraction.html Continuous

    Lifecycle 2016 ‑ Integrierst du schon oder branchst du noch? (Steffen Schluff/Sebastian Damm), https://vimeo.com/192103429 Feature Toggles are one of the worst kinds of Technical Debt, https://swreflections.blogspot.de/2014/08/feature‑toggles‑are‑ one‑of‑worst‑kinds.html Trunk Based Development, https://trunkbaseddevelopment.com/ Flipper, https://github.com/jnunemaker/flipper Rollout, https://github.com/FetLife/rollout