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