Deduplication
EDS V2 guarantees at-least-once delivery — duplicates can occur; your client must handle them safely.
Visibility Timeout
EDS V2 uses a 30-second visibility timeout. When an event is delivered to your client, the underlying message becomes temporarily invisible. If your client does not acknowledge the event within 30 seconds, the message becomes visible again and is redelivered with the same eventId but a new receiptId.
eventId vs receiptId
Two identifiers appear on every EVENT frame:
| Field | Stable? | Purpose |
|---|---|---|
eventId | Yes — same across all redeliveries | Use this to detect duplicates |
receiptId | No — changes on every delivery attempt | Use this in the ack frame |
To deduplicate: maintain a set of eventId values your client has already processed. Before acting on an event, check whether its eventId is in the set. If it is, skip the business logic but still send an ack (see below).
const seenEventIds = new Set();
function handleEvent(payload) {
const { eventId, receiptId, eventType } = payload;
const isDuplicate = seenEventIds.has(eventId);
if (!isDuplicate) {
seenEventIds.add(eventId);
processEvent(eventType, payload); // your business logic
}
// Always ack, even for duplicates
sendAck(receiptId);
}
Always Acknowledge Duplicates
Even when you detect a duplicate, you must send an ACK_EVENT with the receiptId. Failing to acknowledge leaves the message in the queue, which causes it to be redelivered again after the visibility timeout expires — creating an infinite loop of duplicates.
The rule is: acknowledge the receiptId, deduplicate on the eventId.
Best Practices
- Acknowledge promptly — send
ACK_EVENTonce the event is durably recorded, not after downstream processing. - Decouple receiving from processing — buffer events locally and process asynchronously to stay well within the 30-second window.
- Expect redeliveries on reconnect — unacknowledged in-flight events are redelivered; use
eventIddeduplication.