🛠️ 처음부터 만드는 Retry — p-retry 스타일 Exponential Backoff 15줄 구현
fetch가 실패했다. 다시 보내면 되지 않을까?
— 그 "다시"가 서버를 죽인다.
AWS, Stripe 등 대형 서비스가 쓰는 Exponential Backoff + Jitter 전략을 15줄로 구현해보자.
```js
function retry(fn, { retries = 3, base = 1000, max = 30000, onRetry } = {}) {
return async function attempt(n = 0) {
try {
return await fn(n);
} catch (err) {
if (n >= retries) throw err;
// Exponential: 1s → 2s → 4s → 8s...
const delay = Math.min(base * 2 ** n, max);
// Jitter: 동시 재시도 분산 (thundering herd 방지)
const jitter = delay * (0.5 + Math.random() * 0.5);
onRetry?.(err, n + 1);
await new Promise(r => setTimeout(r, jitter));
return attempt(n + 1);
}
};
}
```
```js
const fetchData = retry(
() => fetch('/api/data').then(r => {
if (!r.ok) throw new Error(r.status);
return r.json();
}),
{ retries: 3, onRetry: (e, n) => console.log(`재시도 ${n}: ${e.message}`) }
);
const data = await fetchData(); // 실패 시 1s → 2s → 4s 간격으로 재시도
```
| 개념 | 설명 |
|------|------|
| Exponential | `2^n`으로 대기 증가 → 서버 부하 분산 |
| Jitter | 랜덤 ×0.5~1.0 → 동시 재시도 폭주 방지 |
| Max Cap | 상한선(30s) → 무한 대기 방지 |
> 💡 Jitter 없이 backoff만 쓰면 클라이언트 1000개가 정확히 같은 타이밍에 재시도한다.
> 이게 Thundering Herd — jitter가 이걸 흩뿌린다.
p-retry, axios-retry, AWS SDK 모두 이 패턴 위에 만들어져 있다.
— 그 "다시"가 서버를 죽인다.
AWS, Stripe 등 대형 서비스가 쓰는 Exponential Backoff + Jitter 전략을 15줄로 구현해보자.
구현
```js
function retry(fn, { retries = 3, base = 1000, max = 30000, onRetry } = {}) {
return async function attempt(n = 0) {
try {
return await fn(n);
} catch (err) {
if (n >= retries) throw err;
// Exponential: 1s → 2s → 4s → 8s...
const delay = Math.min(base * 2 ** n, max);
// Jitter: 동시 재시도 분산 (thundering herd 방지)
const jitter = delay * (0.5 + Math.random() * 0.5);
onRetry?.(err, n + 1);
await new Promise(r => setTimeout(r, jitter));
return attempt(n + 1);
}
};
}
```
사용법
```js
const fetchData = retry(
() => fetch('/api/data').then(r => {
if (!r.ok) throw new Error(r.status);
return r.json();
}),
{ retries: 3, onRetry: (e, n) => console.log(`재시도 ${n}: ${e.message}`) }
);
const data = await fetchData(); // 실패 시 1s → 2s → 4s 간격으로 재시도
```
왜 이렇게 하나?
| 개념 | 설명 |
|------|------|
| Exponential | `2^n`으로 대기 증가 → 서버 부하 분산 |
| Jitter | 랜덤 ×0.5~1.0 → 동시 재시도 폭주 방지 |
| Max Cap | 상한선(30s) → 무한 대기 방지 |
> 💡 Jitter 없이 backoff만 쓰면 클라이언트 1000개가 정확히 같은 타이밍에 재시도한다.
> 이게 Thundering Herd — jitter가 이걸 흩뿌린다.
p-retry, axios-retry, AWS SDK 모두 이 패턴 위에 만들어져 있다.
👁 0 views
Comments (0)
💬
No comments yet.
Be the first to comment!