Files
antigravity-skills-reference/skills/dbos-golang/references/queue-deduplication.md
Max dml 7e5abd504f feat: add DBOS skills for TypeScript, Python, and Go (#94)
Add three DBOS SDK skills with reference documentation for building
reliable, fault-tolerant applications with durable workflows.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 23:26:51 +01:00

1.6 KiB

title, impact, impactDescription, tags
title impact impactDescription tags
Deduplicate Queued Workflows HIGH Prevents duplicate workflow executions queue, deduplication, idempotent, duplicate

Deduplicate Queued Workflows

Set a deduplication ID when enqueuing to prevent duplicate workflow executions. If a workflow with the same deduplication ID is already enqueued or executing, a DBOSError with code QueueDeduplicated is returned.

Incorrect (no deduplication):

// Multiple calls could enqueue duplicates
func handleClick(ctx dbos.DBOSContext, userID, task string) error {
	_, err := dbos.RunWorkflow(ctx, processTask, task,
		dbos.WithQueue(queue.Name),
	)
	return err
}

Correct (with deduplication):

func handleClick(ctx dbos.DBOSContext, userID, task string) error {
	_, err := dbos.RunWorkflow(ctx, processTask, task,
		dbos.WithQueue(queue.Name),
		dbos.WithDeduplicationID(userID),
	)
	if err != nil {
		// Check if it was deduplicated
		var dbosErr *dbos.DBOSError
		if errors.As(err, &dbosErr) && dbosErr.Code == dbos.QueueDeduplicated {
			fmt.Println("Task already in progress for user:", userID)
			return nil
		}
		return err
	}
	return nil
}

Deduplication is per-queue. The deduplication ID is active while the workflow has status ENQUEUED or PENDING. Once the workflow completes, a new workflow with the same deduplication ID can be enqueued.

This is useful for:

  • Ensuring one active task per user
  • Preventing duplicate form submissions
  • Idempotent event processing

Reference: Deduplication