• Keine Ergebnisse gefunden

Reaktive Programmierung Vorlesung 14 vom 26.06.19 Eventual Consistency

N/A
N/A
Protected

Academic year: 2022

Aktie "Reaktive Programmierung Vorlesung 14 vom 26.06.19 Eventual Consistency"

Copied!
69
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Reaktive Programmierung Vorlesung 14 vom 26.06.19

Eventual Consistency

Christoph Lüth, Martin Ring

Universität Bremen

Sommersemester 2019

(2)

Fahrplan

I Einführung

I Monaden und Monadentransformer I Nebenläufigkeit: Futures and Promises I Aktoren I: Grundlagen

I Aktoren II: Implementation I Meta-Programmierung

I Bidirektionale Programmierung I Reaktive Ströme I

I Reaktive Ströme II

I Funktional-Reaktive Programmierung I Software Transactional Memory I Eventual Consistency

I Robustheit und Entwurfsmuster

(3)

Heute

I Konsistenzeigenschaften

I Eventual Consistency I CRDTs

I Operational Transformation

I Das Geheimnis von Google Docs und co.

(4)

Was ist eigentlich Konsistenz?

I Konsistenz =Widerspruchsfreiheit I In der Logik:

I Eine Formelmenge Γ ist konsistent wenn:∃A.¬(Γ`A) I In einem verteilten System:

I Redundante (verteilte) Daten I GlobaleWiderspruchsfreiheit?

(5)

Strikte Konsistenz

Strikte Konsistenz

I Daten sind zu jedem Zeitpunk global konsistent.

I Eine Leseoperation in einem beliebigen Knoten gibt den Wert der letzten globalen Schreiboperation zurück.

I In echten verteilten Systemennicht implementierbar.

(6)

Sequentielle Konsistenz

Sequentielle Konsistenz

I Zustand nach verteilter Programmausführung = Zustand nach einer äquivalenten sequentiellen Ausführung in einem Prozess.

I Jeder Prozess sieht die selbe Folge von Operationen.

(7)

Eventual Consistency

Eventual Consistency

Wenn längere Zeitkeine Änderungen stattfinden konvergieren die Daten an jedem Knoten zu einem gemeinsamen Wert.

I Beispiel: DNS

(8)

Strong Eventual Consistency

I Eventual Consistency ist eineinformelleAnforderung.

I Abfragen können beliebige Werte zurückgeben bevor die Knoten konvergieren.

I Keine Sicherheit!

I Strong Eventual Consistencygarantiert:

I wenn zwei Knoten diegleiche (ungeordnete) Mengevon Operationen empfangen haben, befinden sie sich imgleichen Zustand.

I Beispiel: Versionskontrollsystemgit

I Wenn jeder Nutzer seine lokalen Änderungen eingecheckt hat, dann haben alle Nutzer die gleiche Sicht auf denhead.

(9)

Monotonie

I Strong Eventual Consistency kann einfach erreicht werden:

I Nach jedem empfangenen Update alle Daten zurücksetzen.

I Für sinnvolle Anwendungen brauchen wir eine weitere Garantie:

Monotonie

Ein verteiltes System ist monoton, wenn der Effekt jeder Operation erhalten bleibt (keine Rollbacks).

(10)

Beispiel: Texteditor

I Szenario: Webinterface mit Texteditor

I Meherere Nutzer können den Text verändern und sollenimmer die neueste Versionsehen.

I Siehe Google Docs, Etherpad und co.

(11)

Naive Methoden

I Ownership

I Vor Änderungen: Lock-Anfrage an Server

I Nur ein Nutzer kann gleichzeitig das Dokument ändern

I Nachteile: Verzögerungen, Änderungen nur mit Netzverbindung

I Three-Way-Merge

I Server führt nebenläufige Änderungen auf Grundlage einesgemeinsamen Ursprungszusammen.

I Requirement:the chickens must stop moving so we can count them

(12)

Conflict-Free Replicated Data Types

I Konfliktfreie replizierte Datentypen I Garantieren

I Strong Eventual Consistency I Monotonie

I Konfliktfreiheit

I Zwei Klassen:

I Zustandsbasierte CRDTs I Operationsbasierte CRDTs

(13)

Zustandsbasierte CRDTs

I Konvergente replizierte Datentypen (CvRDTs)

I Knoten senden ihren gesamten Zustand an andere Knoten.

I Nur bestimmte Operationen auf dem Datentypen erlaubt (update).

I Einekommutative,assoziative,idempotentemerge-Funktion I Funktioniert gut mit Gossiping-Protokollen

I Nachrichtenverlust unkritisch

(14)

CvRDT: Zähler

I Einfacher CvRDT

I Zustand:PN, Datentyp:N query(P) =P

update(P,+,m) =P+m merge(P1,P2) =max(P1,P2)

I Wert kann nur größer werden.

(15)

CvRDT: PN-Zähler

I Gängiges Konzept bei CRDTs: Komposition

I Aus zwei Zählern kann ein komplexerer Typzusammengesetzt werden:

I Zähler P (Positive) und Zähler N (Negative) I Zustand: (P,N)N×N, Datentyp:Z

query((P,N)) =query(P)query(N) update((P,N),+,m) = (update(P,+,m),N) update((P,N),−,m) = (P,update(N,+,m))

merge((P1,N1),(P2,N2)) = (merge(P1,P2),merge(N1,N2))

(16)

CvRDT: Mengen

I Ein weiterer einfacher CRDT:

I Zustand:P∈ P(A), Datentyp:P(A) query(P) =P

update(P,+,a) =P∪ {a}

merge(P1,P2) =P1P2

I Die Menge kann nur wachsen.

(17)

CvRDT: Zwei-Phasen-Mengen

I Durch Komposition kann wieder ein komplexerer Typ entstehen.

I Menge P (Hinzugefügte Elemente) und Menge N (Gelöschte Elemente)

I Zustand: (P,N)∈ P(A)× P(A), Datentyp: P(A) query((P,N)) =query(P)\query(N)

update((P,N),+,m) = (update(P,+,m),N) update((P,N),−,m) = (P,update(N,+,m))

merge((P1,N1),(P2,N2)) = (merge(P1,P2),merge(N1,N2))

(18)

Operationsbasierte CRDTs

I Kommutative replizierte Datentypen (CmRDTs) I Knoten senden nurOperationen an andere Knoten

I update unterscheidete zwischen lokalem und externem Effekt.

I Netzwerkprotokoll wichtig

I Nachrichtenverlust führt zu Inkonsistenzen I Keinmerge nötig

I Kann die übertragenenDatenmengenerheblichreduzieren

(19)

CmRDT: Zähler

I Zustand:P ∈N, Typ: N

I query(P) =P I update(+,n)

I lokal:P:=P+n I extern:P:=P+n

(20)

CmRDT: Last-Writer-Wins-Register

I Zustand: (x,t)X ×timestamp

I query((x,t)) =x I update(=,x0)

I lokal: (x,t) := (x0,now())

I extern:if t<t0 then (x,t) := (x0,t0)

(21)

Vektor-Uhren

I Im LWW Register benötigen wir Timestamps I Kausalität muss erhalten bleiben

I Timestamps müssen eine total Ordnung haben

I Datum und Uhrzeit ungeeignet I Lösung: Vektor-Uhren

I Jeder Knoten hat einen Zähler, der bei Operationen hochgesetzt wird I Zusätzlich merkt sich jeder Knoten den aktuellsten Zählerwert, den er bei

den anderen Knoten beobachtet hat.

(22)

Operational Transformation

I Die CRDTs die wir bis jetzt kennengelernt haben sind recht einfach

I Das Texteditor Beispiel ist damit noch nicht umsetzbar

I Kommutative Operationen auf einer Sequenz von Buchstaben?

I Einfügen möglich (totale Ordnung durch Vektoruhren) I Wie Löschen?

(23)

Operational Transformation

I Idee: Nicht-kommutative Operationen transformieren

D f -

D0 g0

-

f0 -

g -

I Fürtransform muss gelten:

transform f g =hf0,g0i=⇒g0f =f0g (1) applyOp (g◦f)D =applyOp g (applyOp f D) (2)

(24)

Operationen für Text

Operationen bestehen aus drei Arten von Aktionen:

I Retain— Buchstaben beibehalten I Delete— Buchstaben löschen I Insert c — Buchstabenc einfügen

Eine Operationist eine Sequenz von Aktionen

Ein Beispiel: Eingabe: Ausgabe: Aktionen:

(25)

Operationen für Text

Operationen bestehen aus drei Arten von Aktionen:

I Retain— Buchstaben beibehalten I Delete— Buchstaben löschen I Insert c — Buchstabenc einfügen

Eine Operationist eine Sequenz von Aktionen

Ein Beispiel:

Eingabe: R 1 P 7 Ausgabe:

Aktionen:

(26)

Operationen für Text

Operationen bestehen aus drei Arten von Aktionen:

I Retain— Buchstaben beibehalten I Delete— Buchstaben löschen I Insert c — Buchstabenc einfügen

Eine Operationist eine Sequenz von Aktionen

Ein Beispiel:

Eingabe: 1 P 7 Ausgabe: R Aktionen: Retain,

(27)

Operationen für Text

Operationen bestehen aus drei Arten von Aktionen:

I Retain— Buchstaben beibehalten I Delete— Buchstaben löschen I Insert c — Buchstabenc einfügen

Eine Operationist eine Sequenz von Aktionen

Ein Beispiel:

Eingabe: P 7 Ausgabe: R Aktionen: Retain,

Delete,

(28)

Operationen für Text

Operationen bestehen aus drei Arten von Aktionen:

I Retain— Buchstaben beibehalten I Delete— Buchstaben löschen I Insert c — Buchstabenc einfügen

Eine Operationist eine Sequenz von Aktionen

Ein Beispiel:

Eingabe: 7 Ausgabe: R P Aktionen: Retain,

Delete, Retain,

(29)

Operationen für Text

Operationen bestehen aus drei Arten von Aktionen:

I Retain— Buchstaben beibehalten I Delete— Buchstaben löschen I Insert c — Buchstabenc einfügen

Eine Operationist eine Sequenz von Aktionen

Ein Beispiel:

Eingabe: 7 Ausgabe: R P 1 Aktionen: Retain,

Delete, Retain, Insert 1,

(30)

Operationen für Text

Operationen bestehen aus drei Arten von Aktionen:

I Retain— Buchstaben beibehalten I Delete— Buchstaben löschen I Insert c — Buchstabenc einfügen

Eine Operationist eine Sequenz von Aktionen

Ein Beispiel:

Eingabe:

Ausgabe: R P 1 7 Aktionen: Retain, Delete, Retain, Insert 1, Retain.

(31)

Operationen für Text

Operationen bestehen aus drei Arten von Aktionen:

I Retain— Buchstaben beibehalten I Delete— Buchstaben löschen I Insert c — Buchstabenc einfügen

Eine Operationist eine Sequenz von Aktionen

Ein Beispiel:

Eingabe:

Ausgabe: R P 1 7 Aktionen: Retain, Delete, Retain, Insert 1, Retain.

I Operationen sindpartiell.

(32)

Operationen Komponieren

I Komposition: Fallunterscheidung auf derAktion I Keine einfache Konkatenation!

I Beispiel:

p = [Delete,Insert X,Retain]

q = [Retain,InsertY,Delete]

compose p q = I compose ist partiell.

I Äquivalenzvon Operationen:

compose p q ∼= [Delete,Delete,InsertX,InsertY]

(33)

Operationen Komponieren

I Komposition: Fallunterscheidung auf derAktion I Keine einfache Konkatenation!

I Beispiel:

p = [InsertX,Retain]

q = [Retain,InsertY,Delete]

compose p q = [Delete, I compose ist partiell.

I Äquivalenzvon Operationen:

compose p q ∼= [Delete,Delete,InsertX,InsertY]

(34)

Operationen Komponieren

I Komposition: Fallunterscheidung auf derAktion I Keine einfache Konkatenation!

I Beispiel:

p = [Retain]

q = [InsertY,Delete]

compose p q = [Delete,Insert X, I compose ist partiell.

I Äquivalenzvon Operationen:

compose p q ∼= [Delete,Delete,InsertX,InsertY]

(35)

Operationen Komponieren

I Komposition: Fallunterscheidung auf derAktion I Keine einfache Konkatenation!

I Beispiel:

p = [Retain]

q = [Delete]

compose p q = [Delete,Insert X,InsertY, I compose ist partiell.

I Äquivalenzvon Operationen:

compose p q ∼= [Delete,Delete,InsertX,InsertY]

(36)

Operationen Komponieren

I Komposition: Fallunterscheidung auf derAktion I Keine einfache Konkatenation!

I Beispiel:

p = []

q = []

compose p q = [Delete,Insert X,InsertY,Delete]

I compose ist partiell.

I Äquivalenzvon Operationen:

compose p q ∼= [Delete,Delete,InsertX,InsertY]

(37)

Operationen Transformieren

I Transformation •

a -

b0

-

a0 -

b -

I Beispiel:

a = [Insert X,Retain,Delete]

b = [Delete,Retain,Insert Y]

transform a b = ([

,[ )

(38)

Operationen Transformieren

I Transformation •

a -

b0

-

a0 -

b -

I Beispiel:

a = [Retain,Delete]

b = [Delete,Retain,Insert Y]

transform a b = ([InsertX, ,[Retain, )

(39)

Operationen Transformieren

I Transformation •

a -

b0

-

a0 -

b -

I Beispiel:

a = [Delete]

b = [Retain,Insert Y]

transform a b = ([InsertX,Delete, ,[Retain,

)

(40)

Operationen Transformieren

I Transformation •

a -

b0

-

a0 -

b -

I Beispiel:

a = []

b = [Insert Y]

transform a b = ([InsertX,Delete, ,[Retain,Delete, )

(41)

Operationen Transformieren

I Transformation •

a -

b0

-

a0 -

b -

I Beispiel:

a = []

b = []

transform a b = ([InsertX,Delete,Retain ,[Retain,Delete,InsertY )

(42)

Operationen Transformieren

I Transformation •

a -

b0

-

a0 -

b -

I Beispiel:

a = []

b = []

transform a b = ([InsertX,Delete,Retain]

,[Retain,Delete,InsertY]

)

(43)

Operationen Transformieren

I Transformation •

a -

b0

-

a0 -

b -

I Beispiel:

a = [Insert X,Retain,Delete]

b = [Delete,Retain,Insert Y]

transform a b = ([InsertX,Delete,Retain]

,[Retain,Delete,InsertY]

)

(44)

Operationen Verteilen

I Wir haben die Funktiontransform die zwei nicht-kommutativen Operationena undb zu kommutierenden Gegenstückena0 und b0 transformiert.

I Was machen wir jetzt damit?

I Kontrollalgorithmus nötig

(45)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen Client A

Server r0 c1

- r1 c2

- r2 c3

- r3

Client B

(46)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen

Client A •

Server r0 c1

- r1 a

6

c2

- r2 c3

- r3

Client B •

b

?

(47)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen

Client A •

c20 -

Server r0 c1

- r1 a

6

c2

- r2 a0 6

c3

- r3

Client B •

b

?

(48)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen

Client A •

c20 -

c30 -

Server r0 c1

- r1 a

6

c2

- r2 a0 6

c3

- r3 a00 6

Client B •

b

?

(49)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen

Client A •

c20 -

c30 -

Server r0 c1

- r1 a

6

c2

- r2 a0 6

c3

- r3 a00 6

c4=a00 - r4

====

====

===

Client B •

b

?

(50)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen

Client A •

c20 -

c30 -

Server r0 c1

- r1 a

6

c2

- r2 a0 6

c3

- r3 a00 6

c4=a00 - r4

====

====

===

Client B •

b

?

c300-b0

?

(51)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen

Client A •

c20 -

c30 -

Server r0 c1

- r1 a

6

c2

- r2 a0 6

c3

- r3 a00 6

c4=a00 - r4

====

====

===

Client B •

b

?

c300-b0

?

c40 -b00

?

(52)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen

Client A •

c20 -

c30 -

Server r0 c1

- r1 a

6

c2

- r2 a0 6

c3

- r3 a00 6

c4=a00

- r4 c5=b00 -

====

====

===

r5

Client B •

b

?

c300-b0

?

c40 -b00

?==========

(53)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen

Client A

Server r0 c1

- r1 c2

- r2 c3

- r3

Client B

(54)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen

Client A •

Server r0 c1

- r1 a

6

c2

- r2 c3

- r3

Client B •

b

?

(55)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen

Client A •

Server r0 c1

- r1 a

6

c2

- r2 c3

- r3

Client B •

b

?

c300-b0

?

(56)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen

Client A •

Server r0 c1

- r1 a

6

c2

- r2 c3

- r3 c4=b0 - r4

Client B •

b

?

c300-b0

?==========

(57)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen

Client A •

c20 -

Server r0 c1

- r1 a

6

c2

- r2 a0 6

c3

- r3 c4=b0 - r4

Client B •

b

?

c300-b0

?==========

(58)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen

Client A •

c20 -

c30 -

Server r0 c1

- r1 a

6

c2

- r2 a0 6

c3

- r3 a00 6

c4=b0 - r4

Client B •

b

?

c300-b0

?==========

(59)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen

Client A •

c20 -

c30 -

c40 -

Server r0 c1

- r1 a

6

c2

- r2 a0 6

c3

- r3 a00 6

c4=b0 - r4

a000 6

Client B •

b

?

c300-b0

?==========

(60)

Der Server

I Zweck:

I Nebenläufige Operationen sequentialisieren I Transformierte Operationen verteilen

Client A •

c20 -

c30 -

c40 -

Server r0 c1

- r1 a

6

c2

- r2 a0 6

c3

- r3 a00 6

c4=b0 - r4

a000 6

c5 =a000 - r5

====

====

===

Client B •

b

?

c300-b0

?==========

(61)

Der Client

I Zweck: Operationen Puffern während eine Bestätigung aussteht

a

- • Revisionr

(62)

Der Client

I Zweck: Operationen Puffern während eine Bestätigung aussteht

a

- • Revision r

c

? Revision r+ 1

(63)

Der Client

I Zweck: Operationen Puffern während eine Bestätigung aussteht

a

- • Revision r

c

?

a0 -c0

? Revision r+ 1

(64)

Der Client

I Zweck: Operationen Puffern während eine Bestätigung aussteht

a

- • Revisionr

(65)

Der Client

I Zweck: Operationen Puffern während eine Bestätigung aussteht

a

-b

- • Revisionr

(66)

Der Client

I Zweck: Operationen Puffern während eine Bestätigung aussteht

a

-b

- • Revision r

c

? Revision r+ 1

(67)

Der Client

I Zweck: Operationen Puffern während eine Bestätigung aussteht

a

-b

- • Revision r

c

?

a0 -c0

? Revision r+ 1

(68)

Der Client

I Zweck: Operationen Puffern während eine Bestätigung aussteht

a

-b

- • Revision r

c

?

a0 -c0

?

b0 -c00

? Revision r+ 1

(69)

Zusammenfassung

I Strikte Konsistenz in verteilten Systemen nicht erreichbar I Strong Eventual Consistency

I Wennlängere Zeitkeine Änderungen stattgefunden haben befinden sich schließlich alle Knoten imgleichen Zustand.

I Wenn zwei Knoten diegleiche MengeUpdates beobachten befinden sie sich imgleichen Zustand.

I Conflict-Free replicated Data Types:

I Zustandsbasiert: CvRDTs I Operationsbasiert: CmRDTs I Operational Transformation

I Strong Eventual Consistency auch ohne kommutative Operationen

Referenzen

ÄHNLICHE DOKUMENTE

Und wenn ich das tue, möchte ich auch nicht Toleranz in Anspruch nehmen müssen - Toleranz würde ja nur bedeuten, dass ich zwar schon was und womöglich begründet dagegen habe,

I Dynamische Tests führen das Programm unter kontrollierten Bedingungen aus, und prüfen das Ergebnis gegen eine gegebene Spezifikation. I Zentrale Frage: wo kommen die

I Systeme sind eingebettet, nebenläufig, reagieren auf ihre Umwelt.... Warum

I Aber: zentrales Konzept sind unendliche Listen (Ströme) mit nicht-strikte Auswertung. I Implementation mit Scala-Listen

[r]

I Dynamische Tests führen das Programm unter kontrollierten Bedingungen aus, und prüfen das Ergebnis gegen eine gegebene Spezifikation. I Zentrale Frage: wo kommen die

I Systeme sind eingebettet, nebenläufig, reagieren auf ihre Umwelt.... Warum

I Aber: zentrales Konzept sind unendliche Listen (Ströme) mit nicht-strikte Auswertung. I Implementation mit Scala-Listen