Slide 1

Slide 1 text

Wir lösen das – persönlich! Systeme modernisieren mit Microservices, Hystrix und RxJava Holger Kraus, Arne Landwehr Javaland, Brühl 24.03.2015 !

Slide 2

Slide 2 text

© 2011 innoQ Deutschland GmbH Ein (typisches) System monozon inc.

Slide 3

Slide 3 text

© 2011 innoQ Deutschland GmbH Im Kontext

Slide 4

Slide 4 text

© 2011 innoQ Deutschland GmbH Im Detail

Slide 5

Slide 5 text

© 2011 innoQ Deutschland GmbH Akute Probleme ‣ kaum zu warten ‣ kaum zu erweitern ‣ instabil ‣ buggy ‣ frustrierend ‣ veraltet

Slide 6

Slide 6 text

© 2011 innoQ Deutschland GmbH Und nun? ‣ Arbeit einstellen? ‣ neues System bauen? ‣ stabilisieren? ‣ weiter machen? ‣ System zerlegen?

Slide 7

Slide 7 text

© 2011 innoQ Deutschland GmbH Stabilisieren !

Slide 8

Slide 8 text

© 2011 innoQ Deutschland GmbH Problem: Integrationspunkte

Slide 9

Slide 9 text

© 2011 innoQ Deutschland GmbH Cascading Failures https://www.flickr.com/photos/benstassen/2991003141/

Slide 10

Slide 10 text

© 2011 innoQ Deutschland GmbH Stabilitätspattern ‣ Timeouts ‣ Circuit Breaker ‣ Bulkheads ‣ Fail Fast ! … Steady State , Handshaking, Test Harness, Decoupling Middleware

Slide 11

Slide 11 text

© 2011 innoQ Deutschland GmbH Timeout https://www.flickr.com/photos/55293400@N07/15564061004

Slide 12

Slide 12 text

© 2011 innoQ Deutschland GmbH Bulkheads https://www.flickr.com/photos/10413717@N08/6935206524

Slide 13

Slide 13 text

© 2011 innoQ Deutschland GmbH In der Schifffahrt http://de.wikipedia.org/wiki/RMS_Titanic#/media/File:Titanic_Structure_de.svg

Slide 14

Slide 14 text

© 2011 innoQ Deutschland GmbH In der IT ‣ Thread-Pools ‣ DB-Connection-Pools ‣ Instanzen ‣ Server ‣ Datacenter

Slide 15

Slide 15 text

© 2011 innoQ Deutschland GmbH Circuit Breaker https://www.flickr.com/photos/leafbug/409950515/

Slide 16

Slide 16 text

© 2011 innoQ Deutschland GmbH ‣ von Netflix ‣ Resilience Library ‣ Command Pattern ‣ Metriken ‣ Dashboard Hystrix

Slide 17

Slide 17 text

© 2011 innoQ Deutschland GmbH Naive Implementierung public List findExternalProducts(String type) { ClientResponse clientResponse = Client.create() .resource("http://merchant1/products/") .queryParam("type", type.toString()) .get(ClientResponse.class); return toProducts(clientResponse); } !

Slide 18

Slide 18 text

© 2011 innoQ Deutschland GmbH Einfacher Command public class GetProductsFromMerchant1 extends HystrixCommand> { ! GetProductsFromMerchant1() { super(HystrixCommandGroupKey.Factory.asKey("merchant1")); } ! @Override protected List run() throws Exception { return findExternalProducts(type); } }

Slide 19

Slide 19 text

© 2011 innoQ Deutschland GmbH Fallbacks @Override protected List getFallback(){ return Collections.emptyList(); } ! // oder mit Cache ! @Override protected List getFallback(){ return Cache.get(type); } ! // oder geschachtelt ! @Override protected List getFallback(){ return new FallbackCommand.execute(); }

Slide 20

Slide 20 text

© 2011 innoQ Deutschland GmbH Parallele Abfrage public Iterable search(String type) { HystrixCommand com1 = new GetProductsFromMerchant1(type); HystrixCommand com2 = new GetProductsFromMerchant2(type); Future fut1 = com1.queue(); Future fut2 = com2.queue(); try { List products1 = fut1.get(); List products2 = fut2.get(); return CollectionUtils.union(products1, products2); } catch (InterruptedException | ExecutionException e) { logger.error("unexpected exception", e); return Collections.emptyList(); } }

Slide 21

Slide 21 text

