背景
`grep -r "exponentialBackoff|RetryPolicy" src/` 结果:没有共享实现。各 channel / plugin 自己实现重试逻辑,策略不一致:
- Discord gateway: `ws` 内部重连(不受控)
- Telegram: 手写 setTimeout
- REST 调用: 部分裸调 undici
提案
在 `src/infra/retry/` 提取:
```ts
export class RetryPolicy {
constructor(opts: {
maxAttempts: number;
initialDelayMs: number;
maxDelayMs: number;
jitter: boolean;
retryOn: (err: unknown) => boolean;
}) {}
async execute(fn: () => Promise): Promise {}
}
```
默认策略:
- 4xx 不重试(除 408/429)
- 5xx 指数退避 + jitter
- 网络错误(ECONNRESET/ETIMEDOUT)重试
各 channel 注入统一 policy,可被配置覆盖。
背景
`grep -r "exponentialBackoff|RetryPolicy" src/` 结果:没有共享实现。各 channel / plugin 自己实现重试逻辑,策略不一致:
提案
在 `src/infra/retry/` 提取:
```ts
export class RetryPolicy {
constructor(opts: {
maxAttempts: number;
initialDelayMs: number;
maxDelayMs: number;
jitter: boolean;
retryOn: (err: unknown) => boolean;
}) {}
async execute(fn: () => Promise): Promise {}
}
```
默认策略:
各 channel 注入统一 policy,可被配置覆盖。