1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TypeScriptでExponentialBackoffのリトライ処理を書いてみる

Last updated at Posted at 2022-03-29

リトライ処理の作成メモです。
アルゴリズムはAWSでお馴染みのExponentialBackoffを使用しています。

Function

export function sleep (milliSec: number) {
  return new Promise(resolve => setTimeout(resolve, milliSec))
}

export async function backOff <T> (
  handler: () => T | Promise<T>,
  checkHandler: (val: T) => boolean,
  maxCount: number = 5,
  interval: number = 100
): Promise<T | undefined> {

  for (let retryNum = 0; retryNum < maxCount; retryNum++) {
    const handlerResult = handler()
    const result = await (handlerResult instanceof Promise 
      ? handlerResult : Promise.resolve(handlerResult))

    if (checkHandler(result)) {
      return result
    }

    await sleep(2 ** retryNum * interval)
  }

  return undefined
}

Params

リトライ内で評価したい処理を定義します。
Promiseが返却されることも想定しておきます。

handler: () => T | Promise<T>

リトライ処理を抜ける条件の評価式です。

checkHandler: (val: T) => boolean

使い方

0 ~ 200のランダムな整数の生成を、100以上の整数が取得されるまで最大5回トライします。

// expected output: 0 ~ 200
const getRandomInt = () => Math.floor(Math.random() * 200)

const isOver100 = (num) => num >= 100

const num = await backOff <number | undefined> (getRandomInt, isOver100)

console.log(num)

補足

今回は異常系は考慮していません。

例えば、apiリクエストをエラーレスポンスのコードでリトライか異常終了するか判断する場合は、
Error判定用のhandlerをbackOffの引数に追加してtry-catch内でcallすれば良さそう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?