Rheo.DeadLetter (rheo v1.0.0)

Copy Markdown View Source

Portable dead-letter (DLQ) row for ops inspection.

DLQ = dead-letter queue: a delivery that stopped being retried for a consumer group (after Rheo.reject/3 or exhausted nack attempts). The underlying stream event is unchanged; only that group's delivery is dead-lettered.

Backends may store rejects as delivery-row status flips (ETS/Mongo/Ecto) or as a separate DLQ stream (Redis). This struct is the normalized read shape for Rheo.dead_letters/3.

Fields

FieldTypeMeaning
streamString.t()Stream name
groupString.t()Consumer group that dead-lettered the delivery
event_idString.t()Stable Rheo.Event.id
partitionnon_neg_integer()Partition of the event
sequencenon_neg_integer() | nilSequence when known
reasonterm()Reject/retry reason recorded by the backend
dead_lettered_atDateTime.t() | nilWhen the delivery became dead-lettered
eventRheo.Event.t() | nilEmbedded event when the backend includes it

Example

iex> dl = %Rheo.DeadLetter{
...>   stream: "market-events",
...>   group: "risk",
...>   event_id: "evt_01",
...>   partition: 0,
...>   sequence: 3,
...>   reason: :invalid_schema,
...>   dead_lettered_at: ~U[2026-01-15 12:00:00.000Z],
...>   event: nil
...> }
iex> {dl.group, dl.reason}
{"risk", :invalid_schema}

Summary

Types

t()

One dead-lettered delivery for ops listing.

Types

t()

@type t() :: %Rheo.DeadLetter{
  dead_lettered_at: DateTime.t() | nil,
  event: Rheo.Event.t() | nil,
  event_id: String.t(),
  group: String.t(),
  partition: non_neg_integer(),
  reason: term(),
  sequence: non_neg_integer() | nil,
  stream: String.t()
}

One dead-lettered delivery for ops listing.

See the module documentation for field meanings.