Relay

Dead Letter Queue

Failed delivery management, replay, and bulk operations.

The dead letter queue (DLQ) captures deliveries that have permanently failed after exhausting all retry attempts.

How entries are created

When the retrier decides a delivery is beyond recovery (all attempts exhausted, or a non-retryable HTTP status), the engine pushes a DLQ entry with full context:

  • Original event payload
  • Endpoint URL at the time of failure
  • Error message and HTTP status from the final attempt
  • Total attempt count

Listing DLQ entries

entries, err := r.Store().ListDLQ(ctx, dlq.ListOpts{
    TenantID:   "tenant-acme",
    EndpointID: &epID,
    Limit:      50,
})

Replay

Replay re-enqueues a failed delivery for another round of attempts:

err := r.DLQ().Replay(ctx, dlqEntryID)

The DLQ entry is marked with ReplayedAt timestamp. A new delivery is created in pending state.

Bulk replay

The admin API supports bulk replay via POST /dlq/replay.

DLQ service

type Service struct { ... }

func (s *Service) Get(ctx context.Context, id id.ID) (*Entry, error)
func (s *Service) Replay(ctx context.Context, id id.ID) error
func (s *Service) PushFailed(ctx context.Context, d *delivery.Delivery, ep *endpoint.Endpoint, evt *event.Event, lastError string, lastStatusCode int) error

On this page