CRDTs in Python
Heavily inspired by Meangirls
All sets support add, remove, merge, clone, to_dict, to_list, to_json
methods and a from_dict
class method.
Following examples use a hypothetical set up of 3 replicas which receive requests to add or remove an element and a cache layer that merges the results from all the replicas before returning a read response.
>>> import crdt
# Replica A
>>> a = crdt.TwoPhaseSet() # or crdt.LWWSet() or crdt.ORSet()
# Replica B
>>> b = crdt.TwoPhaseSet() # or crdt.LWWSet() or crdt.ORSet()
# Replica C
>>> c = crdt.TwoPhaseSet() # or crdt.LWWSet() or crdt.ORSet()
>>> a.add('foo')
>>> b.add('bar')
>>> c.remove('foo') # TwoPhaseSet will raise an exception here
# Cache layer that merges all replicas before returning the read response.
# To do this over the wire:
# 1) to_json() to serialize
# 2) json.loads() to deserialize
# 3) and from_dict() to instantiate object again
>>> d = a.clone()
>>> d.merge(b)
>>> d.merge(c)
>>> d.to_list()
['foo', 'bar'] # if d is TwoPhaseSet
['bar'] # if d is LWWSet
['foo', 'bar'] # if d is ORSet
$ python -m unittest discover -s tests -p '*_test.py'
- The paper that introduced CRDTs and the morning paper entry on it
- Readings in conflict-free replicated data types should cover pretty much everything else in terms of theory.
- If you prefer watching talks like me:
- Consistency without consensus in production systems by Peter Bourgon is the talk that got me excited about CRDTs because of their practical applications.
- CRDTs Illustrated by Arnout Engelen also acts as a good companion to the paper.
- In Practical Demystification of CRDT, Dmitry Ivanov & Nami Naserazad discuss pros & cons of a few of the CRDTs and some practical implementation issues.
- Other CRDT projects: