Resilient Software Design Patterns

Resilient Software Design Patterns Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: 17.1 www.oio.de [email protected] Ihr Sprech...
Author: Gerburg Engel
3 downloads 1 Views 2MB Size
Resilient Software Design Patterns

Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim

Version:

17.1

www.oio.de [email protected]

Ihr Sprecher

Thorsten Maier Trainer, Berater, Entwickler

© Orientation in Objects GmbH

Resilient Software Design Patterns

2

Resilient Software?

© Orientation in Objects GmbH

Resilient Software Design Patterns

3

Resilient Software?

Widerstandsfähig gegen Fehler

© Orientation in Objects GmbH

Resilient Software Design Patterns

4

Warum?

© Orientation in Objects GmbH

Resilient Software Design Patterns

5

Warum?

… weil jeder Ausfall viel Geld kostet und viele User verärgert

© Orientation in Objects GmbH

Resilient Software Design Patterns

6

Warum?

… weil jeder Ausfall viel Geld kostet und viele User verärgert

© Orientation in Objects GmbH

Resilient Software Design Patterns

7

Was ist daran neu?

© Orientation in Objects GmbH

Resilient Software Design Patterns

8

Was ist daran neu? …mehr User …mehr Daten

…schnellere Anpassungen

© Orientation in Objects GmbH

Resilient Software Design Patterns

9

Wie machen wir eine Software „resilient“?

© Orientation in Objects GmbH

Resilient Software Design Patterns

10

Wie machen wir eine Software „resilient“?

Redundanz

© Orientation in Objects GmbH

Resilient Software Design Patterns

11

Wie machen wir eine Software „resilient“?

Redundanz Isolation

© Orientation in Objects GmbH

Resilient Software Design Patterns

12

Wie machen wir eine Software „resilient“?

Redundanz Isolation Lose Kopplung

© Orientation in Objects GmbH

Resilient Software Design Patterns

13

Wie machen wir eine Software „resilient“?

Redundanz Isolation Lose Kopplung Fallback © Orientation in Objects GmbH

Resilient Software Design Patterns

14

Wie machen wir eine Software „resilient“?

Redundanz Isolation Lose Kopplung Fallback © Orientation in Objects GmbH

Resilient Software Design Patterns

15

ISOLATION

© Orientation in Objects GmbH

Resilient Software Design Patterns

16

© Orientation in Objects GmbH

Resilient Software Design Patterns

17

© Orientation in Objects GmbH

Resilient Software Design Patterns

18

BULKHEADS © Orientation in Objects GmbH

Resilient Software Design Patterns

19

Bulkheads im Kleinen:

Methodenaufrufe

© Orientation in Objects GmbH

Resilient Software Design Patterns

20

public int fakultaet(int n) { return (n == 0) ? 1 : n * fakultaet(n - 1); }

Mögliche Probleme? © Orientation in Objects GmbH

Resilient Software Design Patterns

21

public int fakultaet(int n) { if (n < 0) { throw new IllegalArgumentException(); } return (n == 0) ? 1 : n * fakultaet(n - 1); }

Schon besser… © Orientation in Objects GmbH

Resilient Software Design Patterns

22

Validierung der Aufrufparameter Datentypen korrekt? Wertebereiche eingehalten? Vorbedingungen erfüllt? != null Kreditkartennummer valide …

„Freundliche“ Rückgabewerte Niemals „null“ zurückliefern Datenmengen beschränken …

© Orientation in Objects GmbH

Resilient Software Design Patterns

23

Bulkheads im Großen:

Software-Bausteine

© Orientation in Objects GmbH

Resilient Software Design Patterns

24

3 Bausteine

© Orientation in Objects GmbH

Resilient Software Design Patterns

25

Anwendung mit 3 Bausteinen

© Orientation in Objects GmbH

Resilient Software Design Patterns

26

Anwendung mit 3 Bausteinen

Deployment auf einem Server

© Orientation in Objects GmbH

Resilient Software Design Patterns

27

