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. .consulting .solutions .partnership
    Robuste Anwendungen für die Cloud mit Hystrix
    Alexander Schwartz, Principal IT Consultant

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  15. 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 {
    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

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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 30
    Anfragen
    Fehlerrate
    Zustand
    Verlauf der letzten
    Minuten
    Anzahl der Hosts
    im Cluster
    Antwortverhalten
    IBANValidatorCom…
    Ergebnisse absolut

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide