TLDR: What is SupersedeServer?
GenServer with mailbox ordered by logical clock.
In Elixir, we often have to code things like %{version: 100} or %{step: 10} to manually check if an async message arrives in the right order. I found a general pattern to make this effortless.
Here is a cool pattern in Erlang/Elixir might eliminate 80% of ordering boilerplate code: a GenServer wrapper called SupersedeServer. Its goal is simple: ensure Actor-Local Correctness by ordering messages via Hybrid Logical Clocks (HLC) or Lamport Clock.
Core Concept:
Instead of standard handle_cast/call, the user implements two callbacks:
-
handle_clocked: Invoked for messages that appear in non-descending order (HLC + PID tie-break). -
handle_supersede: Invoked when a message is “late” (logically older than the current processed state).
How it works:
-
Mailbox Draining: It utilizes a recursive receive loop to batch and sort incoming messages locally before processing.
-
Simple Semantics: “Late means superseded.” There are no watermarks or vector clocks. If it arrives late, it’s handled separately (usually discarded or logged) without rolling back state.
-
Safety: It includes a “Max Offset” check to reject clocks drifting too far into the future and a safety valve to crash if too many superseded messages accumulate (protecting CPU).
This pattern explicitly abandons global causal consistency to focus strictly on ensuring a single actor’s state never logically regresses. Another cool thing is that in BEAM the integer will never overflow which makes it perfect for integer-based logical clocks.
I’d love to hear your thoughts on this approach!






















