Canary Deployment
Eine Deployment-Strategie, bei der neue Modellversionen zunächst nur einem kleinen Teil der Nutzer ausgeliefert werden, um Probleme früh zu erkennen.
Eine Deployment-Strategie, bei der eine neue Version parallel zur Produktion läuft und echten Traffic erhält, aber keine Antworten an Nutzer sendet – für risikofreies Testen.
Shadow Deployment lässt eine neue Version parallel zur Produktion laufen. Sie erhält echten Traffic, aber ihre Antworten werden verworfen – Nutzer merken nichts davon.
Der Ablauf:
Nutzer-Request
│
├──────────────────┐
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Produktion │ │ Shadow │
│ (v1.0) │ │ (v2.0) │
└──────┬───────┘ └──────┬───────┘
│ │
▼ ▼
Response Logging
an Nutzer (verworfen)
Vergleich Deployment-Strategien:
| Strategie | Nutzer sieht neue Version? | Risiko | Use Case |
|---|---|---|---|
| Shadow | Nein | Sehr niedrig | Validierung |
| Canary | Ja (1-10%) | Niedrig | Gradual Rollout |
| Blue-Green | Ja (100%) | Mittel | Schneller Switch |
| A/B Test | Ja (50%) | Mittel | Feature-Vergleich |
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- my-service
http:
- route:
- destination:
host: my-service
subset: v1
weight: 100
mirror:
host: my-service
subset: v2
mirrorPercentage:
value: 100.0 # 100% des Traffics spiegeln
location /api {
# Primärer Backend
proxy_pass http://production;
# Mirror zu Shadow
mirror /mirror;
mirror_request_body on;
}
location = /mirror {
internal;
proxy_pass http://shadow$request_uri;
# Antwort verwerfen
proxy_ignore_client_abort on;
}
class ShadowModelService:
def __init__(self, production_model, shadow_model):
self.production = production_model
self.shadow = shadow_model
self.logger = MetricsLogger()
async def predict(self, input_data):
# Production: Synchron, Antwort an Nutzer
prod_result = await self.production.predict(input_data)
# Shadow: Asynchron, nur Logging
asyncio.create_task(
self._shadow_predict(input_data, prod_result)
)
return prod_result
async def _shadow_predict(self, input_data, prod_result):
try:
shadow_result = await self.shadow.predict(input_data)
# Vergleich loggen
self.logger.log({
"input": input_data,
"production": prod_result,
"shadow": shadow_result,
"match": prod_result == shadow_result,
"shadow_latency": shadow_result.latency
})
except Exception as e:
self.logger.log_error(e)
def analyze_shadow_results(logs):
metrics = {
"total_requests": len(logs),
"match_rate": sum(l["match"] for l in logs) / len(logs),
"shadow_avg_latency": mean(l["shadow_latency"] for l in logs),
"prod_avg_latency": mean(l["prod_latency"] for l in logs),
"shadow_errors": sum(1 for l in logs if l.get("shadow_error")),
}
# Alerts
if metrics["match_rate"] < 0.95:
alert("Shadow model divergiert von Production!")
if metrics["shadow_avg_latency"] > metrics["prod_avg_latency"] * 1.5:
alert("Shadow model ist 50% langsamer!")
return metrics
| Szenario | Empfehlung |
|---|---|
| Neues ML-Modell | ✅ Shadow zuerst |
| Kritische API-Änderung | ✅ Shadow zuerst |
| Minor Bug Fix | ❌ Canary reicht |
| UI-Änderung | ❌ Nicht anwendbar |
| Performance-Optimierung | ✅ Shadow für Latenz-Vergleich |
Shadow Deployment ist wie ein Praktikant, der bei echten Kundengesprächen zuhört und intern Antworten formuliert – aber nie selbst antwortet. So lernt er unter realen Bedingungen, ohne Risiko für den Kunden.
Neue Version erhält echten Produktions-Traffic
Antworten werden verworfen, nicht an Nutzer gesendet
Ermöglicht Vergleich: Neue vs. alte Version unter realen Bedingungen
ML-Modell-Validierung
Neues Modell mit echten Daten testen vor Go-Live
Performance-Tests
Latenz und Durchsatz unter realer Last messen
Regressionstests
Vergleich der Outputs zwischen alter und neuer Version
Datenqualität
Prüfen ob neue Version mit echten Edge Cases umgehen kann
Canary: Neue Version antwortet echten Nutzern (kleiner Prozentsatz). Shadow: Neue Version antwortet nie echten Nutzern. Shadow ist risikofreier, Canary testet echte User Experience.
Ja, für Compute. Der Traffic wird dupliziert. Aber: Nur temporär während der Testphase. Kosten vs. Risiko eines fehlerhaften Deployments abwägen.
Logging beider Versionen, dann Diff-Analyse. Bei ML: Metriken wie Accuracy, Latenz, Fehlerrate vergleichen. Automatisierte Alerts bei Abweichungen.