© 2011 innoQ Deutschland GmbH Geht besser mit RxJava! ‣ „Reactive Extensions for the JVM „ ‣ arbeiten mit asynchronen Streams ‣ Observable als Abstraktion ‣ Java 8 ready ‣ Polyglot (Scala, Groovy, Clojure and Kotlin)

Slide 22

Slide 22 text

© 2011 innoQ Deutschland GmbH Im Paket enthalten ‣ Hystrix intern mit Rx gebaut ‣ keine weitere Dependency ‣ „observe“ statt „queue“ ‣ oder „toObservable“ ! !

Slide 23

Slide 23 text

© 2011 innoQ Deutschland GmbH Ein Beispiel: zip http://rxmarbles.com/#zip

Slide 24

Slide 24 text

© 2011 innoQ Deutschland GmbH Hystrix + RxJava HystrixCommand com1 = new GetProductsFromMerchant1(type); HystrixCommand com2 = new GetProductsFromMerchant2(type); ! Observable>obs1 = com1.observe(); Observable>obs2 = com2.observe(); ! CollectioncombinedResult = Observable .zip(obs1,obs2,CollectionUtils::union) .toBlocking() .first();

Slide 25

Slide 25 text

© 2011 innoQ Deutschland GmbH Und nun? ‣ Anwendung stabilisiert ‣ wieder Luft zum Atmen ‣ weitere Systeme können integriert werden ! ‣ Entwicklung weiterhin zäh…

Slide 26

Slide 26 text

© 2011 innoQ Deutschland GmbH https://www.flickr.com/photos/donmaedi/116013352 monozon inc.

Slide 27

Slide 27 text

© 2011 innoQ Deutschland GmbH Typische Probleme mit Monolithen ‣ Hoher Aufwand bei kleinen Änderungen ‣ Technische Modernisierung schwierig ‣ Releases sind riskant und selten ‣ Skalierung nur sehr ungenau

Slide 28

Slide 28 text

© 2011 innoQ Deutschland GmbH Woran liegt das? ‣ unklare Abhängigkeiten ‣ unscharfe Modulgrenzen ‣ verteilte fachliche Prozesse ‣ nur eine technische Plattform ‣ Alles hängt mit allem zusammen

Slide 29

Slide 29 text

© 2011 innoQ Deutschland GmbH Ziel ‣ Kleinere Einheiten schaffen, die ‣ man verstehen kann, ‣ beherrschbar sind, ‣ fachlich weiterentwickelt werden können ‣ und technologischen Wandel erlauben

Slide 30

Slide 30 text

© 2011 innoQ Deutschland GmbH Gebraucht wird ein klarer Schnitt! https://www.flickr.com/photos/taefit/8528632756

Slide 31

Slide 31 text

© 2011 innoQ Deutschland GmbH Horizontal

Slide 32

Slide 32 text

© 2011 innoQ Deutschland GmbH Vertikale Services, 1 UI

Slide 33

Slide 33 text

© 2011 innoQ Deutschland GmbH Vertikal

Slide 34

Slide 34 text

© 2011 innoQ Deutschland GmbH Systemeigenschaften ‣ Eigene Benutzeroberfläche ‣ Eigene Datenhaltung ‣ Eigene interne, unabhängige Logik ‣ Klar definierte Schnittstellen ‣ Separates Deployment ‣ Separater Betrieb möglich

Slide 35

Slide 35 text

© 2011 innoQ Deutschland GmbH Mikroarchitektur ‣ Autonome Entscheidung über ‣ Programmiersprache ‣ Frameworks ‣ Interne Module, Komponenten, ‣ Interne Abhängigkeiten ‣ Datenbanktechnologie

Slide 36

Slide 36 text

© 2011 innoQ Deutschland GmbH Was ist da eigentlich drin?

Slide 37

Slide 37 text

© 2011 innoQ Deutschland GmbH Fachlichkeit!

Slide 38

Slide 38 text

© 2011 innoQ Deutschland GmbH in unterschiedlicher Granularität

Slide 39

Slide 39 text

© 2011 innoQ Deutschland GmbH Domänenarchitektur ‣ der Systemschnitt bildet fachlichen Domänen ab ‣ definiert wer für welche Daten verantwortlich ist ‣ verfolgt die Ziele ‣ lose Kopplung ‣ hohe Kohäsion

Slide 40

Slide 40 text

