# `RpcLoadBalancer.LoadBalancer.SelectionAlgorithm`
[🔗](https://github.com/MikaAK/rpc_load_balancer/blob/main/lib/rpc_load_balancer/load_balancer/selection_algorithm.ex#L1)

Behaviour for load balancer node selection.

# `load_balancer_name`

```elixir
@type load_balancer_name() :: atom() | module()
```

# `choose_from_nodes`

```elixir
@callback choose_from_nodes(load_balancer_name(), [node()], opts :: keyword()) :: node()
```

# `choose_nodes`
*optional* 

```elixir
@callback choose_nodes(load_balancer_name(), [node()], pos_integer(), opts :: keyword()) ::
  [node()]
```

# `init`
*optional* 

```elixir
@callback init(load_balancer_name(), opts :: keyword()) :: :ok
```

# `local?`
*optional* 

```elixir
@callback local?() :: boolean()
```

# `on_node_change`
*optional* 

```elixir
@callback on_node_change(
  load_balancer_name(),
  {:joined | :left, [node()]}
) :: :ok
```

# `release_node`
*optional* 

```elixir
@callback release_node(load_balancer_name(), node()) :: :ok
```

# `choose_from_nodes`

```elixir
@spec choose_from_nodes(module(), load_balancer_name(), [node()], keyword()) :: node()
```

# `choose_nodes`

```elixir
@spec choose_nodes(module(), load_balancer_name(), [node()], pos_integer(), keyword()) ::
  [node()]
```

# `get_algorithm`

```elixir
@spec get_algorithm(load_balancer_name()) ::
  {:ok, module() | nil} | {:error, ErrorMessage.t()}
```

# `init`

```elixir
@spec init(module(), load_balancer_name(), keyword()) :: :ok
```

# `local?`

```elixir
@spec local?(module()) :: boolean()
```

# `on_node_change`

```elixir
@spec on_node_change(module(), load_balancer_name(), {:joined | :left, [node()]}) ::
  :ok
```

# `put_algorithm`

```elixir
@spec put_algorithm(load_balancer_name(), module()) ::
  :ok | {:error, ErrorMessage.t()}
```

# `release_node`

```elixir
@spec release_node(module(), load_balancer_name(), node()) :: :ok
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
