一、退避与抖动function backoff(baseMs: number, attempt: number, maxMs: number): number {

const exp = Math.min(maxMs, baseMs * Math.pow(2, attempt))

const jitter = Math.random() * exp * 0.5

return Math.floor(exp * 0.75 + jitter)

}

二、幂等与计数头type Req = { headers: Record<string, string | undefined> }

type Res = { setHeader: (k: string, v: string) => void; status: (n: number) => Res; end: (b?: string) => void }

function validIdem(k: string): boolean { return /^[A-Za-z0-9_\-\.]{8,128}$/.test(k) }

三、重试封装type Task = () => Promise<Response>

async function safeRetry(task: Task, attempts: number, baseMs: number, maxMs: number, onAttempt?: (i: number, delayMs: number) => void): Promise<Response> {

let last: any

for (let i = 0; i < attempts; i++) {

try {

const r = await task()

if (r.status < 500 && r.status !== 429) return r

const retryAfter = Number(r.headers.get('Retry-After') || '0')

const delay = retryAfter > 0 ? retryAfter * 1000 : backoff(baseMs, i, maxMs)

onAttempt?.(i + 1, delay)

await new Promise(res => setTimeout(res, delay))

last = r

} catch (e) {

const delay = backoff(baseMs, i, maxMs)

onAttempt?.(i + 1, delay)

await new Promise(res => setTimeout(res, delay))

last = e

}

}

throw last

}

四、服务端协同function setRetryHeaders(res: Res, retryAfterSec: number, count: number) {

res.setHeader('Retry-After', String(retryAfterSec))

res.setHeader('X-Retry-Count', String(count))

}

五、整合与验收指数退避与抖动限制雪崩;遵循`Retry-After`优先;最大延迟与尝试次数受控。幂等键校验与计数头可用;与断路器/速率限制协同避免级联失败。审计记录包含尝试次数与延迟;失败策略清晰(>=500或429重试)。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部