Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Macht kaputt was Euch kaputt macht - Failure Pa...

Macht kaputt was Euch kaputt macht - Failure Patterns in Tests

Kaum ein aktuelles Software-System ist in der heutigen Zeit kein verteiltes System mehr: Als Software-Entwickler programmieren wir mittlerweile Cloud-native, Event-Driven, API-Driven und Microservice-orientated, und nutzen dafür SaaS-, PaaS- und FaaS- Produkte. Doch verteilte Systeme bringen auch andere Resilienz-Paradigmen und -Notwendigkeiten mit sich, die nicht immer adressiert werden.

Dieser Talk beleuchtet kurz das gesamte Thema Resilienz in verteilten Systemen, um sich dann spezifischer auf die Notwendigkeit zu fokussieren, unsere guten alten Entwicklertests neu zu denken.

Avatar for Vincent Fahrenholz

Vincent Fahrenholz

February 19, 2019

Other Decks in Programming

Transcript

  1. Worum es heute NICHT geht - Infrastructure resilience - Simian

    army - Hystrix - Netflix - Microservices - SCS - Testen in Production - Chaos Engineering
  2. In Production leben - Software lebt in Production - Erfüllt

    einen Zweck - Hat Auswirkungen - auf die Welt - auf die restliche Systemlandschaft
  3. In Production leben - Auswirkungen - Resultat - Ressourcennutzung -

    Hardware - Verbindungen zu anderen Systemen - Menschen die den Betrieb sicherstellen - … - Potenzielle Ressourcenbindung - anfragende Systeme - Menschen
  4. In Production leben Es ist vital für unsere Software, dass

    sie - Mit ihrer Welt klarkommt - Möglichst effizient mit dieser interagiert - Die Welt nicht ins Chaos treibt - Sich von der Welt nicht ins Chaos treiben lässt
  5. Für Production designen - Welt kennen - Software verstehen -

    Tooling verstehen - Ressourcen verstehen - Die Augen öffnen
  6. “A distributed system is one in which the failure of

    a computer you didn’t even know existed can render your own computer unusable” -- Leslie Lamport
  7. 99,8% Verfügbarkeit pro komponente, das sind... Anzahl Komponenten Wahrscheinlichkeit dass

    alles verfügbar ist 10 98,02% (=357D 18H 28M 48S) 100 81,86% (=298D 18H 57M 36S) 500 36,75% (=134D 3H 21M 36S) 1000 13,5% (=49D 6H 28M 47S) 2500 0,06% (=2D 4H 33M 36S)
  8. Für Production designen - Downtime == Geld - Latenz ==

    Geld - Fehlerketten == Geld - Wartungsaufwand == Geld
  9. Für Production designen - Früher - Robust systems - High

    availability cluster - “Never touch a running system” - Dev system === Stg System === Prod System - ...
  10. Für Production designen - Früher - Robust systems - High

    availability cluster - “Never touch a running system” - Dev system === Stg System === Prod System - ...
  11. Für Production designen - Früher - Robust systems - High

    availability cluster - “Never touch a running system” - Dev system === Stg System === Prod System - … Es ist nur ein Teil der Arbeit
  12. Für Production designen - stabilize - Früher - Robust systems

    - High availability cluster - “Never touch a running system” - Dev system === Stg System === Prod System - … Es ist nur ein Teil der Arbeit
  13. Für Production designen - Resilience Patterns - Bulkhead - Timeouts

    - Graceful recovery - Scale out - Retry - ...
  14. TDD und Testen - TDD != Testen, da der Fokus

    auf der Entwicklung liegt Und auch ansonsten: - Happy Path meist getestet - Abweichungen meist weniger
  15. “[...] every system will eventually end up operating out of

    spec; therefore, it’s vital to test the local system’s behaviour when the remote system goes wonky. Unless the designers of the remote system built in modes that simulate the whole range of out-of-spec failures that can occur naturally in production, there will be behaviours that integration testing does not verify.” -- Michael T. Nygard
  16. “A better approach to [...] testing would be to [...]

    create test harnesses to emulate the remote system on the other end of each integration point. [...] A good test harness should be devious. It should be as nasty and vicious as real-world systems will be. The test harness should leave scars on the system under test. Its job is to make the system under test cynical. ” -- Michael T. Nygard
  17. Testen Für Production designen heißt, die Antwort auf folgende Fragen

    kennen: - Macht die Software das, was sie machen soll? ⇒ TDD, Dev Tests - Macht die Software nicht das, was sie nicht machen soll? ⇒ Edge cases, error cases - Macht die Software nicht das, was unmöglich ist? - Reagiert die Software sinnvoll auf unvorhergesehene fehlerhafte Zustände?
  18. Testen - Unit tests / Functional tests - Fehlerszenarien explizieren

    - Fehlerscopes explizieren - Fehlertoleranz testen - Timeouts - Circuit Breaker - Automatisierte Bereinigungen von Daten - Darstellung von Fehlern an Clients testen
  19. Testen - Integration Tests - Gezielt Fehlerszenarien in Fremdsystemen erzeugen

    - System Mocks - Kontrollierte und beeinflussbare Test-Environments - Volatile Test-Environments
  20. Fehlerquellen: Einige Ideen - Korrupte Daten - Nicht antwortende Systeme

    - Falsch formatierte Antworten - Authentication-Fehler - Bad-Request-Fehler - Server-Fehler - … - Zufallsgenerator?
  21. tl;dr - Wir wissen nicht woher der Fehler kommen wird

    - … dementsprechend können wir nur sicherstellen, dass unsere Software sich so gut wie möglich davon erholt
  22. tl;dr - Wir haben nicht die Möglichkeit, Systeme die uns

    nicht gehören zu beeinflussen - … dementsprechend können wir unsere eigenen Mocks dieser Systeme implementieren um unseres zu testen
  23. tl;dr - Mögliche Fehler finden um sie durch einen Test

    abzusichern besteht größtenteils aus Heuristik - … umso wichtiger ist es, tatsächlich auftretende Fehlerszenarien festzuhalten
  24. Referenzen & (Zusatz-)Literatur - Nygard, M. (2018) Release It! Design

    and deploy production-ready software (second edition). O’Reilly UK Ltd. - Friedrichsen, U. Patterns of resilience Um etwas weiter zu gehen: - Ein Twitter-Feed von Dan North über TDD (wo er sich, aber das ist nur Bonus, danach noch mit Ron Jeffries anlegt) - Ein Bugfix-Beispiel unter Anderen, das mit Integrationstests und beeinflussbarer Umgebung behoben wurde