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.5 KiB
Markdown
53 lines
1.5 KiB
Markdown
---
|
|
title: Use Workflow IDs for Idempotency
|
|
impact: MEDIUM
|
|
impactDescription: Prevents duplicate executions of critical operations
|
|
tags: idempotency, workflow-id, deduplication, exactly-once
|
|
---
|
|
|
|
## Use Workflow IDs for Idempotency
|
|
|
|
Set workflow IDs to make operations idempotent. A workflow with the same ID executes only once.
|
|
|
|
**Incorrect (duplicate payments possible):**
|
|
|
|
```python
|
|
@app.post("/pay/{order_id}")
|
|
def process_payment(order_id: str):
|
|
# Multiple clicks = multiple payments!
|
|
handle = DBOS.start_workflow(payment_workflow, order_id)
|
|
return handle.get_result()
|
|
```
|
|
|
|
**Correct (idempotent with workflow ID):**
|
|
|
|
```python
|
|
from dbos import SetWorkflowID
|
|
|
|
@app.post("/pay/{order_id}")
|
|
def process_payment(order_id: str):
|
|
# Same order_id = same workflow ID = only one execution
|
|
with SetWorkflowID(f"payment-{order_id}"):
|
|
handle = DBOS.start_workflow(payment_workflow, order_id)
|
|
return handle.get_result()
|
|
|
|
@DBOS.workflow()
|
|
def payment_workflow(order_id: str):
|
|
charge_customer(order_id)
|
|
send_confirmation(order_id)
|
|
return "success"
|
|
```
|
|
|
|
Access the workflow ID inside workflows:
|
|
|
|
```python
|
|
@DBOS.workflow()
|
|
def my_workflow():
|
|
current_id = DBOS.workflow_id
|
|
DBOS.logger.info(f"Running workflow {current_id}")
|
|
```
|
|
|
|
Workflow IDs must be globally unique. Duplicate IDs return the existing workflow's result without re-executing.
|
|
|
|
Reference: [Workflow IDs and Idempotency](https://docs.dbos.dev/python/tutorials/workflow-tutorial#workflow-ids-and-idempotency)
|