/agentex

Elixir distributed agent implementation on top of Mnesia

Primary LanguageElixir

Agentex

Elixir distributed agent implementation on top of Mnesia

Installation

In mix.exs:

def deps do
  [
    ...
    {:agentex, "~> 0.1"}
  ]
end

def application do
    [
      ...
      applications: [
        ...
        :agentex
      ]
end

Preparation

Schema

$ iex --cookie agentex -S mix run.distributed
  Erlang/OTP 19 [erts-8.3] [...]

Interactive Elixir (1.5.0-dev) - [...]
iex(primary@127.0.0.1)1> nodes = [Node.self | Node.list]                
iex(primary@127.0.0.1)2> Amnesia.stop
:stopped
iex(primary@127.0.0.1)3> :rpc.multicall(nodes, Amnesia, :stop, [])
{[:stopped, :stopped, :stopped, :stopped, :stopped], []}
iex(primary@127.0.0.1)4> Amnesia.Schema.destroy
:ok
iex(primary@127.0.0.1)5> Amnesia.Schema.create(nodes)
:ok

Usage

Agentex.put :pi, 3.14
Agentex.get :pi
#⇒ 3.14
Agentex.put :credentials, %{user: "john", pass: "*********"}
Agentex.get :credentials
#⇒ %{user: "john", pass: "*********"}

Distributed usage

config.exs

config :agentex, :nodes, ~w|n1@127.0.0.1 n2@127.0.0.1|a

Make sure, the Agentex application with the same config is starting on all the nodes listed. The first node would be considered “master” node. It will be used to produce schema and re-create tables on each subsequent application restart.

By default, the only database Agentex.Simple with the single table Agentex.Simple.Kv of type key ⇒ value is being created, though one might specify their own database, containing as many tables as needed.

In the latter case, to distinguish Agentex.{get,put} calls between different tables, the table module atom should be specified as the very first parameter:

Agentex.put Agentex.Db.Math, :pi, 3.14
Agentex.get Agentex.Db.Math, :pi
#⇒ 3.14

Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/agentex.