
Feature Toggles und Dark Launches: Kontinuierliche Auslieferung meistern
- Bastian Fischer
- Dev ops , Continuous delivery
- 7. Mai 2025
Inhaltsverzeichnis
TL;DR: Feature Toggles entkoppeln Deployment vom Release – Dark Launches aktivieren neue Funktionen schrittweise und messbar, während ein Kill Switch jederzeit sicheres Zurückrollen ermöglicht.
TL;DR
Verstecke neue Features hinter Flags, entkopple Deployment von Release.
Aktiviere kontrolliert per Dark Launch (User‑Segment, Prozent‑Rollout, Geografie).
Messe Impact, schalte umgehend ab, lösche Flags nach Erfolg.
Zentraler Flag‑Service + Telemetrie = blitzschnelle Recovery & datengetriebene Entscheidungen.
Einleitung
„Move fast without breaking things“ – Feature Toggles (Feature Flags) und Dark Launches sind das Fundament moderner Continuous‑Delivery‑Pipelines. Sie erlauben es Teams, Code mehrmals täglich sicher nach Produktion zu pushen, Releases graduell zu exponieren und dank sofortiger Deaktivierung (Kill Switch) Risiken auf Sekunden zu begrenzen.
Hintergrund / Motivation
Risiko: Klassische Big‑Bang‑Releases besitzen eine ≥ 50 % höhere Ausfallwahrscheinlichkeit als inkrementelle Releases (DORA‑Report 2024).
Geschwindigkeit: Teams mit systematischem Flagging deployen im Median 46× häufiger.
Learning: Dark Launch + Telemetrie liefert Realwelt‑Feedback (Latency, Conversion, Error‑Rate) vor GA‑Freigabe.
Hauptteil
Problemstellung
Fehlende Rollback‑Strategien erzwingen Wartungsfenster oder Hotfix‑Chaos.
Abhängige Teams blockieren sich gegenseitig, wenn Funktionen gekoppelt ausgeliefert werden.
Datengetriebene Experimente (A/B, Canary) sind ohne On‑Off‑Schalter kaum realisierbar.
Lösungsansatz
Toggle‑Taxonomie
Typ | Zweck | Beispiele |
---|---|---|
Release Toggle | Verbirgt unfertigen Code bis zur GA‑Freigabe | „checkout_v2“ |
Ops Toggle | Notfall‑Switch zur Performance‑/Error‑Behebung | „recommendations_enabled“ |
Experiment Toggle | A/B‑ oder MVT‑Tests | „pricing_experiment_2025Q2“ |
Permission Toggle | Feature‑Gating für Kundengruppen | „enterprise_reports“ |
Architekturvarianten
Server‑Side Flags: Business‑Logik, konsistent, volle Kontrolle.
Client‑Side Flags: UI‑/UX‑Experimente mit sofortigem Feedback.
Edge‑Flags/CDN: Latenzarme Region‑ oder User‑Segment‑Rollouts.
Implementierungsschichten
// Spring Boot + Togglz: Bean‑Injection
@Bean
public FeatureManager featureManager() {
return new FeatureManagerBuilder()
.featureEnum(Features.class)
.stateRepository(new InMemoryStateRepository())
.userProvider(new NoOpUserProvider())
.build();
}
# LaunchDarkly YAML‑Datei für stufenweisen Rollout
environments:
production:
key: production
featureFlags:
checkout_v2:
fallthrough: { variation: false }
variations:
- false
- true
targets: []
rules:
- variation: true
clauses:
- attribute: user.bucket
op: in
values: [ "0-10" ] # 10 % Gradual
// React + Vite: Toggle‑Hook mit Remote Refresh
import { useFlags } from '@happykit/flags/client';
export function ProductTile({ product }) {
const { quick_buy } = useFlags('quick_buy');
return quick_buy ? <QuickBuy product={product}/> : <DefaultTile product={product}/>;
}
Monitoring & Observability
Metriken pro Flag: Error‑Rate, Latenz, Uplift‑KPIs.
Alert‑Routing: PagerDuty‑Integration löst Alarm, wenn error_rate(newFlag) > baseline × 1.2.
Dashboards: Grafana Board mit %‑Rollout vs. KPIs.
Lifecycle‑Management
Create (Ticket + Flag‑Key‑Namenskonvention).
Deploy (Flag default = off).
Dark Launch (0 % → 10 % → 25 % → 50 % → 100 %).
Verify (Metriken, Nutzerfeedback).
Cleanup (Code & Config entfernen ≤ 30 Tage nach 100 %).
Ergebnisse / Umsetzung
Kennzahl | Vorher | Nachher | Δ |
---|---|---|---|
MTTR | 45 min | 3 min | –93 % |
Change Failure Rate | 21 % | 7 % | –14 PP |
Deployments/Woche | 3 | 25 | × 8,3 |
Screenshots & Charts siehe Abschnitt „Grafiken & Diagramme“.
Code‑Beispiele
// API‑gesteuerter Kill‑Switch (LaunchDarkly Java SDK)
Runtime.getRuntime().addShutdownHook(new Thread(ldClient::flush));
if (ldClient.boolVariation("critical_payment_path", user, true)) {
processPayment();
} else {
fallback();
}
* Legacy‑COBOL – Flag via Environment Variable
IF FEATURE_INVOICE_V2 = 'true'
PERFORM NEW‑INVOICE
ELSE
PERFORM LEGACY‑INVOICE
END‑IF.
<!-- Feature‑Flag basiertes CSS -->
<link rel="stylesheet" href="/css/theme.css">
<link rel="stylesheet" data-flag="holiday_theme" href="/css/theme-holiday.css" disabled>
Grafiken & Diagramme

Best Practices & Tipps
Flag‑Naming‑Convention: (z. B.
payments_refund_2025q3
).Trunk‑Based‑Development + Short‑Lived Branches ≤ 24 h verhindern Merge‑Hölle.
Rollout‑Strategien immer idempotent halten; doppeltes Aktivieren darf kein Fehler sein.
Audit‑Log für alle Flag‑Änderungen – Pflicht in regulierten Branchen.
Delete Flags automatisch per CI‑Job (
git grep -L FLAG_KEY
) nach Cleanup‑Deadline.
Fazit
Feature Toggles und Dark Launches transformieren starre Release‑Trains in einen kontinuierlichen, messbaren Flow. Wer Flags als First‑Class‑Citizen behandelt – mit klarem Lifecycle, Telemetrie und striktem Cleanup – erzielt schnellere Wertlieferung, minimales Risiko und maximalen Lerneffekt. Starte heute mit einem Pilot‑Toggle und miss den Impact!
Weiterführende Links
Meta
MIT‑Lizenz, [email protected]