© 2011 innoQ Deutschland GmbH Bounded Context ‣ Monolith verfügt schon über viele Modelle ‣ diese gelten in spezifischen Kontexten ‣ und verfügen über eigene Prozesse ‣ oft nur implizit vorhanden, nicht deckungsgleich mit Modulgrenzen

Slide 41

Slide 41 text

© 2011 innoQ Deutschland GmbH Ausgangspunkt Monolith ‣ Bounded Contexts identifizieren ‣ Grenzen explizit definieren ‣ Grundlage für Domänenarchitektur ‣ Erfahrung mit dem Monolithen hilft Systemschnitt zu entwickeln

Slide 42

Slide 42 text

© 2011 innoQ Deutschland GmbH Verbindungen schaffen! https://www.flickr.com/photos/npobre/8189066572

Slide 43

Slide 43 text

© 2011 innoQ Deutschland GmbH Makroarchitektur ‣ legt systemübergreifende Standards fest ‣ UI-Integration ‣ Kommunikationsprotokolle ‣ Repräsentationsformate ‣ Umgang mit Datenredundanz ‣ Logging, Monitoring, Security

Slide 44

Slide 44 text

© 2011 innoQ Deutschland GmbH Smart endpoints, dump pipes! http://martinfowler.com/articles/microservices.html Martin Fowler, James Lewis

Slide 45

Slide 45 text

© 2011 innoQ Deutschland GmbH Konsequenzen ‣ Transaktionskontext nur innerhalb des jeweiligen Systems ‣ Kommunikation zwischen Systemen meist asynchron ‣ Systemübergreifende Transaktionen sind deuten auf optimierteren Systemschnitt hin

Slide 46

Slide 46 text

© 2011 innoQ Deutschland GmbH Aufbruch https://www.flickr.com/photos/epemsl/8790814488

Slide 47

Slide 47 text

© 2011 innoQ Deutschland GmbH Vorgehensmodelle ‣ Big Bang ‣ Evolutionäres Vorgehen

Slide 48

Slide 48 text

© 2011 innoQ Deutschland GmbH Big Bang ‣ komplette Neuentwicklung ‣ Monolith bleibt lange erhalten ‣ mehr Risiko, schlechter planbar ‣ weniger Kompromisse ‣ moderne Technologie

Slide 49

Slide 49 text

© 2011 innoQ Deutschland GmbH Evolutionäres Vorgehen ‣ Neue Funktionalität daneben stellen, keine Integration in den Monolithen mehr ‣ Bestehende Bounded Contexts in eigenständigeSysteme transformieren ‣ Bestehender Code als Grundlage ‣ Einzelne Systeme neu entwickeln

Slide 50

Slide 50 text

© 2011 innoQ Deutschland GmbH Evolutionäres Vorgehen ‣ Monolith schmilzt langsam ‣ Einzelne Systeme werden schneller produktiv ‣ Direktes Feedback aus der Produktion ‣ Weniger risikoreich ‣ mehr Kompromisse notwendig

Slide 51

Slide 51 text

© 2011 innoQ Deutschland GmbH

Slide 52

Slide 52 text

© 2011 innoQ Deutschland GmbH

Slide 53

Slide 53 text

© 2011 innoQ Deutschland GmbH

Slide 54

Slide 54 text

© 2011 innoQ Deutschland GmbH Conway’s Law Organisationen die Systeme entwickeln, sind dazu verurteilt, Modelle zu entwerfen, die ein Abbild ihrer Kommunikationsstruktur darstellen.

Slide 55

Slide 55 text

© 2011 innoQ Deutschland GmbH Erfahrungen ‣ Wenn alle für alles zuständig sind, entsteht auf Dauer wieder ein Monolith. ‣ Kleine Teams bilden, die jeweils für ein System verantwortlich sind ‣ Regelmäßiger Austausch über systemübergreifende Themen ist wichtig

Slide 56

Slide 56 text

© 2011 innoQ Deutschland GmbH Spannungsfelder ‣ Organisation vs. reale fachliche Beziehungen ‣ Größe der Services vs. Komplexität der Beziehungen untereinander

Slide 57

Slide 57 text

© 2011 innoQ Deutschland GmbH Links ‣ http://martinfowler.com/articles/microservices.html ‣ http://www.infoq.com/presentations/Breaking-the-Monolith ‣ https://github.com/Netflix/Hystrix ‣ https://github.com/ReactiveX/RxJava

Slide 58

Slide 58 text

© 2011 innoQ Deutschland GmbH Vielen Dank!