https://github.com/oestrich/squabble
Simple leader election for Elixir applications
https://github.com/oestrich/squabble
elixir
Last synced: 7 months ago
JSON representation
Simple leader election for Elixir applications
- Host: GitHub
- URL: https://github.com/oestrich/squabble
- Owner: oestrich
- License: mit
- Created: 2018-08-28T01:47:34.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2021-09-16T13:31:08.000Z (over 4 years ago)
- Last Synced: 2025-06-22T03:05:48.952Z (7 months ago)
- Topics: elixir
- Language: Elixir
- Size: 21.5 KB
- Stars: 77
- Watchers: 2
- Forks: 5
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# 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, "~> 0.1.0"},
]
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
```