Nodejs 比较好的定时任务组件?

Nodejs 比较好的定时任务组件?

做实时动态图表,打算用socket.io做websocket,不知道用什么在后台做定时任务查询DB/缓存以及向UI定时(每秒)推送实时数据。谁有这方面的最佳实践分享一下?

6 回复

当然可以!对于在 Node.js 中实现定时任务,有几个非常优秀的库可以选择。其中最流行的是 node-cronagenda。下面我们分别介绍这两个库,并提供一些简单的示例代码。

使用 node-cron

node-cron 是一个简单且功能强大的定时任务库,非常适合用于执行周期性的任务。

安装

首先,你需要安装 node-cron

npm install node-cron

示例代码

假设你想要每秒从数据库或缓存中获取一次最新数据并推送给前端:

const cron = require('node-cron');
const io = require('socket.io')(server); // 假设 server 是你的 HTTP 服务器实例

// 假设这是你的数据库查询函数
function fetchLatestData() {
    return new Promise((resolve, reject) => {
        // 这里是你的数据库查询逻辑
        // resolve(查询结果);
    });
}

cron.schedule('* * * * *', async () => {
    const data = await fetchLatestData();
    
    // 广播数据给所有客户端
    io.emit('realtime-data', data);
});

console.log('定时任务已启动,每秒检查一次数据库并推送数据');

使用 agenda

如果你需要更复杂的调度功能,比如基于优先级的任务调度、重试机制等,agenda 是一个更好的选择。

安装

首先,你需要安装 agenda

npm install agenda

示例代码

假设你同样希望每秒从数据库或缓存中获取一次最新数据并推送给前端:

const Agenda = require('agenda');
const io = require('socket.io')(server); // 假设 server 是你的 HTTP 服务器实例

const agenda = new Agenda({ db: { address: 'mongodb://localhost:27017/agenda' }});

// 定义任务
agenda.define('fetch-realtime-data', async (job, done) => {
    const data = await fetchLatestData();

    // 广播数据给所有客户端
    io.emit('realtime-data', data);

    done();
});

// 每秒执行一次任务
agenda.every('1 second', 'fetch-realtime-data');

agenda.start();

console.log('定时任务已启动,每秒检查一次数据库并推送数据');

function fetchLatestData() {
    return new Promise((resolve, reject) => {
        // 这里是你的数据库查询逻辑
        // resolve(查询结果);
    });
}

总结

  • node-cron 更适合简单的定时任务,语法简洁易懂。
  • agenda 则更适合复杂场景,提供了更多高级特性如优先级调度、任务失败重试等。

根据你的需求选择合适的库,可以大大提高开发效率和系统的稳定性。希望这些示例代码对你有所帮助!


setTimeout?

https://github.com/tmrudick/tonic https://github.com/rschmukler/agenda

我觉得应该会有一个满足你的需求, 两个定时任务的库

我开发的mate就有一个计时器 如果你能接受global的话 https://www.npmjs.org/package/mate http://zhanzhenzhen.github.io/mate/ 参见advanced timer,那一部分说明还是英文的,而且还没加入到reference中

later,我之前用过,可以一试,

对于Node.js中的定时任务,node-scheduleAgenda.js 是两个非常受欢迎且功能强大的定时任务库。两者各有特点,适用于不同的场景。

node-schedule

node-schedule 是一个轻量级的定时任务库,可以方便地进行定时执行任务。它支持复杂的cron表达式,可以按需灵活配置任务的触发时间。

示例代码:

const schedule = require('node-schedule');

// 定义一个任务,在每秒时触发
const job = schedule.scheduleJob('* * * * * *', function() {
    console.log('每隔一秒执行一次');
    
    // 在这里添加查询数据库或缓存以及向UI推送数据的逻辑
});

Agenda.js

Agenda.js 则是一个更复杂但功能强大的定时任务管理器,适合需要长时间运行的任务,比如每天执行的重复性任务,或者具有优先级和队列处理的异步任务。

示例代码:

const Agenda = require('agenda')();

// 定义一个任务,每分钟执行一次
Agenda.define('myTask', { priority: 'high', concurrency: 10 }, async (job, done) => {
    console.log('每隔一分钟执行一次');
    
    // 在这里添加查询数据库或缓存以及向UI推送数据的逻辑
    done();
});

// 启动Agenda
Agenda.start();

// 每分钟调度一次
Agenda.every('1 minute', 'myTask');

结合Socket.io

无论是使用node-schedule还是Agenda.js,你都可以结合socket.io来实现每秒向UI推送数据的功能。只需要在定时任务中调用socket.io的相关方法即可。

示例代码:

const io = require('socket.io')(server); // 假设server是你的HTTP服务器实例
io.on('connection', socket => {
    console.log('New client connected');
    
    // 在定时任务中发送数据
    const job = schedule.scheduleJob('* * * * * *', function() {
        socket.emit('realtime-data', { data: '实时数据' });
    });

    socket.on('disconnect', () => {
        console.log('Client disconnected');
        job.cancel(); // 取消任务
    });
});

总结

  • 如果你需要简单的定时任务调度,node-schedule是一个很好的选择。
  • 如果你需要复杂的任务管理和优先级处理,建议使用Agenda.js

以上两种方式都支持与socket.io的集成,以实现实时数据的推送。

回到顶部