resilient software design patterns...java message service nur java komplexe objekte queues und...
TRANSCRIPT
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
Resilient Software Design Patterns
18.2
Resilient Software Design Patterns© Orientation in Objects GmbH
Ihr Sprecher
2
Thorsten Maier
Trainer, Berater, Entwickler
SchwerpunkteArchitektur
ProzesseQualitätssicherung
Resilient Software Design Patterns© Orientation in Objects GmbH 3
Resilient Software?
Resilient Software Design Patterns© Orientation in Objects GmbH 4
Resilient Software?
Widerstandsfähig gegen Fehler
Resilient Software Design Patterns© Orientation in Objects GmbH 5
Warum?
Resilient Software Design Patterns© Orientation in Objects GmbH 6
Warum?
… weil jeder Ausfall viel Geld kostet
und viele User verärgert
Resilient Software Design Patterns© Orientation in Objects GmbH 7
Warum?
… weil jeder Ausfall viel Geld kostet
und viele User verärgert
Resilient Software Design Patterns© Orientation in Objects GmbH 8
Was ist daran neu?
Resilient Software Design Patterns© Orientation in Objects GmbH 9
Was ist daran neu?
…mehr User…mehr Daten
…schnellere Anpassungen
Resilient Software Design Patterns© Orientation in Objects GmbH 10
𝑉𝑒𝑟𝑓ü𝑔𝑏𝑎𝑟𝑘𝑒𝑖𝑡 =M𝑇𝑇𝐹
M𝑇𝑇𝐹 + M𝑇𝑇R
MTTF = Mean Time To FailureMTTR = Mean Time To Recovery
Resilient Software Design Patterns© Orientation in Objects GmbH 11
Verfügbarkeit Betriebszeit (h)Maximale erlaubte
Ausfallzeit (h)Maximale erlaubte
Ausfallzeit (min)
99 % 8672,4 87,6 525699,5 % 8716,2 43,8 262899,9 % 8751,24 8,76 525,6
99,99 % 8759,124 0,876 52,56100 % 8760 0 0
99% =8672,4h
8672,4h + 87,6h
Resilient Software Design Patterns© Orientation in Objects GmbH 12
Traditioneller Stabilisierungsansatz
𝑉𝑒𝑟𝑓ü𝑔𝑏𝑎𝑟𝑘𝑒𝑖𝑡 =M𝑇𝑇𝐹
M𝑇𝑇𝐹 + M𝑇𝑇R
∞
Resilient Software Design Patterns© Orientation in Objects GmbH 13
Der „resilient“ Ansatz
𝑉𝑒𝑟𝑓ü𝑔𝑏𝑎𝑟𝑘𝑒𝑖𝑡 =M𝑇𝑇𝐹
M𝑇𝑇𝐹 + M𝑇𝑇R
0
Resilient Software Design Patterns© Orientation in Objects GmbH 14
2 Millionen Google-Server
Unrealistische Annahme
MTTF = 30 Jahre
~ alle 8 Minuten fällt ein Server aus
Resilient Software Design Patterns© Orientation in Objects GmbH 15
Typical first year for a new cluster (~2400 server)
~0.5 overheating (power down most machines in <5 mins)
~1 PDU failure (~500-1000 machines suddenly disappear)
~1 rack-move (~500-1000 machines powered down)
~1 network rewiring (rolling ~5% of machines down over 2-day span)
~20 rack failures (40-80 machines instantly disappear)
~8 network maintenances (4 might cause ~30-minute random connectivity losses)
~3 router failures (have to immediately pull traffic for an hour)
~1000 individual machine failures
...
http://www.odbms.org/download/dean-keynote-ladis2009.pdf
Resilient Software Design Patterns© Orientation in Objects GmbH 16
Things will crash.
Deal with it!
Resilient Software Design
Resilient Software Design Patterns© Orientation in Objects GmbH 17
Wie machen wir eine Software „resilient“?
Resilient Software Design Patterns© Orientation in Objects GmbH 18
Wie machen wir eine Software „resilient“?
Redundanz
Resilient Software Design Patterns© Orientation in Objects GmbH 19
Wie machen wir eine Software „resilient“?
Redundanz
Isolation
Resilient Software Design Patterns© Orientation in Objects GmbH 20
Wie machen wir eine Software „resilient“?
Redundanz
Isolation
Lose Kopplung
Resilient Software Design Patterns© Orientation in Objects GmbH 21
Wie machen wir eine Software „resilient“?
Redundanz
Isolation
Lose Kopplung
Fallback
Resilient Software Design Patterns© Orientation in Objects GmbH 22
Wie machen wir eine Software „resilient“?
Redundanz
Isolation
Lose Kopplung
Fallback
Resilient Software Design Patterns© Orientation in Objects GmbH 23
ISOLATION
Resilient Software Design Patterns© Orientation in Objects GmbH 24
Resilient Software Design Patterns© Orientation in Objects GmbH 25
Resilient Software Design Patterns© Orientation in Objects GmbH 26
BULKHEADS
Resilient Software Design Patterns© Orientation in Objects GmbH 27
Bulkheads im Kleinen:
Methodenaufrufe
Resilient Software Design Patterns© Orientation in Objects GmbH 28
Mögliche Probleme?
public int fakultaet(int n) {return (n == 0) ? 1 : n * fakultaet(n - 1);
}
Resilient Software Design Patterns© Orientation in Objects GmbH 29
Schon besser…
public int fakultaet(int n) {if (n < 0) {
throw new IllegalArgumentException("n zu klein");}return (n == 0) ? 1 : n * fakultaet(n - 1);
}
Resilient Software Design Patterns© Orientation in Objects GmbH 30
…
public int fakultaet(int n) {if (n < 0) {
throw new IllegalArgumentException("n zu klein");}if (n > 12) {
throw new IllegalArgumentException("n zu groß");}return (n == 0) ? 1 : n * fakultaet(n - 1);
}
Resilient Software Design Patterns© Orientation in Objects GmbH 31
8
3
6
7
1 + 2
7
3
3
7
20 % 10 = 0
1 + 6
Zahl Verdoppeln SummierenLU
HN
Alg
ori
thm
us
Resilient Software Design Patterns© Orientation in Objects GmbH 32
Validierung der AufrufparameterDatentypen korrekt?
Wertebereiche eingehalten?
Vorbedingungen erfüllt?
!= null
Kreditkartennummer valide
…
„Freundliche“ RückgabewerteNiemals „null“ zurückliefern
Datenmengen beschränken
…
Resilient Software Design Patterns© Orientation in Objects GmbH 33
Bulkheads im Großen:
Software-Bausteine
Resilient Software Design Patterns© Orientation in Objects GmbH 34
3 Bausteine
Resilient Software Design Patterns© Orientation in Objects GmbH
Anwendung mit 3 Bausteinen
35
Resilient Software Design Patterns© Orientation in Objects GmbH 36
Deployment auf einem Server
Anwendung mit 3 Bausteinen
Resilient Software Design Patterns© Orientation in Objects GmbH 37
Anwendung mit 3 Bausteinen
Baustein wird 4 mal benötigt
Resilient Software Design Patterns© Orientation in Objects GmbH 38
Anwendung mit 3 Bausteinen
Nachteile
wird nur 2 mal benötigt
Änderung an erfordert Reploy von
Baustein wird 4 mal benötigt
Resilient Software Design Patterns© Orientation in Objects GmbH 39
Unabhängige ArtefakteAnwendung mit 3 Bausteinen
Baustein wird 4 mal benötigt
Resilient Software Design Patterns© Orientation in Objects GmbH 40
Unabhängige Artefakte
Flexible Skalierung auf 3 Server
Anwendung mit 3 Bausteinen
Baustein wird 4 mal benötigt
Resilient Software Design Patterns© Orientation in Objects GmbH 41
Unabhängige ArtefakteVorteile
Isolierte Entwicklung
Isolierte Fehler
Isoliertes Deployment
…
Flexible Skalierung auf 3 Server
Resilient Software Design Patterns© Orientation in Objects GmbH 42
Unabhängige ArtefakteNachteil
Kommunikation über
Prozess- und Netzwerkgrenzen
Verteilte Datenverarbeitung
Flexible Skalierung auf 3 Server
Resilient Software Design Patterns© Orientation in Objects GmbH 43
8 Irrtümer der verteilten Datenverarbeitung
Netzwerk ist ausfallsicher
Latenzzeit = 0
Datendurchsatz ∞
Netzwerk ist sicher
Netzwerktopologie ist stabil
1 Netzwerkadministrator
Kosten des Datentransports = 0
Netzwerk ist homogen
Bill Joy, Tom Lyon, L Peter Deutsch und James Gosling
…
Resilient Software Design Patterns© Orientation in Objects GmbH 44
In Kürze:
Zuverlässigkeit und Konsistenzexistieren nicht mehr
Resilient Software Design Patterns© Orientation in Objects GmbH 45
Verhalten und Standorte der Komponenten unseres Systems
verändern sich ständig
Resilient Software Design Patterns© Orientation in Objects GmbH 46
Komponenten liefern unzuverlässige Daten oder
verschwinden völlig
Resilient Software Design Patterns© Orientation in Objects GmbH 47
Ok, wir brauchen ISOLATION
Aber wie kommen die Teile wieder zusammen?
Resilient Software Design Patterns© Orientation in Objects GmbH 48
LOSE KOPPLUNG
Resilient Software Design Patterns© Orientation in Objects GmbH 49
LOSE KOPPLUNG
asynchron synchron
Resilient Software Design Patterns© Orientation in Objects GmbH 50
Asynchrone KommunikationEntkoppelt Sender und Empfänger
Verhindert Fehlerketten
Sender muss nicht warten
Resilient Software Design Patterns© Orientation in Objects GmbH
Barista
51
Kunde BecherwarteschlangeKassierer
Ausgabe
http://www.enterpriseintegrationpatterns.com/ramblings/18_starbucks.html
„Starbucks Does Not Use Two-Phase Commit”
Resilient Software Design Patterns© Orientation in Objects GmbH 52
Weiche zeitliche Anforderungen
Strict Consistency
Eventual Consistency (engl. „letztendlich“ nicht „eventuell“)
türschloss = geschlossen
letzte_reise = 523km
Resilient Software Design Patterns© Orientation in Objects GmbH 53
EmpfängerSender
tuerschloss=offentoggleTuerschloss()
Nicht idempotent
Exactly Once-Kommunikation
notwendig
Resilient Software Design Patterns© Orientation in Objects GmbH 54
EmpfängerSender
Idempotent!
At Least Once-Kommunikation
möglich
schliesseTuerschloss() tuerschloss=offen
Resilient Software Design Patterns© Orientation in Objects GmbH
Listener
55
TopicNachricht wird an alle Listener zugestellt
Falls kein „Interessent“ aktiv ist, wird die Nachricht u.U. nicht verarbeitet
Sender Topic
Listener
Listener 26°C
26°C26°C
26°C
Resilient Software Design Patterns© Orientation in Objects GmbH
Listener
56
QueueNachricht wird an einen Listener zugestellt
Es kann sichergestellt werden, dass eine Nachricht genau einmal verarbeitet wird
Sender Queue
Listener
Listener
26°C26°C
Resilient Software Design Patterns© Orientation in Objects GmbH 57
??
Resilient Software Design Patterns© Orientation in Objects GmbH 58
Java Message Servicenur Java
Komplexe ObjekteQueues und Topics
Verteilte Transaktionen
Resilient Software Design Patterns© Orientation in Objects GmbH
Barista
59
Kassierer coffeeOrderQueue
JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);jmsTemplate.convertAndSend("coffeeOrderQueue", new CoffeeOrder("Thorsten", "Cappuccino"));
@Componentpublic class Barista {
@JmsListener(destination = "coffeeOrderQueue")public void receiveMessage(CoffeeOrder coffeeOrder) {System.out.println("Received <" + coffeeOrder + ">");
}}
Resilient Software Design Patterns© Orientation in Objects GmbH 60
Advanced Message Queuing ProtocolViele Sprachen
Komplexe ObjekteQueues und Topics
Verteilte Transaktionen
Resilient Software Design Patterns© Orientation in Objects GmbH 61
Message Queuing Telemetry TransportViele Sprachen
Nur Byte StreamsNur Topics
Für „dünne Leitungen“ und Geräte mit „Batterie“
QoS 0: At most onceQoS 1: At least onceQoS 2: Exactly once
Resilient Software Design Patterns© Orientation in Objects GmbH 62
Und welchen Broker?
Resilient Software Design Patterns© Orientation in Objects GmbH 63
LOSE KOPPLUNG
asynchron synchron
Resilient Software Design Patterns© Orientation in Objects GmbH 64
?
Mit wem kann / soll ich kommunizieren?
nicht erreichbar
Startetgerade
Resilient Software Design Patterns© Orientation in Objects GmbH 65
?
nicht erreichbar
Startetgerade
Als Architekt lassen sich alle Probleme mit
„Boxes and Lines“ lösen☺
Resilient Software Design Patterns© Orientation in Objects GmbH 66
Verzeichnis-dienst
1. registrieren
2. Dienst finden
3. Dienst nutzen
z.B.:Netflix EurekaApache ZooKeeperCloud Foundry DiscoveryHashicorp Consul…
Resilient Software Design Patterns© Orientation in Objects GmbH 67
Verzeichnis-dienst
1. registrieren
2. Dienst finden
3. Dienst nutzen
Als Entwickler brauchen wir etwas mehr
Resilient Software Design Patterns© Orientation in Objects GmbH 68
Eureka
1. registrieren
2. Dienst finden
3. Dienst nutzen
@SpringBootApplication@EnableEurekaServerpublic class Application {
public static void main(String[] args) {// ...
}}
Resilient Software Design Patterns© Orientation in Objects GmbH 69
Eureka
1. registrieren
2. Dienst finden
3. Dienst nutzen
@SpringBootApplication@EnableEurekaServerpublic class Application {
public static void main(String[] args) {// ...
}}
Resilient Software Design Patterns© Orientation in Objects GmbH 70
Eureka
Resilient Software Design Patterns© Orientation in Objects GmbH 71
Eureka?
Weitere
Instanz
Resilient Software Design Patterns© Orientation in Objects GmbH 72
AlgorithmenSimple Round Robin
Zone Aware Round RobinRandom
Weighted Response Time
Resiliente Lösung:
Clientseitiges
Load-Balancing
Resilient Software Design Patterns© Orientation in Objects GmbH 73
@RibbonClient(name = "blauerService")@RestControllerpublic class Application {
@LoadBalanced@BeanRestTemplate restTemplate() {
return new RestTemplate();}
@RequestMapping("/")public String serviceCall() {
return restTemplate().getForObject("http://blauerService/", String.class);}
}
Resiliente Lösung:
Clientseitiges
Load-Balancing
Resilient Software Design Patterns© Orientation in Objects GmbH 74
Security?
Resilient Software Design Patterns© Orientation in Objects GmbH 75
Security!
Resilient Software Design Patterns© Orientation in Objects GmbH 76
„Soll ich mich etwa 2x einloggen?“
Resilient Software Design Patterns© Orientation in Objects GmbH 77
„Meine Session wird geteilt ☺“
ExternalSession Store
Resilient Software Design Patterns© Orientation in Objects GmbH 78
Netter Nebeneffekt:
Anwendung wird zustandslos!
ExternalSession Store
Resilient Software Design Patterns© Orientation in Objects GmbH 79
Redis
@EnableRedisHttpSessionpublic class SpringSessionConfig {
@Beanpublic JedisConnectionFactory connectionFactory() {
return new JedisConnectionFactory();}
}
Resilient Software Design Patterns© Orientation in Objects GmbH 80
Redis
Problem:
Doppelte Implementierung
Resilient Software Design Patterns© Orientation in Objects GmbH 81
API Gateway
Security
…/blauerKreis/orders…/gruenerStern/customers
Resilient Software Design Patterns© Orientation in Objects GmbH 82
Zuul
@EnableZuulProxy@EnableDiscoveryClient@SpringBootApplicationpublic class ZuulProxy {public static void main(String[] args) {SpringApplication.run(ZuulProxy.class, args);
}}
ExternalSession Store Security
Resilient Software Design Patterns© Orientation in Objects GmbH 83
FALLBACK
Resilient Software Design Patterns© Orientation in Objects GmbH 84
Verzeichnis-dienst
1. registrieren
2. Dienst finden
3. Dienst nutzen
zur Erinnerung
Resilient Software Design Patterns© Orientation in Objects GmbH 85
Instanz fällt kurzNACH der Auswahl aus
Resilient Software Design Patterns© Orientation in Objects GmbH 86
Circuit Breaker
Resilient Software Design Patterns© Orientation in Objects GmbH 87
Circuit Breaker
Resilient Software Design Patterns© Orientation in Objects GmbH 88
Circuit Breaker
errorCount = 3
Resilient Software Design Patterns© Orientation in Objects GmbH 89
Hystrix
@HystrixCommand(fallbackMethod = "fallback")public String readString() {return remoteServiceCall();
}
public String fallback() {return "Fallback result";
}
Resilient Software Design Patterns© Orientation in Objects GmbH 90
Eureka
registrieren
Alternativefinden
Hystrix
Resilient Software Design Patterns© Orientation in Objects GmbH 91
API Gateway
Security
…/blauerKreis/orders…/gruenerStern/customers
Resilient Software Design Patterns© Orientation in Objects GmbH 92
ZENTRALE DIENSTE
Resilient Software Design Patterns© Orientation in Objects GmbH 93
db.url=green.dbserver.de
db.url=blue.dbserver.de
db.url=yellow.dbserver.de
db.url=green.dbserver.de
Wo liegt unsere Konfiguration?
Resilient Software Design Patterns© Orientation in Objects GmbH 94
CentralConfiguration
Resilient Software Design Patterns© Orientation in Objects GmbH 95
Spring CloudConfig
@SpringBootApplication@EnableConfigServerpublic class ConfigServerApplication {
public static void main(String[] args) {SpringApplication.run(ConfigServerApplication.class, args);
}}
Resilient Software Design Patterns© Orientation in Objects GmbH 96
Spring CloudConfig
@SpringBootApplication@EnableConfigServerpublic class ConfigServerApplication {
public static void main(String[] args) {SpringApplication.run(ConfigServerApplication.class, args);
}}
@Value("${db.url}")private String url;
Resilient Software Design Patterns© Orientation in Objects GmbH 97
Resilient Software Design
Patterns?!
Resilient Software Design Patterns© Orientation in Objects GmbH 98
Circuit Breaker
Bulkheads
Discovery Service
Location Transparency
Stateless
Microservice
External Session Store
Parameter Checking
Eventual Consistency
Async Communication
Exactly Once- und At Least Once-Kommunikation
Idempotenz
API Gateway
Central Configuration
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
? ?
??
?Fragen ?
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
Vielen Dank für Ihre
Aufmerksamkeit!