项目作者: arjan

项目描述 :
Global, supervised singleton processes for Elixir
高级语言: Elixir
项目地址: git://github.com/arjan/singleton.git
创建时间: 2016-10-30T04:03:47Z
项目社区:https://github.com/arjan/singleton

开源协议:MIT License

下载


Singleton

Build Status
Module Version
Hex Docs
Total Download
License
Last Updated

Convenience wrapper library around Erlang’s global module to ensure
a single instance of a process is kept running on a cluster of nodes.

Installation

The package can be installed as:

  1. Add singleton to your list of dependencies in mix.exs:
  1. def deps do
  2. [{:singleton, "~> 1.0"}]
  3. end
  1. Ensure Singleton.Supervisor is added to your application’s supervision tree:

If your application includes a supervision tree in application.ex, you can simply add Singleton.Supervisor to the list of children.

  1. children = [
  2. # ...,
  3. {Singleton.Supervisor, name: MyApp.Singleton}
  4. ]
  5. supervisor = Supervisor.start_link(children, opts)

Usage

Use Singleton.start_child/4 to start a unique GenServer process.

  1. Singleton.start_child(MyApp.Singleton, MyServer, [1], {:myserver, 1})

Execute this command on all nodes. The MyServer GenServer is now
globally registered under the name {:global, {:myserver, 1}}.

As soon as you connect nodes together, you’ll see logger messages
like:

  1. 04:56:29.003 [info] global: Name conflict terminating {MyServer, #PID<12501.68.0>}

When you now stop (or disconnect) the node on which the singleton
process runs, you’ll see it get started on one of the other nodes.

Troubleshooting

More than 3 singleton processes [info] Application singleton exited: shutdown

In case you run more than 3 singleton you’ll need to increase the
max_restarts of DynamicSupervisor.

  1. config :singleton,
  2. dynamic_supervisor: [max_restarts: 100]

or add max_restarts to your singleton supervisor spec:

  1. {Singleton.Supervisor, name: MyApp.Singleton, max_restarts: 100}