Structure to track online devices

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:

{
  online: {boolean},
  active: {boolean},
  activated_at: {timestamp},
  expiring_at: {timestamp},
  device_uid: {uuid}
}

What this data will be used for?

For now a simple dashboard showing all devices that are known and showing their current state.

Check out 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.

1 Like

For me it is less about including Phoenix, it is decoupling using Phoenix.Presence from Phoenix.Channels. Are Channels necessary for Presence usage?

Not at all.