2分钟搞定RSS定时更新:wewe-rss后端任务调度实战指南
【免费下载链接】wewe-rss 项目地址: https://gitcode.com/GitHub_Trending/we/wewe-rss
你是否还在手动刷新RSS源获取最新内容?面对大量订阅源时,重复操作不仅浪费时间,还可能错过重要信息。本文将带你了解wewe-rss如何通过Cron(定时任务) 机制实现RSS源自动更新,只需简单配置即可让系统按预设时间自动同步内容,彻底解放双手。读完本文,你将掌握:定时任务的核心实现原理、自定义更新频率的方法,以及如何排查常见调度问题。
定时任务架构概览
wewe-rss的定时更新功能基于NestJS框架的@nestjs/schedule模块实现,该模块提供了Cron表达式解析、任务调度等核心能力。系统架构包含三个关键部分:
- 调度器:由
ScheduleModule提供基础调度能力,在应用启动时初始化 - 任务处理器:
FeedsService中的handleUpdateFeedsCron方法负责具体更新逻辑 - 配置中心:通过环境变量和配置文件控制更新频率、超时设置等参数
核心代码模块关系如下:
- 调度模块注册:apps/server/src/app.module.ts
- 定时任务实现:apps/server/src/feeds/feeds.service.ts
- 配置文件:apps/server/src/configuration.ts
Cron表达式配置与任务注册
wewe-rss使用Cron表达式定义更新频率,默认配置为每天5:35和17:35执行两次更新(适配国内作息时间)。关键代码实现如下:
@Cron(process.env.CRON_EXPRESSION || '35 5,17 * * *', {
name: 'updateFeeds',
timeZone: 'Asia/Shanghai',
})
async handleUpdateFeedsCron() {
this.logger.debug('Called handleUpdateFeedsCron');
// 任务逻辑...
}
Cron表达式解析
35 5,17 * * *表示:
- 35:分钟(0-59)
- 5,17:小时(0-23,支持逗号分隔多个值)
- 第一个*:日(1-31)
- 第二个*:月(1-12)
- 第三个*:星期(0-7,0和7都代表周日)
自定义更新频率
通过修改环境变量CRON_EXPRESSION可调整更新频率,例如:
- 每小时更新:
0 * * * *(整点执行) - 每15分钟更新:
*/15 * * * *(每15分钟执行一次) - 工作日9点更新:
0 9 * * 1-5(周一至周五9:00执行)
任务执行流程详解
定时任务的完整执行流程包含四个阶段,通过apps/server/src/feeds/feeds.service.ts实现:
1. 获取活跃订阅源
系统首先查询状态为"启用"(status=1)的所有RSS源:
const feeds = await this.prismaService.feed.findMany({
where: { status: 1 },
});
2. 批量更新处理
采用串行更新策略(避免服务器负载过高),对每个订阅源依次执行:
for (const feed of feeds) {
try {
await this.trpcService.refreshMpArticlesAndUpdateFeed(feed.id);
// 延迟控制,避免请求过于频繁
await new Promise(resolve => setTimeout(resolve, updateDelayTime * 1e3));
} catch (err) {
this.logger.error('更新失败', err);
}
}
3. 失败重试机制
通过got库的重试钩子实现网络请求失败处理:
hooks: {
beforeRetry: [
async (options, error, retryCount) => {
this.logger.warn(`retrying ${options.url}...`);
return new Promise(resolve =>
setTimeout(resolve, 2e3 * (retryCount || 1)) // 指数退避策略
);
},
],
}
4. 执行状态记录
所有更新操作通过logger输出日志,便于问题排查:
this.logger.debug('feeds length:' + feeds.length); // 输出订阅源数量
this.logger.error('handleUpdateFeedsCron error', err); // 记录错误信息
配置参数与性能优化
系统提供多维度配置项优化更新性能,关键参数位于configuration.ts:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| updateDelayTime | number | 30 | 源之间的更新间隔(秒) |
| enableCleanHtml | boolean | true | 是否清理HTML内容 |
| timeout | number | 8000 | 请求超时时间(毫秒) |
| retry.limit | number | 3 | 最大重试次数 |
通过调整updateDelayTime可平衡更新速度与服务器负载,建议:
- 订阅源<50个:设为10秒
- 订阅源50-200个:设为30秒
- 订阅源>200个:设为60秒
常见问题排查指南
任务不执行怎么办?
- 检查调度模块是否正确注册:
// app.module.ts中需包含
import { ScheduleModule } from '@nestjs/schedule';
@Module({
imports: [ScheduleModule.forRoot()],
})
-
验证Cron表达式格式,可使用Cron表达式在线验证工具检查语法
-
查看应用日志:
grep "updateFeeds" logs/app.log
更新速度慢如何优化?
- 减少单次更新的订阅源数量(通过状态筛选)
- 增加
updateDelayTime降低请求频率 - 检查数据库连接池配置,确保足够的并发连接数
总结与扩展建议
wewe-rss通过NestJS的定时任务机制,实现了可靠、可配置的RSS源自动更新功能。核心优势在于:
- 时区适配:默认使用
Asia/Shanghai时区,避免跨时区时间偏差 - 柔性更新:失败重试+间隔控制,降低服务器负载
- 环境隔离:通过环境变量区分开发/生产环境的更新策略
进阶使用建议:
- 为重要订阅源配置独立更新任务(使用
name属性区分) - 结合监控工具(如Prometheus)跟踪任务执行状态
- 实现更新结果通知(集成企业微信/钉钉机器人)
通过本文介绍的定时任务机制,wewe-rss能够高效管理数百个RSS源的自动更新。无论是个人用户还是企业部署,都可以通过简单配置满足个性化的内容同步需求。下一步,你可以尝试修改Cron表达式实现自定义更新频率,或通过源码扩展更复杂的任务调度逻辑。
【免费下载链接】wewe-rss 项目地址: https://gitcode.com/GitHub_Trending/we/wewe-rss
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考





