Node 如何写好一个定时任务

171 阅读1分钟

定时任务 任务队列 任务调度 并发控制

  • 定时任务运行有几点需要注意:
    • 限流:控制QPS(每秒查询数)涉及到实施限流(rate limiting)机制来控制客户端对服务器的请求速率
    • 错误处理得当+避免重复处理已经处理过的数据

并发控制 bottleneck

一次发送几条数据,用来控制qps。实际原理就是延迟几秒后发送。

// egg-node函数中做的测试:

const Bottleneck = require('bottleneck');

const limiter = new Bottleneck({
    maxConcurrent: 1,
    minTime: 5000 // 至少5000毫秒间隔来执行请求
});
async function run() {
    console.log("执行函数------");
}

for(let i = 0; i < 10; i++) {
    console.log(`第 ${i} 次:`, moment().format('YYYYMMDD HH:mm:ss'))
    const result = await limiter.schedule(run);
    console.log(`第 ${i} 次:`, moment().format('YYYYMMDD HH:mm:ss'))
}
image.png

如上示例:第一次立即执行,之后会在 run() 函数执行前等待 5s。