Skip to content

运行与验证

启动教程站点

在仓库根目录:

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"}'

预期:

  1. 第一次 attempt 在 charge-payment 后失败。
  2. 第二次 attempt replay create-ordercharge-payment
  3. 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;

观察重点:

你应该看到什么
invocationsworkflow 从 QUEUED/RUNNING/WAITING_TIMER 变为 COMPLETED
journal_entriesdurable step 逐个提交,重放时不重复插入旧 step
business_orders订单状态从 CREATED 推进到 COMPLETED

Teaching project inspired by Restate's public architecture and documentation.