如何在NestJS BullMQ中配置基于异常类型的自定义退避策略
NestJS Bull队列自定义退避策略配置
要实现根据异常类型动态设置重试延迟的需求,你可以通过两种方式配置Bull队列的自定义退避策略:
方式一:在Job处理器中动态指定退避延迟
这种方式更灵活,直接在业务逻辑的异常捕获环节设置重试延迟:
1. 调整队列注册配置
保留重试次数,移除固定的指数退避配置:
BullModule.registerQueue({ name: POST_QUEUES.PARSE_POST_QUEUE, defaultJobOptions: { attempts: 10, }, }),
2. 在处理器中捕获异常并设置延迟
在对应的Job处理器里,根据捕获的异常类型,抛出带有backoff属性的错误:
@Processor(POST_QUEUES.PARSE_POST_QUEUE) export class ParsePostProcessor { constructor(private readonly yourService: YourService) {} async process(job: Job<any>) { try { // 执行你的业务逻辑 await this.yourService.parsePost(job.data); } catch (error) { const retryError = new Error(error.message); // 根据异常类型设置重试延迟 if (error instanceof AccountNotFound) { retryError.backoff = { delay: 20 * 1000 }; // 20秒 } else { retryError.backoff = { delay: 5 * 1000 }; // 5秒 } throw retryError; } } }
方式二:注册全局自定义退避策略
如果希望把退避逻辑集中管理,可以注册全局自定义退避策略:
1. 注册自定义退避策略
在应用初始化的地方(比如main.ts)注册自定义策略:
import * as Bull from 'bull'; // 注册名为customAccountBackoff的自定义退避策略 Bull.BackoffStrategy.register('customAccountBackoff', (attemptsMade: number, err: Error) => { // 根据异常类型返回对应延迟(毫秒) return err instanceof AccountNotFound ? 20 * 1000 : 5 * 1000; });
2. 队列配置中使用自定义策略
在队列注册时指定使用这个自定义类型:
BullModule.registerQueue({ name: POST_QUEUES.PARSE_POST_QUEUE, defaultJobOptions: { backoff: { type: 'customAccountBackoff' }, attempts: 10, }, }),
这种方式下,只要处理器抛出对应的异常,Bull会自动调用自定义策略计算重试延迟。
内容的提问来源于stack exchange,提问作者kabdik
相关产品推荐
相关产品推荐

