Slide 1

Slide 1 text

Scala with Cats Case Study: CRDTs https://underscore.io/books/scala-with-cats/

Slide 2

Slide 2 text

CRDTs • Commutative Replicated Data Types • or Conflict-free Replicated Data Types • ݁Ռ੔߹ੑͷ͋Δσʔλߏ଄ • ϞϊΠυ͕ͲͷΑ͏ʹ໾ཱ͔ͭͷྫͱͯ͠CRDTsΛ঺հ

Slide 3

Slide 3 text

Consistency • γεςϜ͕εέʔϧ͢Δͱ୯ҰͷϚγϯΛ௒͑ͯσʔλ Λ؅ཧ͠ͳ͍ͱ͍͚ͳ͘ͳΔ • શͯͷϚγϯ͕ಉ͡σʔλΛ࣋ͭ؀ڥΛ૝ఆ͢Δ • 1ͭͷϚγϯ͕ϢʔβͷύεϫʔυΛߋ৽͢Δͱɺ
 શ୆ͷϚγϯ͕ಉ͡ίϐʔΛ࣋ͭ • શ୆ͷϚγϯ͕ͦΕΛड͚ೖΕͨ͋ͱ
 ͦͷૢ࡞͸׬ྃ͢Δ

Slide 4

Slide 4 text

Eventual Consistency • લϖʔδͷྫͩͱ੔߹ੑ͕อͯΔ͕ɺ1ͭͷૢ࡞ͷͨΊʹશ୆ ͱಉظΛͱΔͷͰϨΠςϯγ͕ѱԽ͢Δ • ωοτϫʔΫো֐ʹΑΔ෼அ΋ൃੜ͢Δ • ੔߹ੑΛอͭͨΊʹ͸ૢ࡞Λڋ൱͢Δ͔͠ͳ͍ • ݁Ռ੔߹ੑͷ͋ΔγεςϜͰ͸֤Ϛγϯ͕Ұ࣌తʹҟͳΔ
 ঢ়ଶΛ࣋ͭࣄΛڐ༰͢Δ • ݁Ռతʹ੔߹ੑ͕औΕΕ͹͍͍ͷͰૢ࡞ʹର͢ΔԠ౴͸
 ૣ͘ͳΔ • ωοτϫʔΫো֐ʹΑΔ෼அ͕ൃੜͯ͠΋ॲཧΛܧଓͰ͖Δ

Slide 5

Slide 5 text

CRDT • ͲͷΑ͏ʹͯ͠ϚγϯؒͰ݁Ռ੔߹ੑΛऔΔͷ͔ʁ • CRDT͕ͻͱͭͷղͱͳΔ • Commutative Replicated Data Types • CRDTͷ࣮૷ͷͻͱͭͱͯ͠G-CounterΛ঺հ͢Δ

Slide 6

Slide 6 text

G-Counters • ෼ࢄΧ΢ϯλͱͯ͠࢖͑Δ • ૿Ճ͢ΔΦϖϨʔγϣϯʹͷΈରԠ͢Δ • webαʔόͷ๚໰ऀͷΧ΢ϯτ౳ʹ࢖͑Δ

Slide 7

Slide 7 text

Simple counters • ୯ʹड͚औͬͨϦΫΤετ਺Λ௨஌ͯ͠଍͠߹ΘͤΔ

Slide 8

Slide 8 text

Simple counters • ௥ՃͰϦΫΤετ͕དྷͨͱ͖ʹΧ΢ϯλͷ஋Λ଍্͠ ͛Δͱ͓͔͘͠ͳΔ • 2୆ͱ΋"6"Λอ͍࣋ͯ͠ͳ͍ͱ͍͚ͳ͍͸ͣ…

Slide 9

Slide 9 text

G-Counters • G-Counter͸֤ϚγϯͷΧ΢ϯλΛ͍࣋ͬͯΔ • ஋ΛΠϯΫϦϝϯτͰ͖Δͷ͸ࣗ෼ͷΧ΢ϯλ͚ͩ • ঢ়ଶߋ৽ͷϝοηʔδ͕དྷͨΒɺͦͷϚγϯͷΧ΢ ϯλͷ࠷େ஋Ͱஔ͖׵͑Δ(Grow only)

Slide 10

Slide 10 text

G-Counters • ͦͷϚγϯͷΧ΢ϯλͷ࠷େ஋Ͱஔ͖׵͑Δ

Slide 11

Slide 11 text

11.2.3 Exercise: GCounter Implementation • G-CounterΛ࣮૷ͯ͠Έ·͠ΐ͏ • counter: Map[String, Int] • key͕machine id, value͕Χ΢ϯτ • increment: GCounter • ࢦఆͨ͠machineͷΧ΢ϯτΛࢦఆͨ͠
 amount͚ͩ଍͢ • merge: GCounter • 2ͭͷGCounterΛϚʔδ͢Δ

Slide 12

Slide 12 text

11.2.3 Exercise: GCounter Implementation • G-CounterΛ࣮૷ͯ͠Έ·͠ΐ͏

