$30 off During Our Annual Pro Sale. View Details »

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.

Alexander Schwartz

September 24, 2014
Tweet

More Decks by Alexander Schwartz

Other Decks in Programming

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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");
    }

    View Slide

  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 {
    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);
    }
    }

    View Slide

  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.

    View Slide

  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;
    }

    View Slide

  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

    View Slide

  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);
    }
    }

    View Slide

  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

    View Slide

  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 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();

    View Slide

  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 result =
    new IBANValidatorCommand(account).observe();
    result.subscribe(new Action1() {
    @Override
    public void call(Boolean b) {
    // do something once the response is ready
    }
    });

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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?

    View Slide

  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?

    View Slide

  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?

    View Slide

  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

    View Slide

  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

    View Slide

  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
    [email protected]
    www.msg-systems.com

    View Slide