ollien

ollien

Discovering a task supervisor local to my supervision tree

I was writing a GenServer and quickly discovered the need to generate tasks within this GenServer. This GenServer can not have a globally unique name (as I require many instances of it. I decided to keep the current module structure, changing the GenServer to a Supervisor and spawning my original GenServer as a child of this supervisor (with the Supervisor having public functions that call the child GenServer). Ideally, my supervision tree would look something like this

     MyServerSupervisor 
              /\
             /  \
            /    \
   MyGenServer   MyTaskSupervisor

Also, ideally, I would spawn my tasks within MyTaskSupervisor. However, the obvious question arises: how does MyGenServer discover this task supervisor? In other projects, I’ve given this task supervisor a globally unique name, but I can’t do that here.

Looking into the problem, I’ve seen many suggestions to use a Registry, but those require globally unique names. In order to have a registry for my task supervisors, I’d have to spawn the Registry in my root supervisor to ensure all of my processes can find it. It would be a lot nicer if I could somehow register the task supervisor in the context MyServerSupervisor. Is there a way to achieve what I want, or is the closest analog the solution I just described?

Thanks!

First Post!

al2o3cr

al2o3cr

Question about naming:

How do you tell these apart? That’s where a Registry would usually come in handy.

For instance, imagine that each instance can be identified by an Erlang term that we’ll call id. Could be a database ID, could be a UUID, could be an ARN, whatever.

Start a single top-level Registry instance, we’ll name it MyServerRegistry for concreteness.

Then instances of MyServerSupervisor would name themselves like:

{:via, Registry, {MyServerRegistry, id}}

While instances of MyGenServer and MyTaskSupervisor could be named like:

{:via, Registry, {MyServerRegistry, id, :server}}
# vs
{:via, Registry, {MyServerRegistry, id, :task_supervisor}}

Where Next?

Popular in Questions Top

chokchit
** (DBConnection.ConnectionError) connection not available and request was dropped from queue after 2733ms. You can configure how long re...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
johnnyicon
Hi all, I’ve just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I’m trying to use Postgres...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
hariharasudhan94
lets say i have a sample like a = 20; b = 10; if (a > b) do {:ok, "a"} end if (a < b) do {:ok, b} end if (a == b) do {:ok, "equa...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
JDanielMartinez
Hi! May someone helps me, please! I have two apps into an umbrella project: the first one is Database, which manages queries, and the se...
New
dotdotdotPaul
Okay, I’m having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I’m sure I’...
New

Other popular topics Top

malloryerik
Hi, this is for people who, like me, have had some friction using .html.heex templates in VSCode. The solution seems to be, in a hyphena...
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
chrismccord
As promised, the first release candidate of Phoenix 1.3.0 is out! This release focuses on code generators with improved project structure...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
dogweather
I wrote this comment on r/haskell, and it’s not popular there. :wink: But I think I’m on to something… Haskell reminds me of Java, and e...
New

We're in Beta

About us Mission Statement