Dispatch

Identity (TypeID)

How Dispatch uses type-safe, prefix-qualified identifiers for every entity.

Every entity in Dispatch has a TypeID. TypeIDs are globally unique, K-sortable, URL-safe identifiers built on UUIDv7 with a human-readable prefix that tells you what kind of entity you're looking at.

A TypeID looks like this:

job_01h2xcejqtf2nbrexx3vqjhp41
wfrun_01h455vb4pex5vsknk084sn02q

The prefix identifies the entity type. The suffix is a base32-encoded UUIDv7 that encodes creation time, so IDs sort chronologically.

Compile-time safety

Dispatch uses separate typed aliases for each entity. Passing a CronID where a JobID is expected is a compile error:

var cronID id.CronID = id.NewCronID()
var jobID  id.JobID  = cronID  // compile error: cannot use CronID as JobID

The id package

The id package wraps go.jetify.com/typeid with typed aliases for each entity.

Creating IDs

import "github.com/xraph/dispatch/id"

jobID  := id.NewJobID()   // job_01h455vb...
runID  := id.NewRunID()   // wfrun_01h455vb...
cronID := id.NewCronID()  // cron_01h455vb...
dlqID  := id.NewDLQID()   // dlq_01h455vb...

Parsing IDs

jobID, err  := id.ParseJobID("job_01h455vb4pex5vsknk084sn02q")
runID, err  := id.ParseRunID("wfrun_01h455vb4pex5vsknk084sn02q")
cronID, err := id.ParseCronID("cron_01h455vb4pex5vsknk084sn02q")

// Accept any valid prefix (when type is dynamic):
anyID, err := id.ParseAny("wkr_01h455vb4pex5vsknk084sn02q")

Parsing rejects IDs with the wrong prefix:

_, err := id.ParseJobID("cron_01h455...")
// err: prefix mismatch

Prefix reference

TypePrefixExample
id.JobIDjobjob_01h2xcejqtf2nbrexx3vqjhp41
id.WorkflowIDwfwf_01h455vb4pex5vsknk084sn02q
id.RunIDwfrunwfrun_01h455vb4pex5vsknk084sn02q
id.CheckpointIDckptckpt_01h455vb4pex5vsknk084sn02q
id.CronIDcroncron_01h455vb4pex5vsknk084sn02q
id.DLQIDdlqdlq_01h455vb4pex5vsknk084sn02q
id.EventIDevtevt_01h455vb4pex5vsknk084sn02q
id.WorkerIDwkrwkr_01h455vb4pex5vsknk084sn02q

On this page