Robuste Anwendungen mit Hystrix (JUG Frankfurt)

Robuste Anwendungen mit Hystrix (JUG Frankfurt)

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 2012 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.

5f528a3f6814d28b583f31842e3e8d9e?s=128

Alexander Schwartz

September 24, 2014
Tweet

Transcript

  1. Robuste Anwendungen mit Hystrix Alexander Schwartz Java User Group Frankfurt

    am 24. September 2014 © msg systems ag, 24.09.2014 Java User Group Frankfurt / Hystrix / Alexander Schwartz 1
  2. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 2 AGENDA 1. Anwendungen mit externen Diensten 2. Einbau von Hystrix Schritt für Schritt 3. Anwendungsüberwachung mit Hystrix 4. Hystrix – für jede Anwendung geeignet? 5. Zusammenfassung
  3. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 3 Mein Sponsor und Arbeitgeber 1980 gegründet mehr als 4.500 Kollegen 583 Mio € Umsatz 2013 23 Länder in 13 Städten in Deutschland präsent msg systems ag
  4. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 4 Wer ich bin Alexander Schwartz Principal IT Consultant im GB Travel und Logistics 12 Jahre Java 7 Jahre PL/SQL 7 Jahre Absatzfinanzierung 3,5 Jahre Direktbank 1 Frau 2 Kinder 384 gefundene Geocaches @ahus1de
  5. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 5 AGENDA 1. Anwendungen mit externen Diensten 2. Einbau von Hystrix Schritt für Schritt 3. Anwendungsüberwachung mit Hystrix 4. Hystrix – für jede Anwendung geeignet? 5. Zusammenfassung
  6. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 6 Idealisierte Anwendungen haben keine Abhängigkeiten Anwendungen mit externen Diensten Registrierung
  7. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 7 Echte Anwendungen haben Abhängigkeiten Anwendungen mit externen Diensten Registrierung Kontodaten- validierung Kunden- datenbank
  8. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 8 Ein Dominoeffekt tritt auf, wenn eine Komponente ausfällt • 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. Peter Deutsch: Fallacies of Distributed Computing (1994) https://blogs.oracle.com/jag/resource/Fallacies.html Anwendungen mit externen Diensten
  9. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 9 Domino: Eine langsame Kundendatenbank destabilisiert das System • 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. Anwendungen mit externen Diensten Registrierung Kontodaten- validierung Kunden- datenbank
  10. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 10 Probleme in einer Komponente sollen sich nicht fortpflanzen Möglichkeit 1: Asynchrone Verarbeitung • Warteschlangen: Die Kunden werden nach der Registrierung asynchron in der Kundendatenbank angelegt. 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: Netflix Hystrix Anwendungen mit externen Diensten
  11. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 11 AGENDA 1. Anwendungen mit externen Diensten 2. Einbau von Hystrix Schritt für Schritt 3. Anwendungsüberwachung mit Hystrix 4. Hystrix – für jede Anwendung geeignet? 5. Zusammenfassung
  12. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 12 Netflix Hystrix: Kapselung von Schnittstellen • 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 Einbau von Hystrix Schritt für Schritt
  13. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 13 Ausgangsbasis: Aufruf des externen Services ohne Absicherung Einbau von Hystrix Schritt für Schritt if (!IBANValidator.isValid(account)) { throw new ValidationException("invalid"); }
  14. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 14 Schritt 1: Kapselung des Aufrufs als HystrixCommand Einbau von Hystrix Schritt für Schritt 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. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 15 Schritt 2: Anpassen des ursprünglichen Codes Einbau von Hystrix Schritt für Schritt if (!new IBANValidatorCommand(account).execute()) { throw new ValidationException("invalid"); } IBANValidatorCommand wirft HystrixRuntimeExceptions. Die Exceptions des gekapselten Aufrufs werden in HystrixRuntimeExceptions eingepackt.
  16. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 16 Schritt 2b: Entpacken der ursprünglichen Exceptions (bei Bedarf) Einbau von Hystrix Schritt für Schritt 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. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 17 Standardverhalten von Hystrix implementiert alle drei Patterns • 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. Einbau von Hystrix Schritt für Schritt
  18. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 18 Schritt 3: Hinzufügen von Fallbacks Einbau von Hystrix Schritt für Schritt private static class IBANValidatorCommand ... { /* ... */ @Override protected Boolean getFallback() { return IBANFallback.isCheckDigitValid(account); } }
  19. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 19 Schritt 4: Konfiguration zur Laufzeit • 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) Einbau von Hystrix Schritt für Schritt # 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. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 20 Option: Verwendung von Futures Einbau von Hystrix Schritt für Schritt 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. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 21 Option: Verwendung von Observables Einbau von Hystrix Schritt für Schritt Observable<Boolean> result = new IBANValidatorCommand(account).observe(); result.subscribe(new Action1<Boolean>() { @Override public void call(Boolean b) { // do something once the response is ready } });
  22. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 22 Interner schematischer Ablauf eines HystrixCommands Quelle: https://github.com/Netflix/Hystrix/wiki/How-it-Works Einbau von Hystrix Schritt für Schritt
  23. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 28 AGENDA 1. Anwendungen mit externen Diensten 2. Einbau von Hystrix Schritt für Schritt 3. Anwendungsüberwachung mit Hystrix 4. Hystrix – für jede Anwendung geeignet? 5. Zusammenfassung
  24. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 29 Langzeit- und Echtzeit-Überwachung • Ü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 und Riemann im Tutorial • Hystrix Dashboard ist Teil der Hystrix Distribution: Browser-Seite mit Commands und Thread Pools pro Anwendung im Cluster Anwendungsüberwachung mit Hystrix
  25. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 30 Echtzeitinformationen werden im Hystrix Dashboard angezeigt Anwendungsüberwachung mit Hystrix Anfragen Fehlerrate Zustand Verlauf der letzten Minuten Anzahl der Hosts im Cluster Antwortverhalten IBANValidatorCom… Ergebnisse absolut
  26. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 31 Echtzeitinformationen werden im Hystrix Dashboard angezeigt Anwendungsüberwachung mit Hystrix
  27. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 32 Echtzeitinformationen werden im Riemann Dashboard angezeigt Anwendungsüberwachung mit Hystrix
  28. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 33 Langzeitinformationen werden in Zabbix angezeigt Anwendungsüberwachung mit Hystrix
  29. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 34 AGENDA 1. Anwendungen mit externen Diensten 2. Einbau von Hystrix Schritt für Schritt 3. Anwendungsüberwachung mit Hystrix 4. Hystrix – für jede Anwendung geeignet? 5. Zusammenfassung
  30. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 35 Rezept für die Einführung von Hystrix 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. Hystrix – für jede Anwendung geeignet?
  31. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 36 Alternative: Rezept II für die Einführung von Hystrix 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. Hystrix – für jede Anwendung geeignet?
  32. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 37 Mögliche Herausforderungen rund um Hystrix 1. Hystrix ist Open-Source-Software Für Korrekturen und neue Funktionalität ist Mitarbeit am Code explizit gewünscht. 2. Gebaut für Netflix-Infrastruktur Durch die Nutzung bei Netflix bewährt. Eigene Anwendungsfälle sollten ausgiebig getestet werden. 3. Entkopplung basiert auf Threads Kein Problem in Apache Tomcat, ggf. in anderen Application Servern. Eingeschränkte Nutzung ohne Threads ist möglich. JEE7 JSR 236 (Concurrency Utilities for Java EE) noch nicht unterstützt. 4. Exceptions des Service werden als HystrixRuntimeExceptions verpackt Wenn der eigene Code die Exceptions des Service erwartet, so müssen die HystrixRuntimeExceptions entpackt werden. Hystrix – für jede Anwendung geeignet?
  33. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 38 AGENDA 1. Anwendungen mit externen Diensten 2. Einbau von Hystrix Schritt für Schritt 3. Anwendungsüberwachung mit Hystrix 4. Hystrix – für jede Anwendung geeignet? 5. Zusammenfassung
  34. © msg systems ag, 24.09.2014 Java User Group Frankfurt /

    Hystrix / Alexander Schwartz 39 Hystrix ermöglicht widerstandsfähige Anwendungen • 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. • APIs mit bestehenden Implementierungen für die Integration in ein bestehendes Monitoring existieren. Literatur: • Release It! – Design and Deploy Production-Ready Software (M. Nygard) • Fallacies of Distributed Computing (Peter Deutsch, 1994) https://blogs.oracle.com/jag/resource/Fallacies.html Hystrix @ Github: https://github.com/Netflix/Hystrix Hystrix @ Heise Developer: http://heise.de/-2176465 Hystrix Examples: http://ahus1.github.io/hystrix-examples/ Zusammenfassung @ahus1de
  35. Vielen Dank für Ihre Aufmerksamkeit © msg systems ag, 24.09.2014

    Java User Group Frankfurt / Hystrix / Alexander Schwartz 40 Alexander Schwartz Geschäftsbereich Travel & Logistics Principal IT Consultant Telefon: +49 171 5625767 alexander.schwartz@msg-systems.com www.msg-systems.com