Skip to content

常见错误

把 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。

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