fireproofsocks

fireproofsocks

I’m starting to build more complex apps and I’m slowly reaching for the built-in Registry module. I’ve been reading GenServer — Elixir v1.20.2 a lot. I can feel that there is a lot of depth and subtlety to process registration, but I’m just trying to understand some of the basics first.

Conceptually, Registry.lookup/2 and Process.where/1 seem to serve a similar purpose in that theyboth can resolve an atom representing a named process and yield a PID. But they aren’t the same, e.g.

iex(2)> {:ok, _} = Registry.start_link(keys: :unique, name: Registry.ViaTest)
{:ok, #PID<0.112.0>}
iex(3)> Agent.start_link(fn -> 0 end, name: {:via, Registry, {Registry.ViaTest, :agent1}})
{:ok, #PID<0.115.0>}
iex(4)> Process.whereis(:agent1)
nil

Can someone explain to me why these return different results? I infer that :via provides a kind of “namespace” but I would like more clarity. Thanks for any wisdom!

Showing Posts 1 to 2

LostKobrakai

LostKobrakai

Yes. Both are registries, but with different capabilities. OTP by default ships with two types of process registries and elixir ships with another one.

  • OTP - Local registry
    • Supplied with name: value
    • Allows only atoms as keys
    • Uniqueness only per node
  • OTP - :global
    • Supplied with name: {:global, value}
    • value key can be any term
    • Uniqueness for the whole cluster
  • Elixir - Registry
    • Supplied with via tuples name: {:via, mod, value}
    • value can be {registry_name, key} or {registry_name, key, value}
    • Uniqueness only per node (if enabled)
    • Supports process registration without unique keys

There are also various third party registries, which also work with via tuples, but might otherwise come with completely different tradeoffs based on their implementations.

Now Process.whereis only integrates with the first listed option - local registration by atom. GenServer.whereis however works with any registry (built in or via tuples). Registry.lookup (and a lot of the other APIs on the module) exist to support more complex and explicit usage of the registry, especially around the non-unique key usecase, which doesn’t integrate with via tuples.

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

Process.whereis uses the built in, atom based registry that ships with the VM itself. When you give a GenServer (or other OTP process) a name that is a bare atom, the OTP behaviors will use this registry. If you give it a via tuple, it’ll use that other registry.

The difference you get with using the Elixir Registry vs the built in registry is:

  1. Key flexibility: you aren’t limited to atoms.
  2. “namespacing”. Naming with the built in registry can be annoying when you have clusters of processes that you want to be accessible to each other by name, but you need N of those clusters. This also makes testing easier because you can spawn a registry + cluster of processes for each test in parallel.
  3. Other registry features (pubsub, duplicate keys, etc).
— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
New
dillonoconnor
Is there any way to avoid the Hologram compiler running when using iex? It seems like the front-end code could potentially be disregarded...
New
thiagogsr
** (ArgumentError) expected :max_attempts to be a positive integer, got: {:@, [line: 10, column: 19], [{:max_attempts, [line: 10, column:...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews