运行与验证
启动教程站点
在仓库根目录:
bash
npm install
npm run docs:dev默认地址是 VitePress 输出的本地地址,通常为 http://127.0.0.1:5173。
启动最终项目
进入示例目录:
bash
cd examples/durable-mini
docker compose up -d mysql启动后端:
bash
cd backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --host 127.0.0.1 --port 8000启动前端:
bash
cd ../frontend
npm install
npm run dev前端默认访问 http://127.0.0.1:5174。
验证 1:入口幂等
连续两次执行同一个请求:
bash
curl -X POST http://127.0.0.1:8000/api/orders \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: demo-001' \
-d '{"sku":"book","quantity":1,"amount":99}'预期:两次返回同一个 invocation id。
验证 2:故障恢复
bash
curl -X POST http://127.0.0.1:8000/api/orders \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: demo-crash-001' \
-d '{"sku":"book","quantity":1,"amount":99,"crash_after":"charge-payment"}'预期:
- 第一次 attempt 在
charge-payment后失败。 - 第二次 attempt replay
create-order和charge-payment。 - workflow 最终完成。
验证 3:持久计时器
创建订单后,在 settlement-wait 期间重启后端。预期后端恢复后,workflow 在 timer 到期后继续执行,而不是重新等待完整时长。
数据库观察
bash
docker compose exec mysql mysql -uroot -proot durable_mini常用查询:
sql
SELECT id, status, attempt_count, idempotency_key FROM invocations ORDER BY created_at DESC;
SELECT invocation_id, step_index, step_name, status, result FROM journal_entries ORDER BY id;
SELECT order_id, invocation_id, status, payment_id, reservation_id, receipt_id FROM business_orders ORDER BY created_at DESC;
SELECT invocation_id, message, created_at FROM runtime_events ORDER BY id DESC LIMIT 20;观察重点:
| 表 | 你应该看到什么 |
|---|---|
invocations | workflow 从 QUEUED/RUNNING/WAITING_TIMER 变为 COMPLETED |
journal_entries | durable step 逐个提交,重放时不重复插入旧 step |
business_orders | 订单状态从 CREATED 推进到 COMPLETED |