Blau-Grün vs. Canary-Bereitstellung: Unterschiede, Kompromisse und Auswahlmöglichkeiten
Mit beiden Strategien können Sie die Website freigeben, ohne die Website herunterzufahren, sie verwalten das Risiko jedoch auf entgegengesetzte Weise. Erfahren Sie, wie die einzelnen Funktionen funktionieren, was sie wirklich kosten, wie Sie mit der Datenbank umgehen und welche für Ihr Team geeignet sind.
- Blau-Grün behält zwei vollständige Umgebungen bei und schaltet den gesamten Datenverkehr auf einmal um.
- Canary sendet die neue Version zunächst an einen kleinen Teil der Benutzer und erweitert sie dann schrittweise.
- Blaugrün bietet ein sehr schnelles Rollback. Canary begrenzt, wie viele Benutzer von einer fehlerhaften Version betroffen sein können.
- Beide sind auf abwärtskompatible Datenbankänderungen und eine gute Überwachung angewiesen.
Früher bedeutete die Veröffentlichung von Software ein Wartungsfenster und das Drücken der Daumen. Moderne Teams verwenden Strategien, die Releases zur Routine machen, und die Wahl zwischen Blue-Green vs. Canary-Deployment ist eine der ersten, mit der Sie konfrontiert werden. Beide verringern das Risiko, tun dies jedoch auf entgegengesetzte Weise: Der eine bereitet einen vollständigen Ersatz vor, während der andere nach und nach Tests mit echten Benutzern durchführt.
In diesem Leitfaden wird erläutert, wie die einzelnen Funktionen funktionieren und was sie in der Praxis kosten. Wir haben die kleinen Benutzer-Routing- und Rollback-Beispiele in Python 3.13 ausgeführt, und die Ausgabe stammt von diesem Lauf. Die Kubernetes-Beispiele dienen der Veranschaulichung und wurden von uns nicht ausgeführt. Betrachten Sie die Prozentsätze und Schwellenwerte als erste Beispiele für die Anpassung.
Die kurze Antwort
Mit der Blau-Grün-Bereitstellung führen Sie zwei identische Produktionsumgebungen aus. Einer bedient Benutzer, während Sie auf dem anderen die neue Version bereitstellen und testen und dann den gesamten Datenverkehr in einem Schritt umstellen.
Bei der Canary-Bereitstellung läuft die neue Version neben der alten. Sie senden ihm einen kleinen Prozentsatz des echten Traffics, vergleichen die Ergebnisse und erhöhen den Anteil Schritt für Schritt, bis er allen dient. Der Name stammt von den Kanarischen Bergleuten, die einst als Frühwarngerät vor Gefahren dienten.
Blaugrün vs. Kanarienvogel nebeneinander
| Aspekt | Blaugrün | Kanarienvogel |
|---|---|---|
| Verkehrsverlagerung | Alles auf einmal | Allmählich |
| Benutzer, die einer fehlerhaften Version ausgesetzt sind | Alles, bis Sie zurückwechseln | Nur der Kanarienvogelanteil |
| Rollback | Leiten Sie den Verkehr zurück | Setzen Sie den Canary-Anteil auf Null |
| Release-Geschwindigkeit | Schnelle Umstellung | Langsamer, in Etappen |
| Infrastrukturkosten | Bis zur Verdoppelung während der Veröffentlichung | Ein kleiner Extraanteil |
| Verkehrsführung erforderlich | Ein einfacher Schalter | Prozentbasiertes Routing |
| Überwachung erforderlich | Gut | Hervorragend, mit Metriken pro Version |
| Versionen leben zusammen | Kurz, wenn überhaupt | Für den gesamten Rollout |
| Echtes Benutzer-Feedback vor der vollständigen Veröffentlichung | Nein | Ja |
So funktioniert die Blau-Grün-Bereitstellung
- Blue ist live und bedient den gesamten Verkehr.
- Stellen Sie die neue Version auf Green bereit, das keinen Benutzerverkehr empfängt.
- Testen Sie Grün gründlich in der realen Produktionsumgebung, indem Sie Rauchtests und interne Benutzer verwenden.
- Schalten Sie den Router, Load Balancer oder DNS so um, dass der Datenverkehr auf Grün gesendet wird.
- Beobachten Sie genau, Blau läuft noch und ist bereit.
- Wenn etwas nicht stimmt, wechseln Sie zurück. Wenn alles in Ordnung ist, wird Blau zur nächsten Ruheumgebung.
In Kubernetes können Sie den Wechsel durchführen, indem Sie den Selektor eines Dienstes ändern, sodass der Datenverkehr zu Pods mit unterschiedlichen Bezeichnungen verschoben wird:
apiVersion: v1
kind: Service
metadata:
name: shop
spec:
selector:
app: shop
version: green # was: blue
ports:
- port: 80
targetPort: 8000
Stärken: Es ist konzeptionell einfach, Sie können das genaue Produktions-Setup testen, bevor Benutzer es sehen, und das Rollback erfolgt nahezu augenblicklich. Schwächen: Eine doppelte Infrastruktur kann teuer sein, ein Fehler, der Ihren Tests entgeht, erreicht alle auf einmal, und offene Sitzungen und Arbeiten während des Flugs müssen während des Wechsels betreut werden. Wenn Sie DNS für den Switch verwenden, können zwischengespeicherte Datensätze ihn verzögern. Neu in den Konzepten? Sehen Sie sich unser Kubernetes-Tutorial für Anfänger an.
So funktioniert die Canary-Bereitstellung
- Stellen Sie die neue Version zusammen mit der stabilen Version bereit.
- Leiten Sie einen kleinen Teil des Datenverkehrs, zum Beispiel 5 %, an den Kanarienvogel weiter.
- Vergleichen Sie Fehlerraten, Latenz und Geschäftskennzahlen mit der stabilen Version.
- Wenn es gesund ist, erhöhen Sie es auf 25 %, dann auf 50 % und dann auf 100 %.
- Wenn sich etwas verschlechtert, leiten Sie den gesamten Datenverkehr an die stabile Version zurück.
Viele Teams beginnen zunächst mit internen Mitarbeitern, dann mit einer Region mit geringem Risiko und erst dann mit der breiten Öffentlichkeit.
Stärken: Eine schlechte Version betrifft nur eine kleine Gruppe, und aus dem echten Datenverkehr lernt man, dass keine Testumgebung eine vollständige Reproduktion durchführen kann. Schwächen: Sie benötigen ein prozentuales Routing und Kennzahlen pro Version, Rollouts dauern länger und zwei Versionen laufen eine Zeit lang zusammen. Ein kleiner Kanarienvogel kann auch zu leise sein, um ein sinnvolles Signal zu geben, insbesondere in verkehrsarmen Zeiten.
Stabile Benutzerweiterleitung
Die zufällige Auswahl einer Version bei jeder Anfrage führt für Benutzer zu einer verwirrenden Erfahrung, da sie möglicherweise zwischen der alten und der neuen Version hin- und herwechseln. Eine gängige Lösung besteht darin, eine stabile Benutzer-ID in einen Bucket zu hashen, sodass jeder Benutzer immer die gleiche Antwort erhält:
import hashlib
def bucket(user_id):
digest = hashlib.sha256(user_id.encode()).hexdigest()
return int(digest, 16) % 100
def version_for(user_id, canary_percent):
return "v2" if bucket(user_id) < canary_percent else "v1"
users = [f"user-{i}" for i in range(10000)]
for percent in (5, 25, 50, 100):
share = sum(version_for(u, percent) == "v2" for u in users) / len(users)
print(percent, round(share * 100, 1))
# 5 5.0
# 25 24.5
# 50 49.9
# 100 100.0
Der tatsächliche Anteil folgte knapp dem Zielwert. Diese Methode hat zwei weitere nützliche Eigenschaften und unser Test bestätigte beide. Derselbe Benutzer erhielt immer die gleiche Version. Und jeder in der 5 %-Gruppe war immer noch bei 25 % enthalten, sodass niemand, der bereits die neue Version hatte, mit zunehmender Einführung zurückversetzt wurde.
In realen Systemen übernimmt normalerweise ein Service Mesh, Load Balancer oder ein Tool wie Argo Rollouts oder Flagger dieses Routing, sodass Sie es nicht selbst schreiben müssen. Es ist immer noch hilfreich zu verstehen, was sie tun.
Automatisierung der Entscheidung
Ein Kanarienvogel funktioniert nur, wenn tatsächlich jemand die Versionen vergleicht. Automatisierte Kontrollen sind zuverlässiger als die Beobachtung von Diagrammen durch eine Person. Hier ist die Kernidee, die Fehlerrate des Canary mit der der stabilen Version zu vergleichen:
def should_rollback(canary_errors, canary_total, base_errors, base_total,
tolerance=1.5, min_requests=500):
if canary_total < min_requests:
return False # not enough data to decide
return (canary_errors / canary_total) > (base_errors / base_total) * tolerance
should_rollback(3, 100, 10, 5000) # False: too few requests
should_rollback(30, 1000, 100, 10000) # True: 3% against 1%
should_rollback(12, 1000, 100, 10000) # False: 1.2% is within tolerance
Beachten Sie den ersten Fall. Die Fehlerquote erscheint zwar hoch, reicht aber mit nur 100 Anfragen noch nicht aus. Echte Tools wenden sorgfältigere Statistiken an und betrachten mehrere Signale zusammen:
| Signal | Beispiel |
|---|---|
| Fehler | Rate von 5xx Antworten |
| Latenz | p95 und p99, wie in Belastungstest vs. Stresstest erläutert |
| Sättigung | CPU, Speicher, Verbindungspools |
| Geschäft | Anmeldungen, Checkouts, Zahlungserfolg |
Tipp: Vergleichen Sie den Canary mit der stabilen Version im gleichen Zeitfenster und nicht mit den Zahlen der letzten Woche. Der Verkehr und das Verhalten ändern sich von Stunde zu Stunde, sodass Sie bei einem direkten Vergleich ein viel faireres Signal erhalten.
Das Datenbankproblem
Anwendungscode kann in Sekundenschnelle ausgetauscht werden, Daten jedoch nicht. Beide Strategien teilen sich in der Regel eine Datenbank, daher müssen sowohl die alte als auch die neue Version während eines Rollouts und nach einem Rollback mit demselben Schema arbeiten.
Die Standardantwort ist das Muster Expandieren und Kontrahieren. Angenommen, Sie möchten name in full_name umbenennen:
- Erweitern: Fügen Sie die neue Spalte hinzu. Der alte Code bleibt davon unberührt.
- Migrieren: Geben Sie Code frei, der in beide Spalten schreibt, und füllen Sie alte Zeilen auf.
- Schalter: Freigabecode, der aus der neuen Spalte liest.
- Vertrag: Sobald die alte Spalte nicht mehr verwendet wird, entfernen Sie sie in einer späteren Version.
Dies erfordert mehrere Releases, aber jeder Schritt kann sicher zurückgesetzt werden. Das auf einmal ausgeführte Ausführen von RENAME COLUMN würde die Version zerstören, die den anderen Namen erwartet. Seien Sie auch bei Schemaänderungen mit langer Laufzeit vorsichtig, da diese Sperren enthalten können. Weitere Informationen hierzu finden Sie unter SQL-Transaktionen.
Rollen und andere Strategien
| Strategie | Wie es funktioniert | Gut für |
|---|---|---|
| Neu erstellen | Hören Sie mit dem Alten auf und beginnen Sie dann neu, mit Ausfallzeiten | Interne Werkzeuge, Batch-Systeme |
| Rollen | Ersetzen Sie Instanzen nacheinander | Ein häufiger Standard, auch in Kubernetes |
| Blaugrün | Wechseln Sie zwischen zwei Umgebungen | Schnelle Umstellung und Rollback |
| Kanarienvogel | Erweitern Sie nach und nach einen kleinen Anteil | Hoher Verkehr, hohes Risiko |
| Schatten | Kopieren Sie den Datenverkehr in die neue Version und verwerfen Sie die Antworten | Testen unter realer Last, ohne Auswirkungen auf den Benutzer |
Eine Kubernetes-Bereitstellung führt standardmäßig ein fortlaufendes Update durch, was für viele Dienste geeignet ist. Ein rollierendes Update verschiebt sich ebenfalls schrittweise, sein Anteil ist jedoch an die Anzahl der Instanzen gebunden und es werden nicht automatisch Ergebnisse analysiert oder bei schlechten Kennzahlen pausiert.
Was ist mit Feature-Flags?
Durch die Bereitstellung wird Code auf Servern abgelegt und durch die Veröffentlichung wird den Benutzern eine Funktion zur Verfügung gestellt. Feature-Flags halten diese getrennt, indem sie es Ihnen ermöglichen, eine Funktion für ausgewählte Benutzer zu aktivieren, ohne etwas bereitzustellen. Sie funktionieren mit beiden Strategien sehr gut: Bereitstellung mit ausgeschaltetem Flag und dann schrittweise Aktivierung. Sie ersetzen diese Strategien nicht, da ein Flag Sie nicht vor einem Release schützen kann, das beim Start abstürzt. Denken Sie daran, alte Flags zu entfernen, da sie sich als technische Schulden ansammeln.
So wählen Sie aus
| Ihre Situation | Vernünftige Wahl |
|---|---|
| Einfache App und wenige Benutzer | Fortlaufendes Update |
| Sehr schnelle Umstellung und Rollback erforderlich | Blaugrün |
| Möchten Sie vor dem Wechsel in der Produktion testen? | Blaugrün |
| Hoher Datenverkehr und hohe Ausfallkosten | Kanarienvogel |
| Starke Überwachung und Kennzahlen pro Version | Kanarienvogel |
| Wenig Verkehr | Blaugrün, da Kanariensignale zu schwach sind |
| Knappes Infrastrukturbudget | Kanarienvogel oder rollend |
Sie können auch kombiniert werden. Einige Teams stellen eine grüne Umgebung bereit und verlagern den Verkehr dann schrittweise dorthin, um eine saubere Umgebung und einen begrenzten Explosionsradius zu erreichen. Was auch immer Sie wählen, automatisieren Sie es über Ihre CI/CD-Pipeline, wie unser GitHub-Aktionsleitfaden erklärt.
Häufige Fehler
- Machen Sie wichtige Schemaänderungen durch. Ein Rollback hilft nicht, wenn der alte Code die Daten nicht lesen kann.
- Es gibt keine Rollback-Kriterien. Entscheiden Sie, was „schlecht“ bedeutet, bevor die Veröffentlichung beginnt, nicht während eines Vorfalls.
- Die Umgebungen treiben lassen. Wenn sich Grün von Blau unterscheidet, ergeben Ihre Tests weniger. Definieren Sie beide mit Infrastruktur als Code.
- Es werden nur technische Kennzahlen gemessen. Eine Veröffentlichung kann fehlerfrei sein und dennoch den Checkout unterbrechen.
- Üben Sie niemals Rollback. Üben Sie es, damit es funktioniert, wenn Sie unter Druck stehen.
- Hintergrundjobs vergessen. Mitarbeiter und geplante Aufgaben benötigen auch während eines Wechsels einen Plan.
Fazit
Blaugrün sorgt für einen sauberen und schnellen Wechsel. Canary bietet Ihnen eine kleine, gemessene Belichtung. Wenn Ihre Überwachung noch einfach ist, beginnen Sie mit fortlaufenden Updates oder Blue-Green und investieren Sie in Metriken pro Version, bevor Sie Canaries ausprobieren. Dann üben Sie ein Rollback für Ihr nächstes Release, einschließlich der Datenbank. Diese einzelne Übung zeigt tendenziell, was wirklich repariert werden muss.
Häufige Fragen
Was ist der Unterschied zwischen Blue-Green- und Canary-Deployment?
Blau-Grün leitet den gesamten Datenverkehr auf einmal von einer vollständigen Umgebung in eine andere um. Canary leitet einen kleinen Teil des Datenverkehrs an die neue Version weiter und erweitert diese schrittweise.
Was ist sicherer, Blaugrün oder Kanarienvogel?
Canary begrenzt, wie viele Benutzer von einer fehlerhaften Version betroffen sind, und Blue-Green bietet ein sehr schnelles Rollback. Die sicherere Wahl hängt von Ihrem Datenverkehr, Ihren Werkzeugen und Ihrer Überwachung ab.
Ist die Blau-Grün-Bereitstellung teuer?
Dies kann der Fall sein, da Sie während einer Veröffentlichung möglicherweise zwei vollständige Umgebungen ausführen. Durch die automatische Skalierung der Cloud und das Herunterfahren der Leerlaufumgebung können die Kosten gesenkt werden.
Mit welchem Prozentsatz sollte ein Kanarienvogel beginnen?
Teams beginnen üblicherweise mit etwa 1 bis 5 Prozent, sofern dadurch genügend Verkehr für ein aussagekräftiges Signal bereitgestellt wird. Systeme mit geringem Verkehrsaufkommen benötigen möglicherweise einen größeren Anteil.
Wie gehen Canary und Blue-Green mit Datenbankänderungen um?
In der Regel mit abwärtskompatiblen Änderungen wie Expand und Contract, da sich beide Versionen möglicherweise eine Datenbank teilen und beim Rollout beide funktionieren müssen.
Lerne weiter
Benötigen Sie Hilfe beim Testen, WordPress oder SEO?
Wir helfen Teams, bessere Software zu liefern und ihre Websites zu erweitern. Sagen Sie uns, woran Sie gerade arbeiten, und wir schlagen Ihnen einen klaren nächsten Schritt vor.
Weitere Anleitungen finden Sie unter Tests, KI und moderne Entwicklung
Hat Ihnen dieser Artikel gefallen? Wählen Sie ein Thema und springen Sie direkt in unsere neuesten Tutorials.
KI-Halluzinationen erklärt: Warum Sprachmodelle Dinge erfinden und wie man sie reduziert
KI-Halluzinationen erklärt: Was sie sind, warum Sprachmodelle sie produzieren, gängige Typen, wie man sie mit Erdung und Eingabeaufforderungen reduz…
Artikel lesen →DevOpsErklärte Umgebungsvariablen: .env-Dateien, Geheimnisse und Konfiguration richtig gemacht
Umgebungsvariablen anhand von Python-Beispielen erklärt, die wir ausgeführt haben: Sie lesen und festlegen, warum jeder Wert ein String ist, .env-Da…
Artikel lesen →SoftwareentwicklungAPI-Ratenbegrenzung erklärt: Algorithmen, Header und Behandlung von 429-Fehlern
API-Ratenbegrenzung anhand einer von uns durchgeführten Simulation erklärt: Token-Bucket, festes Fenster, gleitendes Fenster, 429 Antworten, Ratenbe…
Artikel lesen →TestautomatisierungSpott in Python: unittest.mock, Patch und die Fehler, die Tests zum Lügen machen
Mocking in Python mit unittest.mock, getestet: Mock und return_value, side_effect, Patchen, wo ein Name verwendet wird, Spezifikation und Autospec, …
Artikel lesen →SoftwaretestsCode-Abdeckung erklärt: Leitungs- und Zweigstellenabdeckung und was 100 % wirklich bedeutet
Erklärung der Codeabdeckung anhand eines echten Coverage.py-Laufs: Zeilen-, Zweig- und Bedingungsabdeckung, Lesen eines Berichts, warum bei 100 % Ab…
Artikel lesen →Datenbanken & SQLDELETE vs. TRUNCATE vs. DROP in SQL: Unterschiede, Rollback und Verwendungszweck
DELETE vs. TRUNCATE vs. DROP erklärt mit getestetem SQL: was jeweils entfernt wird, Rollback, Trigger, Identitätsrücksetzung, Geschwindigkeit und wi…
Artikel lesen →Datenbanken & SQLErklärte SQL-Ansichten: Erstellen, nutzen und vermeiden Sie Fallstricke mit Beispielen
SQL-Ansichten anhand der von uns ausgeführten Abfragen erklärt: Erstellen einer Ansicht, Live-Ergebnisse, Ausblenden von Spalten, Leistung, aktualis…
Artikel lesen →SoftwareentwicklungTypeScript-Schnittstelle vs. Typ: Echte Unterschiede, getestet mit dem Compiler
TypeScript-Schnittstelle vs. Typ, überprüft mit dem echten Compiler: Was beide können, was nur einer kann, Deklarationszusammenführung, Erweiterunge…
Artikel lesen →SoftwareentwicklungPython *args und **kwargs erklärt: Flexible Funktionen mit klaren Beispielen
Python *args und **kwargs erklärt mit Code, den wir ausgeführt haben: Packen und Entpacken, Parameterreihenfolge, Nur-Schlüsselwort- und Nur-Positio…
Artikel lesen →SoftwareentwicklungPython-Lambda-Funktionen: Syntax, tatsächliche Verwendung und wann man sie nicht verwendet
Python-Lambda-Funktionen erklärt mit Code, den wir ausgeführt haben: Syntax, Sortierung mit Schlüssel, Karte und Filter, Abschlüsse, die Late-Bindin…
Artikel lesen →Künstliche IntelligenzWas sind KI-Agenten? Wie sie funktionieren, mit einer einfachen Agentenschleife, die Sie ausführen können
Was sind KI-Agenten? Eine einfache Anleitung zur Agentenschleife, zu Tools, Speicher und Leitplanken, mit einer kleinen Python-Schleife, die wir aus…
Artikel lesen →DevOpsÜberwachung vs. Beobachtbarkeit: Der wahre Unterschied, mit Protokollen, Metriken und Traces
Überwachung vs. Beobachtbarkeit erklärt: bekannte und unbekannte Fehler, Protokolle, Metriken und Spuren, eine exemplarische Vorgehensweise für Chec…
Artikel lesen →DevOpsDocker-Volumes vs. Bind Mounts: Containerdaten auf die richtige Art und Weise beibehalten
Docker-Volumes vs. Bind-Mounts erklärt: Warum Containerdaten verschwinden, benannte Volumes, Bind-Mounts, tmpfs, Compose-Beispiele, Backups, Berecht…
Artikel lesen →TestautomatisierungTDD vs. BDD: Hauptunterschiede, eine Funktion, die auf beide Arten entwickelt wurde und wann sie jeweils verwendet werden sollte
TDD vs. BDD erklärt mit einer Rabattfunktion, die in beide Richtungen aufgebaut ist: Rot-Grün-Refaktor mit Code, den wir ausgeführt haben, Gegeben-W…
Artikel lesen →SoftwaretestsBenutzerakzeptanztests (UAT): Prozess, Checkliste und reale Beispiele
Benutzerakzeptanztests erklärt: Wer führt ihn durch, wie unterscheidet er sich von der Qualitätssicherung, ein siebenstufiger Prozess, eine UAT-Test…
Artikel lesen →Datenbanken & SQLErklärte SQL-NULL-Werte: IS NULL, COALESCE, NULLIF und die zu vermeidenden Fallen
SQL-NULL-Werte, die mit von uns ausgeführten Abfragen erklärt wurden: dreiwertige Logik, IS NULL, COALESCE, NULLIF, wie Aggregate, Joins und Sortier…
Artikel lesen →Datenbanken & SQLSQL CASE WHEN-Anweisung: Syntax, reale Beispiele und häufige Fehler
SQL CASE WHEN anhand der von uns ausgeführten Abfragen erklärt: einfache und durchsuchte Formulare, Bedingungsreihenfolge, Pivots mit SUM, COUNT-Tri…
Artikel lesen →SoftwareentwicklungWas ist JWT? JSON-Web-Tokens anhand eines funktionierenden Beispiels erklärt
Was ist JWT? JSON Web Tokens erklärt: die drei Teile, ein Token, das in dem von uns ausgeführten Code erstellt und manipuliert wurde, JWT vs. Sitzun…
Artikel lesen →SoftwareentwicklungErklärte JavaScript-Ereignisschleife: Aufrufstapel, Mikrotasks und Timer mit Beispielen
Die JavaScript-Ereignisschleife wurde mit dem von uns ausgeführten Code erklärt: Aufrufstapel, Aufgaben- und Mikrotask-Warteschlangen, warum setTime…
Artikel lesen →SoftwareentwicklungErklärung von Python-Generatoren und -Ertrag: Sparen Sie Speicher mit echten Beispielen
Python-Generatoren und Yield anhand des von uns ausgeführten Codes erklärt: wie sie angehalten und fortgesetzt werden, gemessene Speichereinsparunge…
Artikel lesen →Künstliche IntelligenzWas sind Einbettungen? Vektoren und Kosinusähnlichkeit einfach erklärt
Was sind Einbettungen? Ein Leitfaden in einfacher Sprache zu Vektoren, Kosinusähnlichkeit und semantischer Suche, mit einem kleinen Beispiel, das wi…
Artikel lesen →DevOpsBlau-Grün vs. Canary-Bereitstellung: Unterschiede, Kompromisse und Auswahl
Blue-Green vs. Canary-Bereitstellung erklärt: Funktionsweise, Kosten, Risiko und Rollback, stabiles Benutzer-Bucketing, das wir getestet haben, Date…
Artikel lesen →TestautomatisierungFlaky-Tests: Was sie verursacht und wie man sie endgültig behebt
Flaky-Tests wurden anhand von Demos erklärt, die wir durchgeführt haben: die Hauptursachen, wie man sie bestätigt und diagnostiziert, richtige Korre…
Artikel lesen →SoftwaretestsLasttest vs. Stresstest: Unterschiede, Metriken und k6-Beispiele
Erläuterungen zu Lasttests und Stresstests: Was die einzelnen Tests beweisen, Spike- und Soak-Tests, welche Kennzahlen wichtig sind, warum Durchschn…
Artikel lesen →SoftwaretestsTestfall vs. Testszenario: Hauptunterschiede, Beispiele und wann man sie jeweils verwendet
Testfall vs. Testszenario erklärt: klare Definitionen, eine Tabelle nebeneinander, eine Funktion zum Zurücksetzen von Passwörtern, die von Szenarios…
Artikel lesen →Datenbanken & SQLSQL-Abfrageoptimierung: Ausführungspläne lesen und langsame Abfragen mit Zeitvorgaben beheben
An einer Million Zeilen getestete SQL-Abfrageoptimierung: Ausführungspläne lesen, die richtigen Indizes hinzufügen, nicht sargierbare Filter korrigi…
Artikel lesen →Datenbanken & SQLSQL UNION vs. UNION ALL: Unterschiede, Beispiele und getestete Leistung
SQL UNION vs. UNION ALL anhand der von uns ausgeführten Abfragen erklärt: Duplikate, die Regeln, denen beide folgen, ein echter Datenfehler, gemesse…
Artikel lesen →SoftwareentwicklungTutorial zur JavaScript-Abruf-API: GET, POST, Fehlerbehandlung und Zeitüberschreitungen
Ein JavaScript-Abruf-API-Tutorial, das auf einem lokalen Server getestet wurde: GET und POST, warum 404 nicht ausgelöst wird, ein wiederverwendbarer…
Artikel lesen →SoftwareentwicklungUmgang mit Python-Dateien: Lesen, Schreiben, CSV, JSON und Pathlib mit Beispielen
Die Handhabung von Python-Dateien wird anhand des von uns ausgeführten Codes erklärt: Öffnungsmodi, Lesen großer Dateien, CSV, JSON, Pathlib, Binärd…
Artikel lesen →SoftwareentwicklungPython-Klassen und -Objekte: OOP-Tutorial mit echten Beispielen
Python-Klassen und -Objekte erklärt mit Code, den wir ausgeführt haben: __init__, Methoden, Klassen- und Instanzattribute, Vererbung, Eigenschaften,…
Artikel lesen →Künstliche IntelligenzWas ist ein großes Sprachmodell? Wie LLMs funktionieren, ohne großen Hype erklärt
Was ist ein großes Sprachmodell? LLMs im Klartext erklärt: Token, Einbettungen, Aufmerksamkeit, Training, Temperatur- und Kontextfenster, eine klein…
Artikel lesen →DevOpsLinux-Befehle für Anfänger: Der grundlegende Terminal-Leitfaden mit Beispielen
Linux-Befehle für Anfänger, gruppiert nach Aufgaben: Navigation, Dateien, Anzeigen von Protokollen, Grep, Pipes, Berechtigungen, Prozesse und Archiv…
Artikel lesen →TestautomatisierungSelenium vs. Playwright: Hauptunterschiede, Code im Vergleich und welche Sie wählen sollten
Selenium vs. Playwright im Vergleich: Architektur, Wartezeit, Browser- und Sprachunterstützung, Debugging, der gleiche Test in beiden Tools, Migrati…
Artikel lesen →SoftwaretestsÄquivalenzpartitionierung: Testdesigntechnik anhand von Beispielen erklärt
Erklärung der Äquivalenzpartitionierung: Wie man gültige und ungültige Partitionen findet, Beispiele für Alter, Passwörter und Gutscheine, von uns d…
Artikel lesen →SoftwaretestsSchweregrad vs. Priorität beim Softwaretest: Unterschiede, Matrix und reale Beispiele
Schweregrad vs. Priorität beim Softwaretest erklärt: klare Definitionen, eine Vier-Wege-Matrix mit Beispielen, Stufenskalen, wer die einzelnen Punkt…
Artikel lesen →Datenbanken & SQLTutorial zu SQL-Unterabfragen: Typen, korrelierte Unterabfragen und EXISTS mit Beispielen
Ein SQL-Unterabfrage-Tutorial mit Abfragen, die wir ausgeführt haben: Skalar-, IN-, FROM- und SELECT-Unterabfragen, korrelierte Unterabfragen, EXIST…
Artikel lesen →Datenbanken & SQLSQL-Transaktionen und ACID erklärt: COMMIT, ROLLBACK und Isolationsstufen
SQL-Transaktionen und ACID anhand einer von uns durchgeführten Banküberweisung erklärt: COMMIT, ROLLBACK, Sicherungspunkte, Sperren, Isolationsstufe…
Artikel lesen →SoftwareentwicklungGit merge vs rebase: Unterschiede, Beispiele und wann man was nutzt
Git merge vs rebase erklärt mit echter Log-Ausgabe, einer Vergleichstabelle, der goldenen Regel des Rebase und einem sicheren Team-Workflow.
Artikel lesen →SoftwareentwicklungPython List Comprehension: Syntax, Beispiele und wann man darauf verzichtet
Python List Comprehension erklärt: Syntax, Filter, if-else, verschachtelte Schleifen, gemessene Zeiten und Fälle, in denen eine normale for-Schleife…
Artikel lesen →Datenbanken & SQLSQL Joins erklärt mit Beispielen (Inner, Left, Right, Full)
SQL Joins Schritt für Schritt mit Beispieltabellen und Abfragen verstehen: INNER, LEFT, RIGHT, FULL, CROSS und SELF, plus typische Fehler und Perfor…
Artikel lesen →