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>
53 lines
1.6 KiB
Markdown
53 lines
1.6 KiB
Markdown
---
|
|
title: Deduplicate Queued Workflows
|
|
impact: HIGH
|
|
impactDescription: Prevents duplicate workflow executions
|
|
tags: 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):**
|
|
|
|
```go
|
|
// 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):**
|
|
|
|
```go
|
|
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](https://docs.dbos.dev/golang/tutorials/queue-tutorial#deduplication)
|