README.md

# Squabble

A simple leader election. Pulled from [ExVenture](https://github.com/oestrich/ex_venture).

**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!

## What is this doing?

Squabble starts once on each node and uses [Raft](https://raft.github.io/) 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.

## Installation

Install via hex.

```elixir
def deps do
  [
    {:libcluster, "~> 3.0"},
    {:squabble, git: "https://github.com/oestrich/squabble.git"},
  ]
end
```

In order to connect multiple nodes you should also set up [libcluster](https://github.com/bitwalker/libcluster).

## Configuration

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.

```elixir
children = [
  {Squabble, [subscriptions: [MyApp.Leader], size: 1]}
]
```

## Leader Notifications

Squabble will a call a module on the node when the leader node is selected. This is a behaviour. See a sample below.

```elixir
defmodule MyApp.Leader do
  @behaviour Squabble.Leader

  @impl true
  def leader_selected(term) do
  end

  @impl true
  def node_down() do
  end
end
```