Scalable ¡consistency ¡for ¡ replicated ¡data ¡
Anne3e ¡Bieniusa ¡
Scalable consistency for replicated data Anne3e Bieniusa - - PowerPoint PPT Presentation
Scalable consistency for replicated data Anne3e Bieniusa Overview Replica:on Scalable consistency Limita:ons and Outlook Anne3e Bieniusa - Scalable
Anne3e ¡Bieniusa ¡
¡ Replica:on ¡ ¡ Scalable ¡consistency ¡ ¡ Limita:ons ¡and ¡Outlook ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 2 ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 3 ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 4 ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 5 ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 6 ¡
Update(x, ¡4) ¡
Update(x,6) ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 7 ¡
Update(x, ¡4) ¡ x ¡= ¡4 ¡ x ¡= ¡6 ¡ Update(x,6) ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 8 ¡
Read(x) ¡
Consistency
Adapted.from.Doug.Terry:.Cloud.Storage.Consistency.Explained.Through.Baseball..Dagstuhl.2013C02
Strong.Consistency See.all.previous.writes.
.. .
Bounded.Staleness See.all.“old”.writes.
.. . .
See.increasing.subset.of.writes.
. .. . .. .
Read.My.Writes See.all.writes.performed.by.reader.
. . .
Consistent.Prefix See.iniNal.sequence.of.writes.
. .. . .. .
Eventual.Consistency See.subset.of.previous.writes.
.. . .. .
Performance Availability
9 ¡
Consensus ¡∩ ¡Determinis:c ¡∩ ¡Asynchronous ¡∩ ¡Faults ¡= ¡∅ ¡
¡
Strongly-‑consistent ¡∩ !Available ¡∩ ¡Par::on-‑tolerant != !∅ ¡ ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 10 ¡
– Transport ¡to ¡other ¡replicas ¡and ¡apply ¡
receive ¡all ¡updates ¡ – But: ¡Order ¡of ¡updates ¡may ¡differ! ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 11 ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 12 ¡
x ¡= ¡1 ¡ x ¡= ¡3 ¡ x ¡= ¡0 ¡ x ¡= ¡0 ¡ x ¡= ¡0 ¡ ??? ¡ ??? ¡ ??? ¡
– ¡“conflict-‑free ¡by ¡design” ¡ – No ¡user ¡interac:on ¡required ¡
– Seman:cs ¡of ¡concurrent ¡updates ¡based ¡on ¡abstract ¡data ¡type ¡
set(x,3) ¡ set(x,1) ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡
x ¡= ¡3[12] ¡ x ¡= ¡0 ¡ x ¡= ¡0 ¡ x ¡= ¡0 ¡ x ¡= ¡1[45] ¡ x ¡= ¡1[45] ¡
set(x,1); ¡t=45 ¡
x ¡= ¡3[12] ¡ x ¡= ¡1 ¡[45] ¡
set(x,3); ¡t=12 ¡ (x,3); ¡t=12 ¡ (x,3); ¡t=12 ¡ (x,1); ¡t=45 ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡
x ¡= ¡3 ¡ x ¡= ¡0 ¡ x ¡= ¡0 ¡ x ¡= ¡0 ¡ x ¡= ¡{1,3} ¡ x ¡= ¡{1,3} ¡
set(x,1) ¡
x ¡= ¡3 ¡ x ¡= ¡1 ¡
set(x,3) ¡ set(x,3) ¡ set(x,3) ¡ set(x,1) ¡ set(x,1) ¡
x ¡= ¡1 ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡
x ¡= ¡3 ¡ x ¡= ¡0 ¡ x ¡= ¡0 ¡ x ¡= ¡0 ¡ x ¡= ¡4 ¡ x ¡= ¡4 ¡
Re-‑execute ¡opera:on ¡
– Idempotence ¡ – Commuta:vity ¡ – Meta-‑data ¡to ¡track ¡causality ¡
incrBy(x,1) ¡
x ¡= ¡3 ¡ x ¡= ¡1 ¡
incrBy(x,3) ¡ incrBy(x,3) ¡ incrBy(x,3) ¡ incrBy(x,1) ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡
update: ¡post ¡ She’s ¡coming! ¡ u:post ¡ Great! ¡ update: ¡post ¡ Let ¡me ¡call ¡her ¡ read ¡ read ¡ read ¡ update: ¡post ¡ Jen ¡skips ¡the ¡party ¡ update: ¡post ¡ Jen ¡skips ¡the ¡party ¡ update: ¡post ¡ She’s ¡coming! ¡ update: ¡post ¡ Let ¡me ¡call ¡her ¡ u:post ¡ Great! ¡ update: ¡post ¡ Jen ¡skips ¡the ¡party ¡ update: ¡post ¡ Jen ¡skips ¡the ¡party ¡ update: ¡post ¡ She’s ¡coming! ¡ update: ¡post ¡ Let ¡me ¡call ¡her ¡
!?! ¡
update: ¡post ¡ Jen ¡skips ¡the ¡party ¡ update: ¡post ¡ Let ¡me ¡call ¡her ¡ read ¡ update: ¡post ¡ She’s ¡coming! ¡ u:post ¡ Great! ¡ read ¡ u:post ¡ Yay! ¡ u:post ¡ Yay! ¡ read ¡ read ¡ read ¡
16 ¡
+ ¡ + ¡ reads-‑from ¡order ¡ transi:ve ¡closure ¡ client ¡invoca:on ¡order ¡
update: ¡post ¡ Jen ¡skips ¡the ¡party ¡ update: ¡post ¡ Let ¡me ¡call ¡her ¡ read ¡ update: ¡post ¡ She’s ¡coming! ¡ u:post ¡ Great! ¡ read ¡ u:post ¡ Yay! ¡ read ¡ read ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 17 ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 18 ¡
[0,0,0] ¡ [0,0,0] ¡ [0,0,0] ¡ [1,0,0] ¡ [0,0,1] ¡ [1,1,0] ¡ [1,2,0] ¡ [1,2,1] ¡ [1,2,1] ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡
[0,0,3] ¡ [0,0,0] ¡ [0,0,0] ¡ ¡ [0,0,0] ¡ ¡ [1,0,3] ¡ [1,0,3] ¡
incrBy(x,1) ¡
[0,0,3] ¡ [1,0,0] ¡
incrBy(x,3) ¡ incrBy(x,3) ¡ incrBy(x,3) ¡ incrBy(x,1) ¡
[0,0,0] ¡ [1,0,0] ¡ [1,0,1] ¡ [1,0,1] ¡ [0,0,1] ¡ [0,0,0] ¡ [0,0,0] ¡ [0,0,1] ¡
payload ¡integer[n] ¡P ¡ ¡ ¡initial ¡[0, ¡0, ¡..., ¡0] ¡ ¡ ¡ update ¡increment() ¡ ¡ ¡let ¡g ¡= ¡myID() ¡ ¡ ¡P[g] ¡:= ¡P[g] ¡+ ¡1 ¡ ¡ query ¡value() ¡: ¡integer ¡v ¡ ¡ ¡let ¡v ¡= ¡︎∑ ¡P[i] ¡ ¡ ¡ compare ¡(X,Y) ¡: ¡boolean ¡b ¡ ¡ ¡let ¡b ¡= ¡(∀i ¡∈ ¡[0, ¡n−1] ¡: ¡X.P[i] ¡≤ ¡Y.P[i]) ¡ ¡ merge ¡(X,Y) ¡: ¡payload ¡Z ¡ ¡ ¡let ¡∀i ¡∈ ¡[0, ¡n−1] ¡: ¡Z ¡.P ¡[i ¡] ¡= ¡max ¡(X.P[i], ¡Y.P[i]) ¡ ¡ ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 20 ¡
record ¡(’pl, ¡’ua, ¡’qa, ¡’r) ¡ ¡stateBasedType ¡= ¡ ¡ ¡t ¡compare ¡ ¡ ¡ ¡:: ¡” ¡’pl ¡⇒ ¡’pl ¡⇒ ¡bool ¡” ¡ ¡t ¡merge ¡ ¡ ¡:: ¡” ¡’pl ¡⇒ ¡’pl ¡⇒ ¡’pl ¡” ¡ ¡t ¡initial ¡ ¡ ¡:: ¡” ¡’pl ¡” ¡ ¡ ¡t ¡update ¡ ¡ ¡:: ¡” ¡’ua ¡⇒ ¡replicaId ¡⇒ ¡’pl ¡⇒ ¡’pl ¡” ¡ ¡ ¡ ¡ ¡t ¡query ¡ ¡ ¡ ¡ ¡ ¡:: ¡” ¡’qa ¡⇒ ¡’pl ¡⇒ ¡’r ¡” ¡ ¡ ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 21 ¡
add(c) {c} merge({c}) {a, b, c} add(b) {a, b} add(a) {a} merge({a, b}) {a, b, c} replica 1 replica 2 {a} ∅ {b} {c} {a, c} {a, b} {b, c} {a, b, c}
Occasionally ¡send ¡local ¡ state ¡to ¡other ¡replicas ¡ Merge ¡received ¡state ¡by ¡type-‑ specific ¡func:on, ¡e.g. ¡set ¡union ¡
contains(a)|T {a}
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 22 ¡
Designing ¡for ¡conflict-‑freedom ¡
replica j rem(b) {a, b} add(b) {a, b} merge({a, b}) {a, b, b} rem(a) {a, b} add(a) {a} add(b) {a, b} contains(b)|true {a, b, b} merge({a, b}) {a, b, b} merge({a}) {a} contains(a)|false {a, b, b} rem(b) {} ? add(b) {a, b} merge() {b} ? rem(a) {b} ? add(a) {a} add(b) {a, b} contains(b)|true {b} ? merge() {b} ? merge({a}) {a} contains(b)|true {b} ? merge() ?? contains(b)|?? ?? merge() ?? contains(b)|?? ?? replica i
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 23 ¡
{a}.add(a) ¡= ¡{a, ¡a} ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡– ¡adds ¡unique ¡instance ¡of ¡a ¡(unique ¡color) ¡ {a, ¡b}.remove(a) ¡= ¡{a, ¡b} ¡ ¡ ¡ ¡– ¡set ¡hide ¡marker ¡on ¡known ¡instances ¡of ¡a ¡ {a, ¡a}.contains(a) ¡| ¡true ¡ ¡ ¡ ¡ ¡ ¡ ¡– ¡true ¡if ¡any ¡visible ¡instance ¡of ¡a ¡is ¡present ¡ {a, ¡b}.merge({b, ¡c}) ¡= ¡{a, ¡b, ¡c} ¡ ¡ ¡– ¡set ¡union, ¡preserving ¡hide ¡marker ¡ par@al ¡order ¡of ¡semi-‑laDce ¡– ¡set ¡inclusion ¡on ¡elements ¡and ¡markers ¡
Sequen:al ¡specifica:on ¡of ¡Set: ¡ {true} ¡add(e) ¡{e ¡∈ ¡S} ¡ ¡ ¡ ¡ ¡{true} ¡rmv(e) ¡{e ¡∉ ¡S} ¡ Commuta:ve ¡(e ¡≠ ¡f): ¡ {true} ¡ ¡add(e) ¡|| ¡add(e) ¡{e ¡∈ ¡S} ¡ ¡ ¡{true} ¡rmv(e) ¡|| ¡rmv(e) ¡{e ¡∉ ¡S} ¡ ¡ ¡{true} ¡add(e) ¡|| ¡add(f) ¡{e,f ¡∈ ¡S} ¡ ¡ ¡{true} ¡rmv(e) ¡|| ¡rmv(f) ¡{e,f ¡∉ ¡S} ¡ ¡ ¡{true} ¡add(e) ¡|| ¡rmv(f) ¡{e ¡∈ ¡S, ¡f ¡∉ ¡S} ¡ ¡ What ¡about: ¡ ¡ ¡{true} ¡add(e) ¡|| ¡rmv(e) ¡{????} ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 24 ¡
¡ ¡ {add(e) ¡< ¡rmv(e) ¡⇒ ¡e ¡∉ ¡S ¡∧ ¡rmv(e) ¡< ¡add(e) ¡⇒ ¡e∈ ¡S ¡} ¡
¡ ¡{e ¡∈ ¡S} ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 25 ¡
Designing ¡for ¡conflict-‑freedom: ¡add-‑wins ¡set ¡
{a}.add(a) ¡= ¡{a, ¡a} ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡– ¡adds ¡unique ¡instance ¡of ¡a ¡(unique ¡color) ¡ {a, ¡b}.remove(a) ¡= ¡{a, ¡b} ¡ ¡ ¡ ¡– ¡set ¡hide ¡marker ¡on ¡known ¡instances ¡of ¡a ¡ {a, ¡a}.contains(a) ¡| ¡true ¡ ¡ ¡ ¡ ¡ ¡ ¡– ¡true ¡if ¡any ¡visible ¡instance ¡of ¡a ¡is ¡present ¡ {a, ¡b}.merge({b, ¡c}) ¡= ¡{a, ¡b, ¡c} ¡ ¡ ¡– ¡set ¡union, ¡preserving ¡hide ¡marker ¡ par@al ¡order ¡of ¡semi-‑laDce ¡– ¡set ¡inclusion ¡on ¡elements ¡and ¡markers ¡
replica j rem(b) {a, b} add(b) {a, b} merge({a, b}) {a, b, b} rem(a) {a, b} add(a) {a} add(b) {a, b} contains(b)|true {a, b, b} merge({a, b}) {a, b, b} merge({a}) {a} contains(a)|false {a, b, b} rem(b) {} ? add(b) {a, b} merge() {b} ? rem(a) {b} ? add(a) {a} add(b) {a, b} contains(b)|true {b} ? merge() {b} ? merge({a}) {a} contains(b)|true {b} ? merge() ?? contains(b)|?? ? ? merge() ?? contains(b)|?? ?? replica i
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 26 ¡
payload ¡set ¡E, ¡set ¡T ¡ ¡ ¡initial ¡∅, ¡∅ ¡ ¡ query ¡contains ¡(element ¡e) ¡: ¡boolean ¡b ¡ ¡ ¡let ¡b ¡= ¡(∃n ¡: ¡(e, ¡n) ¡∈ ¡E ¡∧ ¡(e, ¡n) ¡∉ ¡T ¡) ¡ ¡ update ¡add ¡(element ¡e) ¡ ¡ ¡let ¡n ¡= ¡unique() ¡ ¡in ¡ ¡E ¡:= ¡E ¡∪{(e, ¡n)} ¡ ¡ update ¡remove ¡(element ¡e) ¡ ¡ ¡let ¡R ¡= ¡{(e,n) ¡: ¡(e,n) ¡∈ ¡E ¡∧ ¡e ¡= ¡e ¡} ¡ ¡in ¡ ¡T ¡:= ¡T ¡∪ ¡R ¡ ¡ compare ¡(A,B) ¡: ¡boolean ¡b ¡ ¡ ¡let ¡b ¡= ¡(A.E ¡⊆ ¡B.E) ¡∧ ¡(A.T ¡⊆ ¡B.T) ¡ ¡ merge ¡(B) ¡ ¡ ¡E ¡:= ¡E ¡∪ ¡B.E ¡ ¡ ¡T ¡:= ¡T ¡∪ ¡B.T ¡ ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 27 ¡
¡
¡If ¡two ¡replicas ¡have ¡seen ¡the ¡same ¡set ¡of ¡updates, ¡ ¡
¡do ¡they ¡have ¡the ¡same ¡state? ¡
¡If ¡a ¡replica ¡has ¡seen ¡a ¡given ¡set ¡of ¡updates, ¡
¡what ¡is ¡the ¡state ¡of ¡the ¡replica? ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 28 ¡
Specifica:on ¡(add-‑wins-‑set): ¡ ¡ “Remove ¡opera@on ¡deletes ¡only ¡elements ¡from ¡the ¡ set ¡that ¡have ¡been ¡observed ¡at ¡the ¡replica ¡issuing ¡the ¡ remove ¡opera@on. ¡ ︎When ¡concurrently ¡adding ¡the ¡element ¡(again), ¡it ¡ will ¡remain ¡in ¡the ¡set.” ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 29 ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 30 ¡
combina:on ¡of ¡parallel ¡and ¡sequen:al ¡opera:ons. ¡ ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 31 ¡
c a d
merge ¡
c a d
merge ¡
?? ¡
b
a; (c||d)
⇒ ¡Not ¡possible ¡to ¡specify ¡merge ¡completely, ¡ when ¡pre-‑condi:ons ¡depend ¡only ¡on ¡visible ¡ state ¡of ¡S1 ¡and ¡S2 ¡ ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 32 ¡
{x / ∈ S1 ∧ x / ∈ S2} S = merge(S1, S2) {x / ∈ S} {x ∈ S1 ∧ x ∈ S2} S = merge(S1, S2) {?}
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 33 ¡
Add ¡more ¡informa:on ¡to ¡precondi:on: ¡
¡ Disadvantages: ¡
¡
{xi ∈ S1 ∧ xi ∈ S2 ∧ xi ∈ S1u2} S = merge(S1, S2) {xi ∈ S} {(xi / ∈ S1 ∨ xi / ∈ S2) ∧ xi ∈ S1u2} S = merge(S1, S2) {xi / ∈ S} {(xi ∈ S1 ∨ xi ∈ S2) ∧ xi / ∈ S1u2} S = merge(S1, S2) {xi ∈ S} {xi / ∈ S1 ∧ xi / ∈ S2 ∧ xi / ∈ S1u2} S = merge(S1, S2) {xi / ∈ S}
¡
implementa:on ¡by ¡recording ¡the ¡events ¡and ¡happens-‑ before ¡rela:on ¡ ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 34 ¡
x 2 S $ ✓ 9ea∈E. op(ea) = add(x) ^ (@er∈E. ea er ^ op(er) = remove(x)) ◆
with ¡the ¡visible ¡update ¡history ¡
holds ¡for ¡ini:al ¡payload ¡and ¡under ¡no ¡events, ¡and ¡is ¡ preserved ¡by ¡updates ¡and ¡merges ¡
– Counter ¡(Increment-‑only ¡Counter, ¡PN-‑Counter ¡) ¡ ¡ – Mul:-‑Value ¡Register ¡ – Sets ¡(Grow-‑only-‑Set, ¡2-‑phase ¡Set, ¡Observed-‑Remove ¡Set ¡ (Simple, ¡op:mized)) ¡
(Assigning ¡the ¡empty ¡set ¡was ¡not ¡an ¡increasing ¡update) ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 35 ¡
(Burckhardt, ¡Gotsman, ¡Yang ¡[TR ¡’13, ¡POPL’14]) ¡ ¡
specifica:on ¡of ¡seman:cs ¡using ¡axioms ¡
value ¡ ¡
simula:ons ¡ ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 36 ¡
Related ¡work: ¡Verifying ¡Eventual ¡Consistency ¡of ¡ Op:mis:c ¡Replica:on ¡Systems ¡ ¡
(Bouajjani, ¡Enea, ¡Hamza ¡[POPL ¡’14]) ¡
interpreta@on) ¡
rollbacks ¡ ¡
convergence ¡eventually ¡(-‑> ¡global ¡interpreta@on) ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 37 ¡
– Reliable ¡causal ¡delivery ¡⇒ ¡Vector ¡clocks ¡ – Concurrent ¡opera:ons ¡commute ¡
¡
add(c) {a, c} add(c) {a, b, c} add(b) {a, b} add(a) {a} add(b) {a, b, c} replica i replica j add(a) {a}
Send ¡update ¡to ¡other ¡replicas ¡ Replay ¡(re-‑execute) ¡every ¡update ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 38 ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 39 ¡
data ¡O(#clients) ¡
never ¡return ¡
a{er ¡consensus ¡
informa:on ¡from ¡transport ¡layer ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 40 ¡
– Requests ¡shouldn’t ¡get ¡lost ¡
– User ¡can ¡exchange ¡(virtual) ¡currency ¡for ¡vouchers, ¡ game ¡items, ¡... ¡ – No ¡money ¡lost! ¡ – No ¡voucher ¡used ¡twice! ¡
transac:ons) ¡ ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 41 ¡
– ︎ ¡ ¡Adver:sement ¡should ¡be ¡displayed ¡a ¡limited ¡ number ¡of ¡:mes ¡to ¡users ¡in ¡a ¡certain ¡area ¡/ ¡ country ¡
requires ¡counters ¡to ¡deal ¡with ¡high ¡conten:on ¡
diverge ¡too ¡much ¡from ¡actual ¡number ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 42 ¡
handling ¡
synchroniza:on ¡
sound ¡“conflict” ¡handling ¡
based ¡update ¡propaga:on ¡
– Counters, ¡Registers, ¡Sets, ¡Maps, ¡Graphs ¡ ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 43 ¡
Anne3e ¡Bieniusa ¡-‑ ¡Scalable ¡Consistency ¡ 44 ¡
Marek ¡Zawirski ¡ ¡Inria ¡& ¡UPMC-‑LIP6 ¡ Nuno ¡Preguiça ¡ ¡U. ¡Nova ¡de ¡Lisboa ¡ Sérgio ¡Duarte ¡ ¡U. ¡Nova ¡de ¡Lisboa ¡ ¡ Valter ¡Balegas ¡ ¡U. ¡Nova ¡de ¡Lisboa ¡ Carlos ¡Baquero ¡U. ¡do ¡Minho ¡& ¡HASLab ¡ Marc ¡Shapiro ¡ ¡Inria ¡& ¡LIP6 ¡ Peter ¡Zeller ¡ ¡TU ¡Kaiserslautern ¡ Chris ¡Meiklejohn ¡Basho ¡ ¡ And ¡probably ¡a ¡few ¡more... ¡