A simple leader election. Pulled from ExVenture.
Warning: This has currently only been tested on low traffic production. It works, but may not stand up to your production. I'd love to get it there though!
Squabble starts once on each node and uses Raft leadership election amongst all of the nodes. When a leader is selected, callback modules are called on that you supply. This lets you kick off a process once in your cluster anytime cluster state changes.
This is used in ExVenture to boot the virtual world, for instance.
Two callbacks are currently provided as seen below, when a new leader is selected and also when a node goes down. ExVenture uses both of these to rebalace the world across the still running cluster.
Install via hex.
def deps do
[
{:libcluster, "~> 3.0"},
{:squabble, "~> 0.1.0"},
]
end
In order to connect multiple nodes you should also set up libcluster.
Configure Squabble when you start the worker in your supervision tree. This should go after libcluster
if you're using that. All nodes should be connected before starting Squabble.
children = [
{Squabble, [subscriptions: [MyApp.Leader], size: 1]}
]
Squabble will a call a module on the node when the leader node is selected. This is a behaviour. See a sample below.
defmodule MyApp.Leader do
@behaviour Squabble.Leader
@impl true
def leader_selected(term) do
end
@impl true
def node_down() do
end
end