Anwendung mit 3 Bausteinen

Baustein © Orientation in Objects GmbH

wird 4 mal benötigt Resilient Software Design Patterns

28

Anwendung mit 3 Bausteinen

Nachteile wird nur 2 mal benötigt Änderung an erfordert Reploy von

Baustein © Orientation in Objects GmbH

wird 4 mal benötigt Resilient Software Design Patterns

29

Anwendung mit 3 Bausteinen

Baustein © Orientation in Objects GmbH

Unabhängige Artefakte

wird 4 mal benötigt Resilient Software Design Patterns

30

Anwendung mit 3 Bausteinen

Baustein © Orientation in Objects GmbH

wird 4 mal benötigt

Unabhängige Artefakte

Flexible Skalierung auf 3 Server Resilient Software Design Patterns

31

Vorteile

Unabhängige Artefakte

Isolierte Entwicklung Isolierte Fehler Isoliertes Deployment …

Flexible Skalierung auf 3 Server © Orientation in Objects GmbH

Resilient Software Design Patterns

32

Nachteil

Unabhängige Artefakte

Kommunikation über Prozess- und Netzwerkgrenzen  Verteilte Datenverarbeitung

Flexible Skalierung auf 3 Server © Orientation in Objects GmbH

Resilient Software Design Patterns

33

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 © Orientation in Objects GmbH

Resilient Software Design Patterns

34

In Kürze:

Zuverlässigkeit und Konsistenz existieren nicht mehr

© Orientation in Objects GmbH

Resilient Software Design Patterns

35

Verhalten und Standorte der Komponenten unseres Systems verändern sich ständig

© Orientation in Objects GmbH

Resilient Software Design Patterns

36

Komponenten liefern unzuverlässige Daten oder verschwinden völlig

© Orientation in Objects GmbH

Resilient Software Design Patterns

37

Ok, wir brauchen ISOLATION

Aber wie kommen die Teile wieder zusammen?

© Orientation in Objects GmbH

Resilient Software Design Patterns

38

LOSE KOPPLUNG

© Orientation in Objects GmbH

Resilient Software Design Patterns

39

LOSE KOPPLUNG synchron © Orientation in Objects GmbH

asynchron Resilient Software Design Patterns

40

? Startet gerade

nicht erreichbar

Mit wem kann / soll ich kommunizieren? © Orientation in Objects GmbH

Resilient Software Design Patterns

41

? Startet gerade

nicht erreichbar

Als

© Orientation in Objects GmbH

Architekt lassen sich alle Probleme mit „Boxes and Lines“ lösen  Resilient Software Design Patterns

42

2. Dienst finden

3. Dienst nutzen

Verzeichnisdienst 1. registrieren

© Orientation in Objects GmbH

Resilient Software Design Patterns

43

2. Dienst finden

3. Dienst nutzen

Verzeichnisdienst 1. registrieren

Als

© Orientation in Objects GmbH

Entwickler brauchen wir etwas mehr Resilient Software Design Patterns

44

2. Dienst finden

3. Dienst nutzen

Eureka 1. registrieren

