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

Robuste Anwendungen mit Hystrix

Robuste Anwendungen mit Hystrix

Anwendungen benötigen meist mehr als nur Daten aus ihrer eigenen Datenbank. Mit zunehmender Verknüpfung mit externen Diensten steigt jedoch die Gefahr von Ausfällen der eigenen Anwendung, wenn diese Dienste gar nicht, falsch oder zu langsam antworten. Schnell wird die eigene Anwendung unbedienbar, sobald ein Dienst ausfällt.

Hystrix, das von Netflix als Open Source Projekt bereitgestellt wurde, ermöglicht einfach und konsistent Sollbruchstellen und Backupstrategien zu implementieren. Alle wichtigen Informationen zum Zustand der Schnittstellen zu den Diensten können komfortabel überwacht, zur Laufzeit rekonfiguriert und in Echtzeit als Dashboard dargestellt werden.

Hystrix kann auch in bestehenden Software-Projekten mit wenigen Schritten Schnittstelle für Schnittstelle integriert werden. Bestehende Bibliotheken können gekapselt werden, um nachträglich eine Absicherung hinzuzufügen.

Alexander Schwartz

March 07, 2018
Tweet

More Decks by Alexander Schwartz

Other Decks in Programming

Transcript

  1. Robuste Anwendungen für die Cloud mit Hystrix 6 © msg

    | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz Anwendungen mit externen Diensten 1 Einbau von Hystrix Schritt für Schritt 2 Anwendungsüberwachung mit Hystrix 3 Hystrix - für jede Anwendung geeignet? 4 Zusammenfassung 5
  2. Idealisierte Anwendungen haben keine Abhängigkeiten © msg | März 2018

    | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 7 Anwendungen mit externen Diensten Registrierung
  3. Echte Anwendungen haben Abhängigkeiten © msg | März 2018 |

    Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 8 Anwendungen mit externen Diensten Registrierung Kontodaten- validierung Kunden- datenbank
  4. Anwendungen mit externen Diensten 1. Peter Deutsch: Fallacies of Distributed

    Computing (1994) https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing Ein Dominoeffekt tritt auf, wenn eine Komponente ausfällt © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 9 • Ein verteiltes System bietet viele Fehlermöglichkeiten • Ein Nutzer kann sich nur registrieren, wenn alle drei Komponenten funktionieren. • (Performance-)Probleme können sich fortpflanzen und verstärken.
  5. Anwendungen mit externen Diensten Domino: Eine langsame Kundendatenbank destabilisiert das

    System © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 10 • Eine langsame Kundendatenbank führt zur Überlastung der Kontovalidierung. • Die aufgestauten Nutzer führen zu einer Überlastung der Registrierung. • Das System kann nicht ohne Hilfe in einen stabilen Zustand gelangen. Registrierung Kontodaten- validierung Kunden- datenbank
  6. Anwendungen mit externen Diensten Probleme in einer Komponente sollen sich

    nicht fortpflanzen © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 11 Möglichkeit 1: Asynchrone Verarbeitung • Warteschlangen: Die Kunden werden nach der Registrierung asynchron in der Kundendatenbank angelegt. • Ergebnis: Maximale Entkopplung von Systemen Aber: Funktioniert nicht bei synchroner Rückgabe von Werten wie bei der Kontovalidierung. Möglichkeit 2: Robuste synchrone Verarbeitung • Beschränkung der Antwortzeit (Timeout) • Sicherungen beim Abweichen vom Normbereich (Circuit Breaker) • Abschottung der Komponenten untereinander (Bulkhead) Technische Implementierung: • In diesem Vortrag im Fokus: Netflix Hystrix (in process) • Alternativen: Service-Mesh Implementierungen wie Linkerd, envoy, istio (Sidecar Ansatz)
  7. Robuste Anwendungen für die Cloud mit Hystrix 12 © msg

    | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz Anwendungen mit externen Diensten 1 Einbau von Hystrix Schritt für Schritt 2 Anwendungsüberwachung mit Hystrix 3 Hystrix - für jede Anwendung geeignet? 4 Zusammenfassung 5
  8. Einbau von Hystrix Schritt für Schritt Netflix Hystrix: Kapselung von

    Schnittstellen © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 13 • Java-Bibliothek: kann beliebige Schnittstellen kapseln • Implementiert Patterns für robuste Anbindung von Schnittstellen • Open Source seit 2011 • Hystrix @ Github: https://github.com/Netflix/Hystrix • Hystrix Tutorial: https://github.com/ahus1/hystrix-examples
  9. Einbau von Hystrix Schritt für Schritt 1. https://developer.ibm.com/dwblog/2017/istio/ Istio: Kapselung

    von Schnittstellen © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 14 • Sidecar-Ansatz: Kapselt Schnittstellen, unabhängig von der Programmiersprache der Anwendung • Implementiert Patterns für robuste Anbindung von Schnittstellen • Zusätzlich: Service-Discovery, Routing und Load Balancing, Verschlüsselung, Policies und Authentifikation • Open Source seit Mai 2017 • Angekündigt von IBM, Google und Lyft. Unterstützt unter anderem von RedHat und Pivotal. • Istio @ Github: https://github.com/istio/istio
  10. Anwendungen mit externen Diensten Hystrix: wird in jede Anwendung als

    Bibliothek eingebaut © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 15 • Läuft im gleichen Prozess wie die Anwendung. • Gleicher Konfigurationsmechanismus wie die Anwendung selbst. Kontodaten- validierung Kunden- datenbank Registrierung
  11. Anwendungen mit externen Diensten Istio: als Sidecar zu eigentlichen Anwendung

    © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 16 • Läuft als eigenständiger Prozess neben der Anwendung auf dem gleichen Host. • Konfigurationsmechanismus unabhängig von der Anwendung selbst. • Timeouts und Verbindungsfehler werden in HTTP-Fehlercodes übersetzt. Kontodaten- validierung Kunden- datenbank Registrierung
  12. Anwendungen mit externen Diensten Istio: als Sidecar zu eigentlichen Anwendung

    © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 17 • Läuft als eigenständiger Prozess neben der Anwendung auf dem gleichen Host. • Konfigurationsmechanismus unabhängig von der Anwendung selbst. • Timeouts und Verbindungsfehler werden in HTTP-Fehlercodes übersetzt. Kontodaten- validierung Kunden- datenbank Registrierung
  13. Einbau von Hystrix Schritt für Schritt Ausgangsbasis: Aufruf des externen

    Services ohne Absicherung © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 18 if (!IBANValidator.isValid(account)) { throw new ValidationException("invalid"); }
  14. Einbau von Hystrix Schritt für Schritt Schritt 1: Kapselung des

    Aufrufs als HystrixCommand © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 19 private static class IBANValidatorCommand extends HystrixCommand<Boolean> { private Account account; protected IBANValidatorCommand(Account account) { super(Setter.withGroupKey(HystrixCommandGroupKey.Factory .asKey("iban"))); this.account = account; } @Override protected Boolean run() throws Exception { return IBANValidator.isValid(account); } }
  15. Einbau von Hystrix Schritt für Schritt Schritt 2: Anpassen des

    ursprünglichen Codes © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 20 if (!new IBANValidatorCommand(account).execute()) { throw new ValidationException("invalid"); } IBANValidatorCommand wirft HystrixRuntimeExceptions. Die Exceptions des gekapselten Aufrufs werden in HystrixRuntimeExceptions eingepackt.
  16. Einbau von Hystrix Schritt für Schritt Schritt 2b: Entpacken der

    ursprünglichen Exceptions (bei Bedarf) © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 21 try { if (!new IBANValidatorCommand(account).execute()) { throw new ValidationException("invalid"); } } catch (HystrixRuntimeException e) { if (e.getCause() instanceof MyException) { throw (MyException) e.getCause(); } throw e; }
  17. Einbau von Hystrix Schritt für Schritt Standardverhalten von Hystrix implementiert

    alle drei Patterns © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 22 • Zeitlimit von 1.000 ms für die Antwort (Timeout) • Maximal 10 parallele Anfragen (Bulkhead) • Abschaltung, wenn mehr als 50% der Aufrufe fehlschlagen (Circuit Breaker) • Nach einer Abschaltung: Wiederanlaufversuch alle 5 Sekunden (Circuit Breaker) Die Standardwerte und die individuellen Werte auf Kommandoebene sind konfigurierbar.
  18. Einbau von Hystrix Schritt für Schritt Schritt 3: Hinzufügen von

    Fallbacks © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 23 private static class IBANValidatorCommand ... { /* ... */ @Override protected Boolean getFallback() { return IBANFallback.isCheckDigitValid(account); } }
  19. Einbau von Hystrix Schritt für Schritt Schritt 4: Konfiguration zur

    Laufzeit © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 24 • Hystrix wird standardmäßig über Archaius konfiguriert. • Archaius kann die Werte aus einer Datenbank, einer Datei, etc. auslesen. • Änderungen werden ohne Neustart aktiv. (Mehr Informationen: https://github.com/Netflix/Hystrix/wiki/Configuration) # Java Start-Parameter -Darchaius.configurationSource.additionalUrls=file:///.../archaius.properties -Darchaius.fixedDelayPollingScheduler.delayMills=1000 -Darchaius.fixedDelayPollingScheduler.initialDelayMills=1000 # archaius.properties (Standard-Werte) hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=1000 hystrix.command.default.circuitBreaker.errorThresholdPercentage=50 hystrix.command.default.circuitBreaker.requestVolumeThreshold=20 hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5000 # archaius.properties (spezifische Werte für ein HystrixCommand) hystrix.command.IBANValidatorCommand.execution.isolation.thread.timeoutInMilliseconds=1000 hystrix.command.IBANValidatorCommand.circuitBreaker.errorThresholdPercentage=50 hystrix.command.IBANValidatorCommand.circuitBreaker.requestVolumeThreshold=20 hystrix.command.IBANValidatorCommand.circuitBreaker.sleepWindowInMilliseconds=5000
  20. Einbau von Hystrix Schritt für Schritt Option: Verwendung von Futures

    © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 25 Future<Boolean> futureResult = new IBANValidatorCommand(account).queue(); /* ... do something in between ... */ // see if the call has completed in the meantime if(futureResult.isDone()) { /* ... */ } // retrieve result - wait if necessary Boolean result = futureResult.get();
  21. Einbau von Hystrix Schritt für Schritt Option: Verwendung von Observables

    © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 26 Observable<Boolean> result = new IBANValidatorCommand(account).observe(); // Java 7 result.subscribe(new Action1<Boolean>() { @Override public void call(Boolean b) { // do something once the response is ready } }); // Java 8 result.subscribe(b -> /* ... */ );
  22. Einbau von Hystrix Schritt für Schritt 1. Quelle: https://github.com/Netflix/Hystrix/wiki/How-it-Works Interner

    schematischer Ablauf eines HystrixCommands © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 27
  23. Robuste Anwendungen für die Cloud mit Hystrix 28 © msg

    | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz Anwendungen mit externen Diensten 1 Einbau von Hystrix Schritt für Schritt 2 Anwendungsüberwachung mit Hystrix 3 Hystrix - für jede Anwendung geeignet? 4 Zusammenfassung 5
  24. Anwendungsüberwachung mit Hystrix Langzeit- und Echtzeit-Überwachung © msg | März

    2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 29 • Überwachung liefert mir wichtige Informationen:  Funktioniert die Anbindung wie gewünscht?  Hat sich der Normbereich verändert? • Alle Parameter und Kennzahlen sind verfügbar per API oder Konnektoren für Yammer Metrics, Netflix Servo, JMX, … • Proof of Concept mit Zabbix, Riemann und Prometheus im Tutorial • Hystrix Dashboard ist Teil der Hystrix Distribution: Browser-Seite mit Commands und Thread Pools pro Anwendung im Cluster
  25. Anwendungsüberwachung mit Hystrix Echtzeitinformationen werden im Hystrix Dashboard angezeigt ©

    msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 30 Anfragen Fehlerrate Zustand Verlauf der letzten Minuten Anzahl der Hosts im Cluster Antwortverhalten IBANValidatorCom… Ergebnisse absolut
  26. Anwendungsüberwachung mit Hystrix Echtzeitinformationen werden im Hystrix Dashboard angezeigt ©

    msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 31
  27. Anwendungsüberwachung mit Hystrix Operationales Monitoring mit Prometheus © msg |

    März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 33
  28. Robuste Anwendungen für die Cloud mit Hystrix 35 © msg

    | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz Anwendungen mit externen Diensten 1 Einbau von Hystrix Schritt für Schritt 2 Anwendungsüberwachung mit Hystrix 3 Hystrix - für jede Anwendung geeignet? 4 Zusammenfassung 5
  29. Hystrix – für jede Anwendung geeignet? Rezept für die Einführung

    von Hystrix © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 36 1. Bewusstsein schaffen: Komponenten können ausfallen, Fehler dürfen sich nicht fortpflanzen. 2. Vermessung des Normalzustands. 3. Identifikation der geeigneten Schnittstellen (synchron und idempotent). 4. Akzeptieren, dass zu langsame Antworten als Fehler gewertet werden. 5. Aufbau Monitoring und Einbau und Aktivierung von Hystrix in die Anwendung.
  30. Hystrix – für jede Anwendung geeignet? Alternative: Rezept II für

    die Einführung von Hystrix © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 37 1. Identifikation der geeigneten Schnittstellen (synchron und idempotent). 2. Einbau von Hystrix mit neutralisierter/deaktivierter Funktion. 3. Aufbau Monitoring und Vermessung des Normalzustands. 4. Akzeptieren, dass zu langsame Antworten als Fehler gewertet werden. 5. Hystrix scharfschalten.
  31. Hystrix – für jede Anwendung geeignet? Mögliche Herausforderungen rund um

    Hystrix © msg | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 38 1. Hystrix ist Open-Source-Software Für Korrekturen und neue Funktionalität ist Mitarbeit am Code explizit gewünscht. 2. Timeouts basieren auf Threads Kein Problem in Apache Tomcat, ggf. in anderen Application Servern. JEE7 JSR 236 (Concurrency Utilities for Java EE) (noch) nicht unterstützt 3. Exceptions des Service werden als HystrixRuntimeExceptions verpackt Wenn der eigene Code die Exceptions des Service erwartet, so müssen die HystrixRuntimeExceptions entpackt werden. 4. Monitoring in Produktion ist notwendig Circuit-Breaker und Latenzen müssen überwacht werden. Mit modernen Timeseries-Monitoring-Systemen wie Prometheus können dynamische Cluster überwacht werden und Metriken auf Knoten- und Cluster- Ebene überwacht werden.
  32. Robuste Anwendungen für die Cloud mit Hystrix 39 © msg

    | März 2018 | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz Anwendungen mit externen Diensten 1 Einbau von Hystrix Schritt für Schritt 2 Anwendungsüberwachung mit Hystrix 3 Hystrix - für jede Anwendung geeignet? 4 Zusammenfassung 5
  33. Zusammenfassung Hystrix ermöglicht widerstandsfähige Anwendungen © msg | März 2018

    | Robuste Anwendungen für die Cloud mit Hystrix | Alexander Schwartz 40 • Mit Hystrix steht eine erprobte technische Lösung für bewährte Patterns zur Verfügung. • Ein Umbau bestehender Anwendungen ist auch nachträglich möglich. • Integration in das Monitoring ist notwendig. • Statt dezentraler Verwendung von Hystrix kann ein zentral bereitgestelltes Service Mesh verwendet werden. Literatur: • Release It! – Design and Deploy Production-Ready Software (Michael Nygard) • Fallacies of Distributed Computing (Peter Deutsch, 1994) https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing Hystrix @ Github: https://github.com/Netflix/Hystrix Hystrix @ Heise Developer: http://heise.de/-2176465 Hystrix Examples: http://ahus1.github.io/hystrix-examples/ @ahus1de
  34. .consulting .solutions .partnership Alexander Schwartz Principal IT Consultant +49 171

    5625767 [email protected] @ahus1de msg systems ag (Headquarters) Robert-Buerkle-Str. 1, 85737 Ismaning Germany www.msg.group