Skip to main content
Two independent features, usually paired.

fifo_group — per-key ordering

Messages with the same fifo_group are delivered strictly in the order they were enqueued. Across different groups, delivery is concurrent.
await q.send("orders", payload, { fifoGroup: "user-42" })
All user-42 messages serialize. user-43 messages are independent.

dedupe_id — SQS-style dedup

Within a fifo_group, a second send with the same dedupe_id inside 5 minutes is rejected. Server returns 200 with deduped: true.
await q.send("orders", payload, {
  fifoGroup: "user-42",
  dedupeId: "order-9001",
})

Constraints

  • dedupe_id requires fifo_group. Otherwise 400.
  • dedupe_id + delay → 400. Pick one.
  • Just want retry safety? Use Idempotency-Key instead — 24h window, no fifo_group required.

Idempotency-Key vs dedupe_id

FeatureIdempotency-Keydedupe_id
Window24 h5 min
Needs fifo_groupnoyes
Works with delayyesno
SemanticsSDK retry safetyProducer-side dedup per business key
Idempotency-Key for “my network flaked, safe to retry”. dedupe_id when you have a natural business key you want BOTH serialized AND dedup’d.

Performance notes

  • FIFO groups don’t slow you down — different groups still fan out across all consumers.
  • A single hot fifo_group IS serialized on the consumer side. If user-42 ships 10,000 messages in a minute, they run one-at-a-time.