aaronrenner
Best practices for connecting Supervisor's child processes to each other
I am trying to figure out if there’s an established best practice for connecting child processes within the same supervisor without using name registration.
I have the following processes
PortCacheStateServerWebServer- requires aPortCacheandStateServerfor startup
I am using a rest_for_one supervision strategy and trying to create a supervision tree like this.
I’m curious what the best way is to give WebServer a way to send messages to PortCache and WebServer without using name registration.
Here is what I currently have:
defmodule MyApp.Supervisor do
def start_link(_init_opt) do
# Start the supervisor with no children
with {:ok, sup} <- Supervisor.start_link([], strategy: :rest_for_one) do
{:ok, port_cache} = Supervisor.start_child(sup, PortCache)
{:ok, state_server} = Supervisor.start_child(sup, StateServer)
{:ok, _web_server} =
Supervisor.start_child(sup, {
WebServer,
port_cache: port_cache,
state_server: state_server
})
{:ok, sup}
end
end
end
I know generally we pass a list of children to a supervisor, but then we don’t have a way to reference the other process’s pids. Are there drawbacks to this approach or a better way of doing this?
Most Liked
kokolegorille
I would do something similar, but not with WebServer, with an additional GenServer used to start others processes, and keeping pid in his state.
I guess I am a little bit influenced by how poolboy does this.
rcavanaugh
Maybe overkill but what about Registry? Start a registry named MyApp.Supervisor.Registry in your MyApp.Supervisor before anything else and then each supervised process can register itself in init and dispatch calls via the registry.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance










