# Erlang Load Balancer
[![CircleCI](https://img.shields.io/circleci/project/github/macpie/elb.svg?label=Build)](https://circleci.com/gh/macpie/elb)
[![Hex.pm](https://img.shields.io/hexpm/l/elb.svg?label=License)](https://github.com/macpie/elb/blob/master/LICENSE) /
[![Hex.pm](https://img.shields.io/hexpm/v/elb.svg)](https://hex.pm/packages/elb)
[![Hex.pm](https://img.shields.io/hexpm/dt/elb.svg?label=Downloads)](https://hex.pm/packages/elb) /
[![Website](https://img.shields.io/website-Up-Down-brightgreen-red/http/shields.io.svg?label=EDoc)](https://macpie.github.io/elb/)
Simple message load balancer using round robin style.
## Usage
Start using `elb:start(Options)` or `elb:start_link(Options)`
### Options
```Erlang
[
{'worker', {Module, Function}} % Or {worker, Module}. Default to start_link function
,{'worker_args', []} % Arguments to pass to worker. Default to []
,{'size', 10} % Number of worker to start. Default to 0
,{'restart', true} % Auto restart dead worker. Default to false
]
```
## Examples
### Simple Subscribe
```Erlang
1> l(elb).
{module,elb}
2> {'ok', P} = elb:start_link([{'size', 0}]).
{ok,<0.666.0>}
3> elb:subscribe(P).
ok
4> elb:cast(P, 'test').
ok
5> flush().
Shell got test
ok
```
### Simple Gen Server
```Erlang
{'ok',ELB} = elb:start([
{'worker', {'worker_test', 'start_link'}}
,{'worker_args', []}
,{'size', 10}
,{'restart', 'true'}
]),
'ok' = elb:cast(ELB, "ASYNC Message"),
'ok' = elb:broadcast(ELB, "Broadcast Message to all workers"),
"Sync Message" = elb:call(ELB, "Sync Message"),
```
```Erlang
-module(worker_test).
%% ------------------------------------------------------------------
%% API Function Exports
%% ------------------------------------------------------------------
-export([
start_link/0, start_link/1
]).
%% ------------------------------------------------------------------
%% gen_server Function Exports
%% ------------------------------------------------------------------
-export([
init/1
,handle_call/3
,handle_cast/2
,handle_info/2
,terminate/2
,code_change/3
]).
-define(SERVER, ?MODULE).
-record(state, {}).
%% ------------------------------------------------------------------
%% API Function Definitions
%% ------------------------------------------------------------------
start_link() ->
start_link([]).
start_link(Args) ->
gen_server:start_link(?SERVER, Args, []).
%% ------------------------------------------------------------------
%% gen_server Function Definitions
%% ------------------------------------------------------------------
init(_Args) ->
{'ok', #state{}}.
handle_call(_Msg, _From, State) ->
{'reply', 'ok', State}.
handle_cast(_Msg, State) ->
{'noreply', State}.
handle_info({Message, From}, State) ->
elb:reply(From, Message),
{'noreply', State};
handle_info(_Msg, State) ->
{'noreply', State}.
code_change(_OldVsn, State, _Extra) ->
{'ok', State}.
terminate(_Reason, _State) ->
'ok'.
%% ------------------------------------------------------------------
%% Internal Function Definitions
%% ------------------------------------------------------------------
```
## Build
Built using [Rebar3](http://www.rebar3.org) / Erlang 19.3.
## Test
`rebar3 ct -v`