• Stars
    star
    463
  • Rank 94,661 (Top 2 %)
  • Language
    Elixir
  • License
    MIT License
  • Created over 6 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Use DeltaCrdt to build distributed applications in Elixir

DeltaCrdt

Hex pm CircleCI badge

DeltaCrdt implements a key/value store using concepts from Delta CRDTs, and relies on MerkleMap for efficient synchronization.

There is a (slightly out of date) introductory blog post and the (very much up to date) official documentation on hexdocs.pm is also very good.

The following papers have been used to implement this library:

Usage

Documentation can be found on hexdocs.pm.

Here's a short example to illustrate adding an entry to a map:

# start 2 Delta CRDTs
{:ok, crdt1} = DeltaCrdt.start_link(DeltaCrdt.AWLWWMap)
{:ok, crdt2} = DeltaCrdt.start_link(DeltaCrdt.AWLWWMap)

# make them aware of each other
DeltaCrdt.set_neighbours(crdt1, [crdt2])

# show the initial value
DeltaCrdt.read(crdt1)
%{}

# add a key/value in crdt1
DeltaCrdt.put(crdt1, "CRDT", "is magic!")
DeltaCrdt.put(crdt1, "magic", "is awesome!")

# read it after it has been replicated to crdt2
DeltaCrdt.read(crdt2)
%{"CRDT" => "is magic!", "magic" => "is awesome!"}

# get only a subset of keys
DeltaCrdt.take(crdt2, ["magic"])
%{"magic" => "is awesome!"}

# get one value
DeltaCrdt.get(crdt2, "magic")
"is awesome!"

# Other map-like functions are available, see the documentation for details.

⚠️ Use atoms carefully : Any atom contained in a key or value will be replicated across all nodes, and will never be garbage collected by the BEAM.

Telemetry metrics

DeltaCrdt publishes the metric [:delta_crdt, :sync, :done].

Installation

The package can be installed by adding delta_crdt to your list of dependencies in mix.exs:

def deps do
  [
    {:delta_crdt, "~> 0.6.3"}
  ]
end