I have a set of IoT devices reporting their current status to MQTT when online. Rather than storing the status, which can update frequently, in a database, I wanted something ephemeral like a GenServer.
My question though is how should I structure the GenServer? It seems naive to have every single device report it’s state to a single GenServer instance. On the other end, it seems like overkill to have a GenServer for every device (thousands of devices).
If it helps, the data is rather simple from each device:
What this data will be used for?
For now a simple dashboard showing all devices that are known and showing their current state.
Phoenix.Presence. You can also use ETS table.
That has been recommended to me in the past, but the documentation ties it to the concept of Phoenix Channels (and thus Topics / Rooms). I do not quite understand how to decouple those two things so that I have something I can query from outside a room/topic/channel.
Does that make sense?
Also the question about how to structure that stands here as well. Do I have a single Presence tracker for all thousand+ devices?
This is a little bit of the problem with Phoenix libraries that some of them IMHO needlessly use
Phoenix in their name. Documentation of
Phoenix.Presence points to the
Phoenix.Tracker in case if you need only tracking, without rest of the Phoenix (I do not know why they resigned from name
firenest for this, this would probably provide less confusion).
Yes. You should have single Presence/Tracker for all of your devices.
For me it is less about including Phoenix, it is decoupling using Phoenix.Presence from Phoenix.Channels. Are Channels necessary for Presence usage?