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>
This commit is contained in:
52
skills/dbos-golang/references/queue-deduplication.md
Normal file
52
skills/dbos-golang/references/queue-deduplication.md
Normal file
@@ -0,0 +1,52 @@
|
||||
---
|
||||
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)
|
||||
Reference in New Issue
Block a user