View Source Getting started
In this guide we will go through the basic usage of ProcessHub and how to integrate
it in your application.
To get more familiar with the public API of ProcessHub, please refer to the ProcessHub module.
Installation
In order to use ProcessHub in your application, you need to add it as a dependency.
Once you have added it as a dependency, you need to start the ProcessHub master supervisor.
It is highly recommended to start the ProcessHub supervisor under your application
supervision tree.
Add
process_hubto your list of dependencies inmix.exs:def deps do [ {:process_hub, "~> 0.4.0-beta"} ] endPull the dependency:
mix deps.getStart the
ProcessHubsupervisor under your application supervision tree:defmodule MyApp.Application do use Application def start(_type, _args) do children = [ ProcessHub.child_spec(%ProcessHub{hub_id: :my_hub}) ] opts = [strategy: :one_for_one, name: MyApp.Supervisor] Supervisor.start_link(children, opts) end end
Hub ID
Each node in the cluster that starts a
ProcessHubinstance and shares the same:hub_idwill form a hub cluster.It is possible to start multiple hubs under the same supervision tree with different configuration options, in this case, each hub must have a unique
:hub_id.
Example usage
The following example shows how to start 2 elixir nodes, connect them and start processes
under the ProcessHub cluster. This demonstrates how the processes are distributed in the cluster.
Note: The examples below assume that the ProcessHub is already started under the
supervision tree. If not please refer to the Installation section.
Note: Make sure you have a GenServer module called MyProcess defined in your project.
defmodule MyProcess do
use GenServer
def start_link(_) do
GenServer.start_link(__MODULE__, nil)
end
def init(_) do
{:ok, nil}
end
endNode 1
Start the first node with the following command:
iex --name node1@127.0.0.1 --cookie mycookie -S mix
# Run the following in the iex console to start 5 processes under the hub.
iex> ProcessHub.start_children(:my_hub, [
...> %{id: :process1, start: {MyProcess, :start_link, [nil]}},
...> %{id: :process2, start: {MyProcess, :start_link, [nil]}},
...> %{id: :process3, start: {MyProcess, :start_link, [nil]}},
...> %{id: :process4, start: {MyProcess, :start_link, [nil]}},
...> %{id: :process5, start: {MyProcess, :start_link, [nil]}}
...> ])
{:ok, :start_initiated}
# Check the started processes by running the command below.
iex> ProcessHub.process_list(:my_hub, :global)
[
process1: ["node1@127.0.0.1": #PID<0.256.0>],
process2: ["node1@127.0.0.1": #PID<0.257.0>],
process3: ["node1@127.0.0.1": #PID<0.258.0>],
process4: ["node1@127.0.0.1": #PID<0.259.0>],
process5: ["node1@127.0.0.1": #PID<0.260.0>]
]Node 2
We will use this node to connect to the first node and see how the processes are automatically distributed.
Start the second node.
iex --name node2@127.0.0.1 --cookie mycookie -S mix
# Connect the second node to the first node.
iex> Node.connect(:"node1@127.0.0.1")
true
# Check the started procsses by running the command below and
# see how some of the processes are distributed to the second node.
iex> ProcessHub.process_list(:my_hub, :global)
[
process4: ["node2@127.0.0.1": #PID<0.285.0>],
process3: ["node2@127.0.0.1": #PID<0.284.0>],
process1: ["node2@127.0.0.1": #PID<0.283.0>],
process2: ["node1@127.0.0.1": #PID<23045.257.0>],
process5: ["node1@127.0.0.1": #PID<23045.260.0>]
]