跳至主要内容

指数退避

指数退避是一种在计算机系统中用于处理重试并避免压垮服务的技术。我们可以使用标准库提供的`retry`工具轻松实现这一点。

在 Github 上编辑
从`@std/async`导入`retry`工具。
import { retry, RetryError, type RetryOptions } from "jsr:@std/async";
一个将`hello world`记录到控制台并返回拒绝的 Promise 的函数。
const fn = () => {
  console.log("hello world");
  return Promise.reject("rejected");
};
重试选项的配置,它将确保该函数在抛出错误之前最多被调用 3 次。对该函数的第一次调用将立即进行,第二次调用将在 10 毫秒的延迟后进行,第三/最后一次调用将在 20 毫秒的延迟后进行。
const options: RetryOptions = {
  maxAttempts: 3,
  minTimeout: 10,
  multiplier: 2,
  jitter: 0,
};

try {
使用`retry`工具以及重试配置包装该函数。
  await retry(fn, options);
} catch (err) {
当达到最大尝试次数时,将抛出 RetryError,其中包含原始拒绝原因`rejected`作为其`cause`属性。
  if (err instanceof RetryError) {
    console.log("Retry error :", err.message);
    console.log("Error cause :", err.cause);
  }
}

使用 Deno CLI 在本地运行此示例

deno run https://docs.deno.org.cn/examples/exponential-backoff.ts