常见错误
把 retry 当成 Durable Execution
retry 只负责“再试一次”,不负责“哪些步骤已经发生”。没有 Journal 的 retry 仍然可能重复扣款、重复发消息、重复创建资源。
在 ctx.run 之外执行副作用
错误示例:
python
payment = charge_card(order)
ctx.run("record-payment", lambda: {"payment_id": payment.id})charge_card 没有被 Journal 保护,重放时会重复执行。
在 durable step 里调用 context
在 Restate SDK 中,ctx.run 内部不能嵌套使用 context action。教学版也建议遵守这个规则。step 函数应该只做一个外部副作用或非确定性计算。
随意修改 step 顺序
未完成 invocation 的 replay 依赖 step 顺序。改动 workflow 时要考虑版本兼容。
忽略外部系统幂等
如果外部 API 成功但 Journal 写入前崩溃,运行时可能不知道副作用已经发生。外部系统支持 idempotency key 是重要补充。
用进程内 sleep 实现长等待
进程内 sleep 丢失恢复语义,也浪费线程或计算资源。长等待应该持久化成 timer。