服务对象与地域限制
PuppyIP 仅面向海外合规企业及其授权人员提供服务,不面向中国大陆地区开放或提供代理服务。本服务仅限用于中国大陆境外的合法业务活动,严禁在中国大陆境内使用本服务。
代理 IP 或服务器位于境外,不改变上述限制。不得通过中转、转接、共享或转售向中国大陆境内的最终使用者提供本服务。使用前请阅读用户服务协议。
本文要点
- 运行时会重试符合条件的 Durable Object fetch 和 RPC 调用,但请求必须能够原样重新发送。
- 默认最多四次重试、总计五次尝试;十秒限制只约束重试开始时间,不是整个调用的完成时限。
- retryable() 允许特定方法在首次到达状态不明时再次执行,只应标记幂等且可重复运行的方法。
- 应用层重试会与运行时重试相乘;可减少外层尝试,或对自行管理重试的 stub 设置 maxRetries: 0。
先看自动重试的触发边界
Cloudflare 于 2026 年 11 月 5 日宣布 Durable Object 调用的自动重试。运行时现在会处理经过 Durable Object 调用句柄(stub)发起的 fetch() 请求和远程方法调用(RPC),不论调用者是 Worker 还是另一个 Durable Object。基础自动重试不需要修改现有代码。
运行时只在错误的 retryable 属性为 true,并且请求尚未到达 Durable Object,或连接中断导致运行时无法判断请求是否到达时才重试。在到达状态不明的情况下,重试沿用首次请求的身份;对象若已收到首次请求,默认会拒绝该重试,调用仍以原始错误失败。
十秒不是整个调用的超时
默认最多进行四次重试,也就是首次尝试加四次重试,共五次尝试。重试采用带抖动的指数退避;首次调用开始满十秒后不会再启动新的重试。这个时间点限制的是重试何时可以开始,不是要求首次调用在十秒内完成。
运行时永远不会取消首次尝试。十秒期限到达时,仍在运行的重试会被取消,但首次请求可能继续执行。因此不能把十秒写成整个调用的完成保证,也不能仅凭这条期限推断业务操作已经停止。 最终通常返回首次失败的错误;若后续尝试遇到不可重试的错误,则返回该次错误。
只对可重复执行的方法使用 retryable()
连接中断后,运行时仍会以相同请求身份发送重试。如果对象已收到首次请求,默认会拒绝这次重复请求,并让调用以原始错误失败;如果首次请求没有到达,重试可以继续处理。若要允许一个幂等方法在首次已到达时再次运行,可从 cloudflare:durable-objects 导入 retryable() 并标记类原型上的方法。
可用 setQuantity(itemId, quantity) 说明幂等操作:重复写入同一数量仍得到相同状态。addOne(itemId) 每次都会加一,重复执行会改变结果,因此不应标记。retryable() 不是通用的恰好一次保证,也不会让邮件、收费或其他外部副作用自动变得幂等;它只改变被标记方法在首次到达状态不明时是否允许运行。
按 stub 调整重试次数和期限
创建 Durable Object stub 时,可在命名空间的 get() 或 getByName() 选项中传入 retry 对象。maxRetries 表示首次调用之后允许的重试次数,必须是 0 到 10 的整数,默认值为 4。timeoutMs 表示从调用开始后不再启动重试的毫秒数,必须是 500 到 60,000 的整数,默认值为 10,000。
这些设置作用于通过该 stub 发出的 fetch() 和 RPC 调用;未设置的字段采用默认值。使用 retryable() 和 retry 选项需要 Wrangler 4.158.0 或更新版本;默认自动重试本身不要求这一版本。
盘点已有循环,避免重试次数相乘
如果应用已经在自己的代码中重试同一个 Durable Object 调用,外层每次尝试现在都可能包含最多五次运行时尝试。举例来说,假设外层逻辑最多调用三次,而每次都使用默认 stub 设置,最多可能产生十五次 Durable Object 尝试。这个例子用于说明重试叠加,不代表任何实际流量或测试结果。
可降低应用层的尝试次数,或者对由应用层完整管理重试的 stub 设置 maxRetries: 0。先确认外层重试是否仍有必要,并确认方法是否允许重复执行,再选择策略;不要把新默认值误当成一个全局总尝试次数。
并非所有请求和错误都可重放
自动重试只适用于运行时可以原样重新发送的调用。fetch() 请求体为 ReadableStream 时不会重试;字符串、ArrayBuffer、Blob、FormData 和 URLSearchParams 等可重复发送的请求体可以重试。RPC 参数若包含 stream、stub、function 或 RpcTarget,也不会重试;只含结构化克隆值的参数才可重放。
通过尚未完成的结果继续发起调用的 promise pipelining,以及通过 RPC 参数或返回值收到的 stub 调用,都不会重试;一旦对结果发起管道调用,运行时也会停止重试产生该结果的原调用。自动重试只适用于通过 Durable Object namespace 的 get() 或 getByName() 创建的 stub。对象代码抛出的错误、请求到达对象之后发生的错误、overloaded 为 true 的错误,以及 HTTP 500 等 HTTP 错误响应都不会触发运行时重试。retryable() 不会扩大这些错误或请求类型的范围。
资料来源
常见问题
子类、覆盖方法或包装后的方法会继承 retryable() 标记吗?
标记附着在具体函数上。子类会继承已标记的方法;覆盖实现、绑定后的函数或包装函数不会自动带有标记,需要将最终要执行的函数再次传给 retryable()。
retry 选项配置错误时会收到什么异常?
maxRetries 或 timeoutMs 的值不是数字时,get() 和 getByName() 会抛出 TypeError。值是数字但不是整数,或不在允许范围内时,会抛出 RangeError。
运行时重试会额外消耗 Worker 子请求额度吗?
不会。Durable Object 调用的运行时重试不计入子请求限制;只有首次尝试计入该限制。