Infinitomata (Finitomata v0.40.0)

Copy Markdown View Source

The sibling of Finitomata, but runs transparently in the cluster.

If you want to use a stateful consistent hash ring like libring, implement the behaviour Finitomata.ClusterInfo wrapping calls to it and invoke Finitomata.ClusterInfo.init(Impl) before using Infinitomata.start_fsm/4.

The example of such an implementation for libring (assuming the named ring @ring has been started in the supervision tree) follows.

defmodule MyApp.ClusterInfo do
  @moduledoc false
  @behaviour Finitomata.ClusterInfo

  @impl Finitomata.ClusterInfo
  def nodes(_fini_id), do: HashRing.nodes(@ring) -- [node()]

  @impl Finitomata.ClusterInfo
  def whois(_fini_id, id), do: HashRing.key_to_node(@ring, id)
end

Consistency model

Infinitomata keeps a per-node view of the cluster-wide FSM registry that is eventually consistent. Membership changes are propagated via :pg and reconciled by synch/2, which merges local and remote views (last writer wins per FSM name). A call addressed to an FSM that has not propagated to the local view yet is retried; on a failed remote call the node re-synchronizes and backs off before retrying. Tune the retry behaviour via the :infinitomata_attempts, :infinitomata_poll_interval, :infinitomata_rpc_timeout, :infinitomata_backoff_base, and :infinitomata_backoff_max application config keys.

Summary

Functions

Count of children

Returns the random FSM from the pool

Starts the FSM in the distributed environment. See Finitomata.start_fsm/4 for docs and options

Synchronizes the local Infinitomata instance with the cluster

Functions

count(id \\ nil)

(since 0.16.0)

Count of children

random(id \\ nil)

(since 0.18.0)

Returns the random FSM from the pool

start_fsm(fini_id \\ nil, target, implementation, payload)

(since 0.15.0)

Starts the FSM in the distributed environment. See Finitomata.start_fsm/4 for docs and options

start_link(id \\ nil, nodes \\ Node.list())

(since 0.16.0)

synch(id \\ nil, nodes \\ false)

(since 0.19.0)
@spec synch(Finitomata.id(), [node()] | false) :: :ok

Synchronizes the local Infinitomata instance with the cluster