npx skills add ...
npx skills add proyecto26/system-design-skills --skill sequencer
This skill should be used when the user needs a "unique ID generator", "distributed IDs", a "Snowflake ID", asks "UUID vs auto-increment", wants a "time-sortable ID", a "monotonic sequence", a "ticket server", or "ID generation at scale". It gives a menu of ID schemes (UUID/ULID, Snowflake-style, DB ticket/range) with their causality, ordering, and clock-skew trade-offs. Use it whenever a design needs collision-free identifiers across many nodes, even if the user doesn't say "sequencer".
npx skills add proyecto26/system-design-skills --skill sequencer
Hand out identifiers that are unique across every node without a central bottleneck — and decide whether those IDs must also be sortable or monotonic. Getting this wrong shows up late and hard: collisions corrupt data, a single allocator caps write throughput, and IDs that leak a creation time or a sequential count expose business secrets and enable enumeration attacks.
A system writes new records across multiple nodes and each needs a primary key (orders, messages, uploads, events). Reach for this when a single auto-increment column would serialize all writes, when IDs must be generated before a DB round trip (client-side, offline), or when records must be roughly time-ordered without a separate sort field.
A single relational node still comfortably serves the write load (→
back-of-the-envelope) — then a plain BIGINT AUTO_INCREMENT/SERIAL is the
cheapest correct answer; do not build a distributed ID service for it (YAGNI).
If a natural unique key already exists (email, ISBN, content hash), use it. Don't
demand global monotonicity unless an invariant truly needs it — it is the most
expensive property here and usually only per-entity ordering is required.
back-of-the-envelope). Sets the bits needed for a sequence counter.| Option | What it solves | What it worsens | Change it when |
|---|---|---|---|
| Auto-increment / sequence | Trivial, monotonic, compact int | Serializes writes; single node caps throughput; leaks count | Writes outgrow one node, or you need client-side IDs → ticket/Snowflake |
| UUIDv4 (random) | Generate anywhere, no coordination, no leakage | 128-bit; random order kills index locality (page splits); not sortable | You need time-ordering → ULID/UUIDv7 |
| ULID / UUIDv7 | Zero coordination + time-sortable + index-friendly | Still 128-bit; only ms-sortable (not strict); leaks creation time | You need a 64-bit key or strict order → Snowflake / sequence |
| Snowflake-style (64-bit) | Compact, k-sorted, ~4M IDs/node/sec | Needs node-ID assignment + clock-skew handling; epoch/bit budget caps lifespan | Clock sync is unreliable, or you can't assign node IDs → ULID |
| DB ticket / range | Monotonic-ish ints, low coordination, simple | Allocator table is a SPOF; gaps on restart; only loosely ordered across nodes | Allocator becomes a bottleneck or SPOF → Snowflake/ULID |
The whole point of distributed ID schemes is to avoid a single allocator, so the failure modes cluster around coordination shortcuts.
now < last_timestamp (block or error), use a monotonic clock source, and alarm
on skew. Never silently trust wall-clock time.2^seq_bits IDs in one millisecond on
one node overflows the counter. Mitigate: spin-wait to the next ms, or size
the bit budget to peak rate up front.consistency-coordination) instead of static config.data-storage.Monitor: ID issuance rate per node, clock-skew/rewind events, allocator latency and range-exhaustion rate, and duplicate-key errors (should be zero).
back-of-the-envelope).Do
Don't
data-storage).A 64-bit Snowflake layout (≈41 timestamp bits + 10 node + 12 sequence) gives ~69
years from its epoch, 1024 nodes, and 4096 IDs/node/ms ≈ 4M IDs/node/sec —
ample for almost any single service. UUID/ULID are 128 bits = 16 bytes (vs 8 for
a 64-bit int), doubling index key size. A ticket block of N IDs cuts allocator
hits by N× but risks losing up to N IDs on a node restart. For peak-rate and
storage sizing, see back-of-the-envelope; restate only the figure a decision
turns on.
An issued ID is a contract. State its width (64 vs 128 bit), its layout
(e.g. Snowflake [timestamp:41 | node:10 | seq:12]), its ordering guarantee
(unordered / k-sorted by ms / strict), and its encoding (raw int, Base62,
Crockford Base32 — case-insensitive, URL-safe). A generator endpoint, if any, is
minimal: next(entity) -> {id, issued_at}. Document whether the ID is the storage
key, the sort key, or both — that choice is consumed by data-storage.
Default to the generic recipe above. If the user names a cloud, read
references/providers/<provider>.md for the managed-service mapping,
quotas/limits, and provider-specific trade-offs. If no file exists for that
provider, the generic recipe is the answer (most clouds have no dedicated ID
service — you run a library or a sequence yourself).
To visualize the issuance path (generator nodes → 64-bit layout → record key) or
the ticket-server block-allocation flow, use the in-plugin architecture-diagram
skill; an inline [ts | node | seq] sketch is enough for quick bit-budget
reasoning. Do not embed Mermaid.
data-storage — feeds into it: the ID becomes the primary/sort key, and the
sharding/partitioning that a sequential key can hot-spot is owned there.consistency-coordination — depends on it for the causality, ordering, and
leader-election theory behind monotonic guarantees and node-ID leasing; link,
don't re-teach.messaging-streaming — pairs with it for message ordering and dedup, where
time-sortable IDs give a natural sequence and idempotency anchor.api-design — pairs with it: ID generation underpins idempotency keys (owned
there) for safe retries.system-design — owned-concept lives in the orchestrator: the reasoning loop,
the trade-off method, and the ten failure modes.references/deep-dive.md — Snowflake bit-layout math and epoch choice,
clock-skew/monotonic-clock handling, ticket-server range allocation, ULID vs
UUIDv7 byte layout, encoding (Base62/Crockford), and node-ID leasing. Read when
designing the generator in detail.references/providers/{generic,aws,gcp}.md — library/service mappings,
limits, and pitfalls per environment.