Elixir Publish/Subscribe
A Publish/Subscribe utility module that frees your business logic processes from the burden of communication.
Getting Started
Add :pubsub as a dependency to your mix.exs file:
defp deps do [ {:pubsub, "~> 1.0"} ] end
Then run mix deps.get in your shell to fetch the dependencies.
Examples
Assuming your client process looks like this:
defmodule Client do def start(client_name) do spawn(fn -> loop(client_name) end) end def loop(name) do receive do message -> IO.puts "#{name} received `#{message}`" loop(name) end end end
With PubSub you can do this:
iex(1)> {topic1, topic2} = {:erlang, :elixir} {:erlang, :elixir} iex(2)> {:ok, pid} = PubSub.start_link() {:ok, #PID<0.99.0>} iex(3)> {pid1, pid2, pid3} = ...(3)> { ...(3)> Client.start("John"), ...(3)> Client.start("Nick"), ...(3)> Client.start("Tim") ...(3)> } {#PID<0.106.0>, #PID<0.107.0>, #PID<0.108.0>} iex(4)> PubSub.subscribe(pid1, topic1) :ok iex(5)> PubSub.subscribe(pid2, topic1) :ok iex(6)> PubSub.subscribe(pid3, topic2) :ok iex(7)> PubSub.publish(topic1, "#{topic1} is great!") "Nick received `erlang is great!`" "John received `erlang is great!`" :ok iex(8)> PubSub.publish(topic2, "#{topic2} is so cool, dude") "Tim received `elixir is so cool, dude`" :ok