@SpringBootApplication @EnableEurekaServer public class Application { public static void main(String[] args) { // ... } } © Orientation in Objects GmbH

Resilient Software Design Patterns

45

Security? © Orientation in Objects GmbH

Resilient Software Design Patterns

46

Security! © Orientation in Objects GmbH

Resilient Software Design Patterns

47

„Soll ich mich etwa 2x einloggen?“

© Orientation in Objects GmbH

Resilient Software Design Patterns

48

„Meine Session wird geteilt “

External Session Store

© Orientation in Objects GmbH

Resilient Software Design Patterns

49

Netter Nebeneffekt:

Anwendung wird zustandslos!

External Session Store

© Orientation in Objects GmbH

Resilient Software Design Patterns

50

@EnableRedisHttpSession public class SpringSessionConfig { @Bean public JedisConnectionFactory connectionFactory() { return new JedisConnectionFactory(); } }

Redis

© Orientation in Objects GmbH

Resilient Software Design Patterns

51

Problem:

Doppelte Implementierung

Redis

© Orientation in Objects GmbH

Resilient Software Design Patterns

52

External Session Store

Security

API Gateway

© Orientation in Objects GmbH

Resilient Software Design Patterns

53

External Session Store

Security

Zuul @EnableZuulProxy @EnableDiscoveryClient @SpringBootApplication public class ZuulProxy { public static void main(String[] args) { SpringApplication.run(ZuulProxy.class, args); } } © Orientation in Objects GmbH

Resilient Software Design Patterns

54

LOSE KOPPLUNG synchron © Orientation in Objects GmbH

asynchron Resilient Software Design Patterns

55

Asynchrone Kommunikation Entkoppelt Sender und Empfänger Verhindert Fehlerketten Sender muss nicht warten

Sender

© Orientation in Objects GmbH

Message Queue

Resilient Software Design Patterns

Empfänger

56

„Starbucks Does Not Use Two-Phase Commit” Kunde

Kassierer

Ausgabe

Becherwarteschlange

Barista

http://www.enterpriseintegrationpatterns.com/ramblings/18_starbucks.html © Orientation in Objects GmbH

Resilient Software Design Patterns

57

JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class); jmsTemplate.convertAndSend("coffeeOrderQueue", new CoffeeOrder("Thorsten", "Cappuccino"));

Kassierer

coffeeOrderQueue

Barista

@Component public class Barista { @JmsListener(destination = "coffeeOrderQueue") public void receiveMessage(CoffeeOrder coffeeOrder) { System.out.println("Received "); } }

© Orientation in Objects GmbH

Resilient Software Design Patterns

58

Weiche zeitliche Anforderungen

Strict Consistency Eventual Consistency

türschloss = geschlossen

letzte_reise = 523km

(engl. „irgendwann“ nicht „eventuell“)

© Orientation in Objects GmbH

Resilient Software Design Patterns

59

Exactly OnceKommunikation notwendig Sender

Empfänger tuerschloss=offen

toggleTuerschloss()

Nicht idempotent © Orientation in Objects GmbH

Resilient Software Design Patterns

60

At Least OnceKommunikation möglich Sender

Empfänger tuerschloss=offen

schliesseTuerschloss()

Idempotent! © Orientation in Objects GmbH

Resilient Software Design Patterns

61

FALLBACK

© Orientation in Objects GmbH

Resilient Software Design Patterns

62

2. Dienst finden

3. Dienst nutzen

Verzeichnisdienst 1. registrieren

zur Erinnerung © Orientation in Objects GmbH

Resilient Software Design Patterns

63

Instanz fällt kurz NACH der Auswahl aus © Orientation in Objects GmbH

Resilient Software Design Patterns

64

Circuit Breaker

© Orientation in Objects GmbH

Resilient Software Design Patterns

65

Circuit Breaker

© Orientation in Objects GmbH

Resilient Software Design Patterns

66

Circuit Breaker errorCount = 3

© Orientation in Objects GmbH

Resilient Software Design Patterns

67

Hystrix @HystrixCommand(fallbackMethod = "fallback") public String readString() { return remoteServiceCall(); } public String fallback() { return "Fallback result"; }

© Orientation in Objects GmbH

Resilient Software Design Patterns

68

Alternative finden

Hystrix

Eureka registrieren

© Orientation in Objects GmbH

Resilient Software Design Patterns

69

Resilient Software Design

Patterns?! © Orientation in Objects GmbH

Resilient Software Design Patterns

70

Bulkheads

Parameter Checking Microservice Async Communication

Discovery Service

Exactly Once- und At Least OnceLocation Transparency Kommunikation External Session Store Idempotenz Circuit Breaker Eventual Consistency Stateless

API Gateway © Orientation in Objects GmbH

Resilient Software Design Patterns

71

?

?

?

Fragen ?

? Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de [email protected]

? 72

Vielen Dank für Ihre Aufmerksamkeit!

Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de [email protected]