Share
Embed
Coordination-Free Designs for Mobile Gaming
Code Mesh 2015, September 3rd, 2015
Christopher Meiklejohn
November 03, 2015
Transcript
166 slides
-
Coordination-Free Designs for Mobile Gaming Christopher Meiklejohn // @cmeik Code
Mesh 2015, September 3rd, 2015 1 -
Synchronization • To enforce an order Makes programming easier •
Eliminate accidental nondeterminism Prevent race conditions 6 -
Synchronization • To enforce an order Makes programming easier •
Eliminate accidental nondeterminism Prevent race conditions • Techniques Locks, mutexes, semaphores, monitors, etc. 6 -
Difficult Cases • “Internet of Things” Low power, limited memory
and connectivity 7 -
Difficult Cases • “Internet of Things” Low power, limited memory
and connectivity • Mobile Gaming Offline operation with replicated, shared state 7 -
Zero Synchronization • We want to have our cake and
eat it too. 8 -
Zero Synchronization • We want to have our cake and
eat it too. • “Zero synchronization” as a starting point Add synchronization only where it is necessary 8 -
Zero Synchronization • We want to have our cake and
eat it too. • “Zero synchronization” as a starting point Add synchronization only where it is necessary • Explore the limits Can we design a model of computation where it’s easy to write coordination-free computations that are free from concurrency anomalies? 8 -
Distributed Computation • Distributed to concurrent programming Consistency and now
partial failure • Enforcing the “single system” illusion 10 -
Distributed Computation • Distributed to concurrent programming Consistency and now
partial failure • Enforcing the “single system” illusion • Consistency model as a contract 10 -
Distributed Computation • Distributed to concurrent programming Consistency and now
partial failure • Enforcing the “single system” illusion • Consistency model as a contract • Enforced through synchronization 10 -
Distributed Computation • Distributed to concurrent programming Consistency and now
partial failure • Enforcing the “single system” illusion • Consistency model as a contract • Enforced through synchronization • Consistency model We can think of a consistency model as analogous to a programming paradigm 10 -
The Avatars of Time • The problem of time Handling
physical time in applications is difficult 12 -
The Avatars of Time • The problem of time Handling
physical time in applications is difficult • Time has three major avatars in computing 12 -
The Avatars of Time • The problem of time Handling
physical time in applications is difficult • Time has three major avatars in computing • Mutable state in sequential systems 12 -
The Avatars of Time • The problem of time Handling
physical time in applications is difficult • Time has three major avatars in computing • Mutable state in sequential systems • Nondeterminism in concurrent systems 12 -
The Avatars of Time • The problem of time Handling
physical time in applications is difficult • Time has three major avatars in computing • Mutable state in sequential systems • Nondeterminism in concurrent systems ̣ Network latency in distributed systems 12 -
The Avatars of Time • The problem of time Handling
physical time in applications is difficult • Time has three major avatars in computing • Mutable state in sequential systems • Nondeterminism in concurrent systems ̣ Network latency in distributed systems • Unavoidable Time is how users interact with programs 12 -
Parable of the Car • “Car driving on a highway”
• Friction needed for the car to grip the road 13 -
Parable of the Car • “Car driving on a highway”
• Friction needed for the car to grip the road • Motors want as little friction as possible 13 -
Parable of the Car • “Car driving on a highway”
• Friction needed for the car to grip the road • Motors want as little friction as possible • Time is like friction We can not completely eliminate friction, but aim to reduce it as much as possible 13 -
Physical Time (real world) Parable of the Car 14 •
Time only at the interface The interface is a small part of the system, and this is where we introduction friction -
Physical Time (real world) Parable of the Car 14 •
Time only at the interface The interface is a small part of the system, and this is where we introduction friction • Physical time-free execution Internally, avoid synchronization as much as possible and virtualize notion of time -
Weak Synchronization • Can we achieve anything without synchronization? Not
really. • Strong Eventual Consistency (SEC) “Replicas that deliver the same updates have equivalent state” 16 -
Weak Synchronization • Can we achieve anything without synchronization? Not
really. • Strong Eventual Consistency (SEC) “Replicas that deliver the same updates have equivalent state” • Primary requirement Eventual replica-to-replica communication 16 -
Weak Synchronization • Can we achieve anything without synchronization? Not
really. • Strong Eventual Consistency (SEC) “Replicas that deliver the same updates have equivalent state” • Primary requirement Eventual replica-to-replica communication • Order insensitive! (Commutativity) 16 -
Weak Synchronization • Can we achieve anything without synchronization? Not
really. • Strong Eventual Consistency (SEC) “Replicas that deliver the same updates have equivalent state” • Primary requirement Eventual replica-to-replica communication • Order insensitive! (Commutativity) • Duplicate insensitive! (Idempotent) 16 -
RA RB 1 3 2 3 3 set(1) set(2) set(3)
max(2,3) max(2,3) -
Programming SEC 1. Eliminate accidental nondeterminism (ex. deterministic, modeling non-monotonic
operations monotonically) 22 -
Programming SEC 1. Eliminate accidental nondeterminism (ex. deterministic, modeling non-monotonic
operations monotonically) 2. Retain the properties of functional programming (ex. confluence, referential transparency over composition) 22 -
Programming SEC 1. Eliminate accidental nondeterminism (ex. deterministic, modeling non-monotonic
operations monotonically) 2. Retain the properties of functional programming (ex. confluence, referential transparency over composition) 3. Distributed, and fault-tolerant runtime (ex. replication) 22 -
Programming SEC 1. Eliminate accidental nondeterminism (ex. deterministic, modeling non-monotonic
operations monotonically) 2. Retain the properties of functional programming (ex. confluence, referential transparency over composition) 3. Distributed, and fault-tolerant runtime (ex. replication) 23 -
Conflict-Free Replicated Data Types • Many types exist with
different properties Sets, counters, registers, flags, maps, graphs 25 -
Conflict-Free Replicated Data Types • Many types exist with
different properties Sets, counters, registers, flags, maps, graphs • Strong Eventual Consistency Instances satisfy SEC property per-object 25 -
RA RB RC {1} (1, {a}, {}) add(1) {1} (1,
{c}, {}) add(1) -
RA RB RC {1} (1, {a}, {}) add(1) {1} (1,
{c}, {}) add(1) {} (1, {c}, {c}) remove(1) -
RA RB RC {1} (1, {a}, {}) add(1) {1} (1,
{c}, {}) add(1) {} (1, {c}, {c}) remove(1) {1} {1} {1} (1, {a, c}, {c}) (1, {a, c}, {c}) (1, {a, c}, {c}) -
Programming SEC 1. Eliminate accidental nondeterminism (ex. deterministic, modeling non-monotonic
operations monotonically) 2. Retain the properties of functional programming (ex. confluence, referential transparency over composition) 3. Distributed, and fault-tolerant runtime (ex. replication) 31 -
Lattice Processing (Lasp) • Distributed, deterministic dataflow Distributed, deterministic dataflow
programming model for “eventually consistent” computations 33 -
Lattice Processing (Lasp) • Distributed, deterministic dataflow Distributed, deterministic dataflow
programming model for “eventually consistent” computations • Convergent data structures Primary data abstraction is the CRDT 33 -
Lattice Processing (Lasp) • Distributed, deterministic dataflow Distributed, deterministic dataflow
programming model for “eventually consistent” computations • Convergent data structures Primary data abstraction is the CRDT • Enables composition Provides functional composition of CRDTs that preserves the SEC property 33 -
34 %% Create initial set. S1 = declare(set), %% Add
elements to initial set and update. update(S1, {add, [1,2,3]}), %% Create second set. S2 = declare(set), %% Apply map operation between S1 and S2. map(S1, fun(X) -> X * 2 end, S2). -
35 %% Create initial set. S1 = declare(set), %% Add
elements to initial set and update. update(S1, {add, [1,2,3]}), %% Create second set. S2 = declare(set), %% Apply map operation between S1 and S2. map(S1, fun(X) -> X * 2 end, S2). -
36 %% Create initial set. S1 = declare(set), %% Add
elements to initial set and update. update(S1, {add, [1,2,3]}), %% Create second set. S2 = declare(set), %% Apply map operation between S1 and S2. map(S1, fun(X) -> X * 2 end, S2). -
37 %% Create initial set. S1 = declare(set), %% Add
elements to initial set and update. update(S1, {add, [1,2,3]}), %% Create second set. S2 = declare(set), %% Apply map operation between S1 and S2. map(S1, fun(X) -> X * 2 end, S2). -
38 %% Create initial set. S1 = declare(set), %% Add
elements to initial set and update. update(S1, {add, [1,2,3]}), %% Create second set. S2 = declare(set), %% Apply map operation between S1 and S2. map(S1, fun(X) -> X * 2 end, S2). -
Lattice Processing (Lasp) • Functional and set-theoretic operations on sets
Product, intersection, union, filter, map, fold 39 -
Lattice Processing (Lasp) • Functional and set-theoretic operations on sets
Product, intersection, union, filter, map, fold • Metadata computation Performs transformation on the internal metadata of CRDTs allowing creation of “composed” CRDTs 39 -
Lasp Processes • Replicas as monotonic streams Each replica of
a CRDT produces a monotonic stream of states 40 -
Lasp Processes • Replicas as monotonic streams Each replica of
a CRDT produces a monotonic stream of states • Monotonic processes Read from one or more input replica streams and produce a single output replica stream 40 -
Lasp Processes • Replicas as monotonic streams Each replica of
a CRDT produces a monotonic stream of states • Monotonic processes Read from one or more input replica streams and produce a single output replica stream • Inflationary reads Read operation ensures that we only read inflationary updates to replicas 40 -
RA {} (1, {a}, {}) (1, {a, c}, {}) C1
(1, {a}, {}) {} C2 (1, {c}, {}) {} 44 -
RA {} (1, {a}, {}) (1, {a, c}, {}) (1,
{a, c}, {a}) C1 (1, {a}, {}) {} (1, {a}, {a}) C2 (1, {c}, {}) {} 45 -
RA {} (1, {a}, {}) (1, {a, c}, {}) (1,
{a, c}, {a}) C1 (1, {a}, {}) {} (1, {a}, {a}) C2 (1, {c}, {}) {} (1, {a, c}, {a}) (1, {a, c}, {a}) (1, {a, c}, {a}) 46 -
RA {} (1, {a}, {}) (1, {a, c}, {}) (1,
{a, c}, {a}) C1 (1, {a}, {}) {} (1, {a}, {a}) C2 (1, {c}, {}) {} (1, {a, c}, {a}) (1, {a, c}, {a}) (1, {a, c}, {a}) 47 -
RA {} P1 F(RA) {} strict_read({}) (1, {a}, {}) F((1,
{a}, {})) 52 -
RA {} P1 F(RA) {} strict_read({}) (1, {a}, {}) F((1,
{a}, {})) (2, {a}, {}) 53 -
RA {} P1 F(RA) {} strict_read({}) (1, {a}, {}) F((1,
{a}, {})) (2, {a}, {}) strict_read((1, {a}, {}) (1, {a}, {}) 54 -
RA {} P1 F(RA) {} strict_read({}) (1, {a}, {}) F((1,
{a}, {})) (2, {a}, {}) strict_read((1, {a}, {}) (1, {a}, {}) (1, {a}, {a}) F((1, {a}, {a})) (2, {a}, {a}) strict_read((1, {a}, {a}) (1, {a}, {a}) 55 -
RA {} P1 F(RA) {} strict_read({}) (1, {a}, {}) (1,
{a}, {}) (1, {a}, {a}) F((1, {a}, {a})) (2, {a}, {a}) strict_read((1, {a}, {a}) (1, {a}, {a}) 56 -
Programming SEC 1. Eliminate accidental nondeterminism (ex. deterministic, modeling non-monotonic
operations monotonically) 2. Retain the properties of functional programming (ex. confluence, referential transparency over composition) 3. Distributed, and fault-tolerant runtime (ex. replication) 57 -
Selective Hearing • Epidemic broadcast based runtime system Provide a
runtime system that can scale to large numbers of nodes, that is resilient to failures and provides efficient execution 59 -
Selective Hearing • Epidemic broadcast based runtime system Provide a
runtime system that can scale to large numbers of nodes, that is resilient to failures and provides efficient execution • Well-matched to Lattice Processing (Lasp) 59 -
Selective Hearing • Epidemic broadcast based runtime system Provide a
runtime system that can scale to large numbers of nodes, that is resilient to failures and provides efficient execution • Well-matched to Lattice Processing (Lasp) • Epidemic broadcast mechanisms provide weak ordering but are resilient and efficient 59 -
Selective Hearing • Epidemic broadcast based runtime system Provide a
runtime system that can scale to large numbers of nodes, that is resilient to failures and provides efficient execution • Well-matched to Lattice Processing (Lasp) • Epidemic broadcast mechanisms provide weak ordering but are resilient and efficient • Lasp’s programming model is tolerant to message re-ordering, disconnections, and node failures 59 -
Selective Hearing • Epidemic broadcast based runtime system Provide a
runtime system that can scale to large numbers of nodes, that is resilient to failures and provides efficient execution • Well-matched to Lattice Processing (Lasp) • Epidemic broadcast mechanisms provide weak ordering but are resilient and efficient • Lasp’s programming model is tolerant to message re-ordering, disconnections, and node failures • “Selective Receive” Nodes selectively receive and process messages based on interest 59 -
Programming SEC 1. Eliminate accidental nondeterminism (ex. deterministic, modeling non-monotonic
operations monotonically) 2. Retain the properties of functional programming (ex. confluence, referential transparency over composition) 3. Distributed, and fault-tolerant runtime (ex. replication) 60 -
Leaderboard • Mobile game platform Local leaderboard tracking top-k highest
scored games • Clients will go offline Clients have limited connectivity and the system still needs to make progress while clients are offline 62 -
Client 1 Leaderboard Client 3 Leaderboard Client 2 Leaderboard Lasp
Operation User-Maintained CRDT Lasp-Maintained CRDT 63 -
Leaderboard • Peer-to-peer dissemination Nodes periodically “merge” their state with
a random peer • Complexity in the data type Each node tracks a top-k set of its own games in a bounded set 64 -
65 %% Create a leaderboard datatype. L = declare({top_k, [2]}).
%% Update leaderboard. update({set, Name, Score}, L). -
66 %% Create a leaderboard datatype. L = declare({top_k, [2]}).
%% Update leaderboard. update({set, Name, Score}, L). -
67 %% Create a leaderboard datatype. L = declare({top_k, [2]}).
%% Update leaderboard. update({set, Name, Score}, L). -
What if we want to enhance the behavior? 68 Without
the creation of a new datatype -
Per-User Leaderboard • Enhance existing design Only the top score
for each user at each device 70 -
Per-User Leaderboard • Enhance existing design Only the top score
for each user at each device • Minimize transmitted state Prevent transmission of state that is not necessary to perform the computation 70 -
Per-User Leaderboard • Enhance existing design Only the top score
for each user at each device • Minimize transmitted state Prevent transmission of state that is not necessary to perform the computation • Compose data types Build a per-user leaderboard through the composition of existing types 70 -
Client1 Scores Local Top-K Fold Global Top-K Lasp Operation Input
User-Maintained CRDT Output Lasp-Maintained CRDT Fold Client3 Scores Local Top-K Fold Global Top-K Fold Client2 Scores Local Top-K Fold Global Top-K Fold 71 -
Client1 Scores Local Top-K Fold Global Top-K Fold 72 Client1
Scores Local Top-K Fold Global Top-K Fold Client3 Scores Local Top-K Fold Global Top-K Fold Client2 Scores Local Top-K Fold Global Top-K Fold -
Client1 Scores Local Top-K Fold Global Top-K Fold 73 Client1
Scores Local Top-K Fold Global Top-K Fold Client3 Scores Local Top-K Fold Global Top-K Fold Client2 Scores Local Top-K Fold Global Top-K Fold -
Client1 Scores Local Top-K Fold Global Top-K Fold 74 Client1
Scores Local Top-K Fold Global Top-K Fold Client3 Scores Local Top-K Fold Global Top-K Fold Client2 Scores Local Top-K Fold Global Top-K Fold -
Client1 Scores Local Top-K Fold Global Top-K Fold 75 Client1
Scores Local Top-K Fold Global Top-K Fold Client3 Scores Local Top-K Fold Global Top-K Fold Client2 Scores Local Top-K Fold Global Top-K Fold -
Client1 Scores Local Top-K Fold Global Top-K Fold 76 Client1
Scores Local Top-K Fold Global Top-K Fold Client3 Scores Local Top-K Fold Global Top-K Fold Client2 Scores Local Top-K Fold Global Top-K Fold -
Client1 Scores Local Top-K Fold Global Top-K Fold 77 Client1
Scores Local Top-K Fold Global Top-K Fold Client3 Scores Local Top-K Fold Global Top-K Fold Client2 Scores Local Top-K Fold Global Top-K Fold -
Client1 Scores Local Top-K Fold Global Top-K Lasp Operation Input
User-Maintained CRDT Output Lasp-Maintained CRDT Fold Client3 Scores Local Top-K Fold Global Top-K Fold Client2 Scores Local Top-K Fold Global Top-K Fold 78 Client1 Scores Local Top-K Fold Global Top-K Fold Client3 Scores Local Top-K Fold Global Top-K Fold Client2 Scores Local Top-K Fold Global Top-K Fold -
Per-User Leaderboard • Dynamically scoped variables Variable which take different
values depending on where it is executing 79 -
Per-User Leaderboard • Dynamically scoped variables Variable which take different
values depending on where it is executing • Dynamically scoped fold operation Perform a distributed “reduce” operation that combines the state of a dynamically scoped variables across 79 -
80 %% Create a global leaderboard. G = declare({top_k, [10]}).
%% Create a local leaderboard. L = declare_dynamic({top_k, [10]}). %% Create a set of scores. S = declare_dynamic(set). %% Compute local top-k list. fold(S, fun max_by_name/2, L). %% Compute global top-k list. fold_dynamic(L, fun max_by_name/2, G). -
81 %% Create a global leaderboard. G = declare({top_k, [10]}).
%% Create a local leaderboard. L = declare_dynamic({top_k, [10]}). %% Create a set of scores. S = declare_dynamic(set). %% Compute local top-k list. fold(S, fun max_by_name/2, L). %% Compute global top-k list. fold_dynamic(L, fun max_by_name/2, G). -
82 %% Create a global leaderboard. G = declare({top_k, [10]}).
%% Create a local leaderboard. L = declare_dynamic({top_k, [10]}). %% Create a set of scores. S = declare_dynamic(set). %% Compute local top-k list. fold(S, fun max_by_name/2, L). %% Compute global top-k list. fold_dynamic(L, fun max_by_name/2, G). -
83 %% Create a global leaderboard. G = declare({top_k, [10]}).
%% Create a local leaderboard. L = declare_dynamic({top_k, [10]}). %% Create a set of scores. S = declare_dynamic(set). %% Compute local top-k list. fold(S, fun max_by_name/2, L). %% Compute global top-k list. fold_dynamic(L, fun max_by_name/2, G). -
84 %% Create a global leaderboard. G = declare({top_k, [10]}).
%% Create a local leaderboard. L = declare_dynamic({top_k, [10]}). %% Create a set of scores. S = declare_dynamic(set). %% Compute local top-k list. fold(S, fun max_by_name/2, L). %% Compute global top-k list. fold_dynamic(L, fun max_by_name/2, G). -
85 %% Create a global leaderboard. G = declare({top_k, [10]}).
%% Create a local leaderboard. L = declare_dynamic({top_k, [10]}). %% Create a set of scores. S = declare_dynamic(set). %% Compute local top-k list. fold(S, fun max_by_name/2, L). %% Compute global top-k list. fold_dynamic(L, fun max_by_name/2, G). -
Let’s look at a larger application 86 With visible
non-monotonicity -
Advertisement Counter • Mobile game platform selling advertisement space Advertisements
are paid according to a minimum number of impressions 88 -
Advertisement Counter • Mobile game platform selling advertisement space Advertisements
are paid according to a minimum number of impressions • Clients will go offline Clients have limited connectivity and the system still needs to make progress while clients are offline 88 -
Ads Rovio Ad Counter 1 Rovio Ad Counter 2 Riot
Ad Counter 1 Riot Ad Counter 2 Contracts Ads Contracts Ads With Contracts Riot Ads Rovio Ads Filter Product Read 50,000 Remove Increment Read Union Lasp Operation User-Maintained CRDT Lasp-Maintained CRDT Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Client Side, Single Copy at Client 89 -
Ads Rovio Ad Counter 1 Rovio Ad Counter 2 Riot
Ad Counter 1 Riot Ad Counter 2 Contracts Ads Contracts Riot Ads Rovio Ads Product Read 50,000 Remove Increment Union 90 Ads Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Riot Ad Counter 2 Contracts Ads Contracts Ads With Contracts Riot Ads Rovio Ads Filter Product Read 50,000 Remove Increment Read Union Lasp Operation User-Maintained CRDT Lasp-Maintained CRDT Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Client Side, Single Copy at Client -
Ads Rovio Ad Counter 1 Rovio Ad Counter 2 Riot
Ad Counter 1 Riot Ad Counter 2 Contracts Ads Contracts Ads With Contracts Riot Ads Rovio Ads Filter Product Read 50,000 Remove Increment Read Union Rovio Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 1 Client 91 Ads Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Riot Ad Counter 2 Contracts Ads Contracts Ads With Contracts Riot Ads Rovio Ads Filter Product Read 50,000 Remove Increment Read Union Lasp Operation User-Maintained CRDT Lasp-Maintained CRDT Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Client Side, Single Copy at Client -
Ads ovio Ad ounter 1 ovio Ad ounter 2 iot
Ad ounter 1 iot Ad ounter 2 Contracts Ads Contracts Ads With Contracts Riot Ads Rovio Ads Filter Product Read 50,000 Remove Increment Read Union Rovio Ad Counter 1 Ro C Rovio Ad Counter 1 Ro C Rovio Ad Counter 1 Ro C Rovio Ad Counter 1 Ro C Client Side, Sing 92 Ads Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Riot Ad Counter 2 Contracts Ads Contracts Ads With Contracts Riot Ads Rovio Ads Filter Product Read 50,000 Remove Increment Read Union Lasp Operation User-Maintained CRDT Lasp-Maintained CRDT Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Client Side, Single Copy at Client -
Ads Contracts Ads Contracts Ads With Contracts Riot Ads Rovio
Ads Filter Product move Read Union Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Client Side, Single Copy at Client 93 Ads Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Riot Ad Counter 2 Contracts Ads Contracts Ads With Contracts Riot Ads Rovio Ads Filter Product Read 50,000 Remove Increment Read Union Lasp Operation User-Maintained CRDT Lasp-Maintained CRDT Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Client Side, Single Copy at Client -
Ads Contracts Ads Contracts Ads With Contracts Filter Product Read
Union Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Client Side, Single Copy at Client 94 Ads Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Riot Ad Counter 2 Contracts Ads Contracts Ads With Contracts Riot Ads Rovio Ads Filter Product Read 50,000 Remove Increment Read Union Lasp Operation User-Maintained CRDT Lasp-Maintained CRDT Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Client Side, Single Copy at Client -
Ads Rovio Ad Counter 1 Rovio Ad Counter 2 Riot
Ad Counter 1 Riot Ad Counter 2 Contracts Ads Contracts Ads With Contracts Riot Ads Rovio Ads Filter Product Read 50,000 Remove Increment Read Union Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Client Side, Single Copy at Client 95 Ads Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Riot Ad Counter 2 Contracts Ads Contracts Ads With Contracts Riot Ads Rovio Ads Filter Product Read 50,000 Remove Increment Read Union Lasp Operation User-Maintained CRDT Lasp-Maintained CRDT Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Client Side, Single Copy at Client -
Ads Rovio Ad Counter 1 Rovio Ad Counter 2 Riot
Ad Counter 1 Riot Ad Counter 2 Contracts Ads Contracts Riot Ads Rovio Ads Fil Product Read 50,000 Remove Increment Union 96 Ads Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Riot Ad Counter 2 Contracts Ads Contracts Ads With Contracts Riot Ads Rovio Ads Filter Product Read 50,000 Remove Increment Read Union Lasp Operation User-Maintained CRDT Lasp-Maintained CRDT Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Client Side, Single Copy at Client -
Ads Rovio Ad Counter 1 Rovio Ad Counter 2 Riot
Ad Counter 1 Riot Ad Counter 2 Contracts Ads Contracts Ads With Contracts Riot Ads Rovio Ads Filter Product Read 50,000 Remove Increment Read Union Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Client Side, Single Copy at Client 97 Ads Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Riot Ad Counter 2 Contracts Ads Contracts Ads With Contracts Riot Ads Rovio Ads Filter Product Read 50,000 Remove Increment Read Union Lasp Operation User-Maintained CRDT Lasp-Maintained CRDT Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Rovio Ad Counter 1 Rovio Ad Counter 2 Riot Ad Counter 1 Client Side, Single Copy at Client -
Advertisement Counter • Completely monotonic Disabling advertisements and contracts are
all modeled through monotonic state growth 98 -
Advertisement Counter • Completely monotonic Disabling advertisements and contracts are
all modeled through monotonic state growth • Arbitrary distribution Use of convergent data structures allows computational graph to be arbitrarily distributed 98 -
Advertisement Counter • Completely monotonic Disabling advertisements and contracts are
all modeled through monotonic state growth • Arbitrary distribution Use of convergent data structures allows computational graph to be arbitrarily distributed • Divergence Divergence is a factor of synchronization period 98 -
99 %% Generate a series of contracts. Contracts = declare(set),
%% Generate advertisements. RiotAds = declare(set), RovioAds = declare(set), create_advertisements_and_contracts(RiotAds, Contracts), create_advertisements_and_contracts(RovioAds, Contracts), %% Union ads. Ads = declare(set), union(RovioAds, RiotAds, Ads), %% Compute the product of both ads and contracts. AdsContracts = declare(set), product(Ads, Contracts, AdsContracts), %% Filter items by join on item it. AdsWithContracts = declare(set), FilterFun = fun({#ad{id=Id1}, #contract{id=Id2}}) -> Id1 =:= Id2 end, filter(AdsContracts, FilterFun, AdsWithContracts). -
100 %% Generate a series of contracts. Contracts = declare(set),
%% Generate advertisements. RiotAds = declare(set), RovioAds = declare(set), create_advertisements_and_contracts(RiotAds, Contracts), create_advertisements_and_contracts(RovioAds, Contracts), %% Union ads. Ads = declare(set), union(RovioAds, RiotAds, Ads), %% Compute the product of both ads and contracts. AdsContracts = declare(set), product(Ads, Contracts, AdsContracts), %% Filter items by join on item it. AdsWithContracts = declare(set), FilterFun = fun({#ad{id=Id1}, #contract{id=Id2}}) -> Id1 =:= Id2 end, filter(AdsContracts, FilterFun, AdsWithContracts). -
101 %% Generate a series of contracts. Contracts = declare(set),
%% Generate advertisements. RiotAds = declare(set), RovioAds = declare(set), create_advertisements_and_contracts(RiotAds, Contracts), create_advertisements_and_contracts(RovioAds, Contracts), %% Union ads. Ads = declare(set), union(RovioAds, RiotAds, Ads), %% Compute the product of both ads and contracts. AdsContracts = declare(set), product(Ads, Contracts, AdsContracts), %% Filter items by join on item it. AdsWithContracts = declare(set), FilterFun = fun({#ad{id=Id1}, #contract{id=Id2}}) -> Id1 =:= Id2 end, filter(AdsContracts, FilterFun, AdsWithContracts). -
102 %% Generate a series of contracts. Contracts = declare(set),
%% Generate advertisements. RiotAds = declare(set), RovioAds = declare(set), create_advertisements_and_contracts(RiotAds, Contracts), create_advertisements_and_contracts(RovioAds, Contracts), %% Union ads. Ads = declare(set), union(RovioAds, RiotAds, Ads), %% Compute the product of both ads and contracts. AdsContracts = declare(set), product(Ads, Contracts, AdsContracts), %% Filter items by join on item it. AdsWithContracts = declare(set), FilterFun = fun({#ad{id=Id1}, #contract{id=Id2}}) -> Id1 =:= Id2 end, filter(AdsContracts, FilterFun, AdsWithContracts). -
103 %% Generate a series of contracts. Contracts = declare(set),
%% Generate advertisements. RiotAds = declare(set), RovioAds = declare(set), create_advertisements_and_contracts(RiotAds, Contracts), create_advertisements_and_contracts(RovioAds, Contracts), %% Union ads. Ads = declare(set), union(RovioAds, RiotAds, Ads), %% Compute the product of both ads and contracts. AdsContracts = declare(set), product(Ads, Contracts, AdsContracts), %% Filter items by join on item it. AdsWithContracts = declare(set), FilterFun = fun({#ad{id=Id1}, #contract{id=Id2}}) -> Id1 =:= Id2 end, filter(AdsContracts, FilterFun, AdsWithContracts). -
104 %% Generate a series of contracts. Contracts = declare(set),
%% Generate advertisements. RiotAds = declare(set), RovioAds = declare(set), create_advertisements_and_contracts(RiotAds, Contracts), create_advertisements_and_contracts(RovioAds, Contracts), %% Union ads. Ads = declare(set), union(RovioAds, RiotAds, Ads), %% Compute the product of both ads and contracts. AdsContracts = declare(set), product(Ads, Contracts, AdsContracts), %% Filter items by join on item it. AdsWithContracts = declare(set), FilterFun = fun({#ad{id=Id1}, #contract{id=Id2}}) -> Id1 =:= Id2 end, filter(AdsContracts, FilterFun, AdsWithContracts). -
Client3 Lasp Operation User-Maintained CRDT Lasp-Maintained CRDT Riot Ad Counter
1 Client1 Client2 Rovio Ad Counter 1 Rovio Ad Counter 2 Rovio Ad Counter 1 Rovio Ad Counter 2 Rovio Ad Counter 1 Riot Ad Counter 2 Riot Ad Counter 1 Riot Ad Counter 1 Ads With Contracts Ads With Contracts Ads With Contracts Server Ads With Contracts Server Computation! 105 -
Client3 Lasp Operation User-Maintained CRDT Lasp-Maintained CRDT Riot Ad Counter
1 Client1 Client2 Rovio Ad Counter 1 Rovio Ad Counter 2 Rovio Ad Counter 1 Rovio Ad Counter 2 Rovio Ad Counter 1 Riot Ad Counter 2 Riot Ad Counter 1 Riot Ad Counter 1 Ads With Contracts Ads With Contracts Ads With Contracts Server Ads With Contracts Server Computation! 106 -
Client3 Lasp Operation User-Maintained CRDT Lasp-Maintained CRDT Riot Ad Counter
1 Client1 Client2 Rovio Ad Counter 1 Rovio Ad Counter 2 Rovio Ad Counter 1 Rovio Ad Counter 2 Rovio Ad Counter 1 Riot Ad Counter 2 Riot Ad Counter 1 Riot Ad Counter 1 Ads With Contracts Ads With Contracts Ads With Contracts Server Ads With Contracts Server Computation! 107 -
Advertisement Counter • “Servers” as peers to “clients” Servers are
peers to clients that perform additional computation 108 -
Advertisement Counter • “Servers” as peers to “clients” Servers are
peers to clients that perform additional computation • Any node can disable an advertisement under this model given enough information 108 -
Advertisement Counter • “Servers” as peers to “clients” Servers are
peers to clients that perform additional computation • Any node can disable an advertisement under this model given enough information • “Servers” as trusted nodes Serve as a location for performing “exactly once” side- effects 108 -
Advertisement Counter • “Servers” as peers to “clients” Servers are
peers to clients that perform additional computation • Any node can disable an advertisement under this model given enough information • “Servers” as trusted nodes Serve as a location for performing “exactly once” side- effects • Billing customers must be done at a central point by a trusted node in the system 108 -
We’ve build up from zero synchronization 109 Instead of working
to remove synchronization -
Key Points • Synchronization is expensive Locking and other synchronization
mechanisms limit scalability to the critical section 111 -
Key Points • Synchronization is expensive Locking and other synchronization
mechanisms limit scalability to the critical section • Synchronization is sometimes not possible Mobile and “Internet of Things” applications make synchronization for replicated state impractical 111 -
Key Points • Synchronization is expensive Locking and other synchronization
mechanisms limit scalability to the critical section • Synchronization is sometimes not possible Mobile and “Internet of Things” applications make synchronization for replicated state impractical • Apply synchronization only where required Global invariants, atomic visibility, etc. 111 -
Publications • “Lasp: A Language for Distributed, Coordination-Free Programming”
ACM SIGPLAN PPDP 2015 • “Selective Hearing: An Approach to Distributed, Eventually Consistent Edge Computation” IEEE W-PSDS 2015 • “The Implementation and Use of a Generic Dataflow Behaviour in Erlang” ACM SIGPLAN Erlang Workshop ’15 • “Lasp: A Language for Distributed, Eventually Consistent Computations with CRDTs" PaPoC 2015 • “Declarative, Sliding Window Aggregations for Computations at the Edge" IEEE EdgeCom 2016 113 -
SyncFree is a European research project taking place for 3
years, staring October 2013, and is funded by the European Union, grant agreement n° 609551. 114