Slide 13

Slide 13 text

Additional Exercise: PN-Counter Implementation • PN-CounterΛ࣮૷ͯ͠Έ·͠ΐ͏ • Ҿ͖ࢉ΋Մೳʹͨ͠CRDTs (Positive, Negative)

Slide 14

Slide 14 text

Additional Exercise: PN-Counter Implementation • PN-CounterΛ࣮૷ͯ͠Έ·͠ΐ͏ • Ҿ͖ࢉ΋Մೳʹͨ͠CRDTs

Slide 15

Slide 15 text

Generalisation • ͖͞΄ͲͷG-CounterΛந৅Խ͍ͯ͘͠ • G-Counter͸ • Ճࢉ: ΠϯΫϦϝϯτ͞Εͨ߹ܭ஋Λ࣋ͭ • ࠷େ஋: Ϛʔδ࣌͸࠷େ஋Λ࣋ͭ • ॳظ஋͸ 0 • => ϞϊΠυͰ͋Δ • (a + b) + c == a + (b + c) • 0 + a == a + 0 == a • a max a = a (mergeͷૢ࡞͸ႈ౳ੑ͕͋Δ)

Slide 16

Slide 16 text

Generalisation • ͖͞΄ͲͷG-CounterΛந৅Խ͍ͯ͘͠ • increment: monoid • total: monoid + Մ׵ • merge: monoid + ႈ౳ + Մ׵ • => ༗ք൒ଋͱݴ͏

Slide 17

Slide 17 text

Generalisation • લड़ͷಛ௃ΑΓɺGCounter͸ࣗવ਺ͱಉ༷ͳૢ࡞͕Ͱ ͖Δ΋ͷʹ΋ஔ͖׵͑ΒΕΔ • ࣗવ਺ͷ୅ΘΓʹSet[A]Λ࢖ͬͯGSetͱ͍͏ܕΛ࣮૷ ͢Δ͜ͱ΋Ͱ͖Δ͸ͣ

Slide 18

Slide 18 text

Bounded SemiLattice • ༗ք൒ଋ • https://qiita.com/yasuabe2613/items/ ba2c5136a4e0822b6ba4

Slide 19

Slide 19 text

11.3.2 Exercise: BoundedSemiLattice Instances • IntͱSet༻ͷ༗ք൒ଋΛ࣮૷ͯ͠Έ·͠ΐ͏ • Int͸ࣗવ਺(0ΛؚΉ)͔࣋ͨ͠ͳ͍ͱԾఆͯ͠Α͍

Slide 20

Slide 20 text

11.3.2 Exercise: BoundedSemiLattice Instances • IntͱSet༻ͷ༗ք൒ଋΛ࣮૷ͯ͠Έ·͠ΐ͏ • Int͸ࣗવ਺(0ΛؚΉ)͔࣋ͨ͠ͳ͍ͱԾఆͯ͠Α͍

Slide 21

Slide 21 text

11.3.3 Exercise:Generic G-Counter • MonoidͱBoundedSemiLatticeΛ࢖ͬͯGCounterΛ
 ࣮૷͠·͠ΐ͏ • Monoidͷจ๏Λ࢖ͬͯγϯϓϧʹॻ͖·͠ΐ͏

Slide 22

Slide 22 text

Abstracting G-Counter to a Type Class • TypeClassΛ࢖ͬͯG-CounterΛ͞Βʹந৅Խ͢Δ • Map΋2ͭͷܕύϥϝʔλΛऔΔԿ͔ͳΒΑ͍ͷͰ͸

Slide 23

Slide 23 text

Abstracting a Key Value Store • Map͸KVSʹஔ͖׵͑ΒΕΔ͸ͣ • Mapͩͬͨ෦෼Λந৅Խ͢Δ

Slide 24

Slide 24 text

Abstracting a Key Value Store • Map͸KVSʹஔ͖׵͑ΒΕΔ͸ͣ • σʔλܕͷૢ࡞Λ֦ு͢Δimplicit class

Slide 25

Slide 25 text

Abstracting a Key Value Store • KVS͕ந৅ԽͰ͖ͨ͜ͱͰKVSͷ࢓༷Λຬ͍ͨͯ͠Ε͹ ͲΜͳܕͰ΋G-Counter͕࡞ΕΔΑ͏ʹͳͬͨ

Slide 26

Slide 26 text

Summary • γϯϓϧͳCRDTͰ͋ΔG-CounterΛTypeClassΛ༻͍ͯ Ͳ͏࣮૷͢Δ͔Λࣔͨ͠ • ίʔυͷ࠶ར༻ੑΛߴΊɺΧ΢ϯτ͢Δͱ͍͏ૢ࡞ʹ ͚ͩʹറΒΕͳ͘ͳͬͨ • ଞʹ΋CRDTs͸͍Ζ͍Ζ͋ΔͷͰҎԼΛࢀߟʹ • https://hal.inria.fr/inria-00609399v2/document

Slide 27

Slide 27 text

No content