likes
comments
collection
share

如何设计Nodejs的定时任务

作者站长头像
站长
· 阅读数 15

前言

新年开始,我决定开始写文章了。我希望能够用我的文字为大家带来一些技术上启发。

希望大家在新的一年里都能够取得自己想要的成就,并且能够快乐健康地度过这一年。

祝大家新年快乐!

在这系列的文章中我将逐一介绍如何在nodejs中实现任务的定时,重试和可取消。当然这篇文章我们先来讨论nodejs任务的定时。

如何设计Nodejs的重试任务

为什么我们在乎定时任务 ?

定时任务是指在特定的时间间隔或延迟后执行的任务。

很多任务都可以作为定时任务存在。

比如说为了提高用户体验,我们可能使用定时任务来定期发送推送通知,让用户及时了解最新信息。

又比如说为了提高软件数据的安全性,我们可能每小时执行一次数据备份。

很明显,对于定时任务的需求广泛存在。

简单的Nodejs任务

在nodejs中,定时可以使用 setInterval() 和 setTimeout() 函数来实现。

例如: 我们可以每隔10s打印一条消息。

setInterval(() => {
  console.log('Hello, world!');
}, 1000 * 10);

同样:我们也可以10s后打印一条消息

setTimeout(() => { 
    console.log('Hello, world!'); 
}, 1000 * 10);

但是我们都知道无论是JavaScript还是Nodejs中的定时器都有时间限制,都只能接受32位的有符号整数,时间大概为24.85天,这个时间好像足够长了,但是有时候还是不方便。

解决方案是我们可以使用社区里面的一些模块,比如:safe-timers

这样子,我们似乎解决了我们定时任务的需求。 但是实际上,你可能还有很多需求。比如:使用自然语言来描述时间间隔等。

Nodejs定时任务框架介绍

框架一览

  1. Agenda
  2. Node Schedule
  3. Node Cron
  4. Bree
  5. Cron
  6. Bull
  7. Bottleneck
  8. Neoplan

上面是社区里面比较流行的任务调度工具。

大家要是对上面的库比较有兴趣的话,可以看看这篇文章

Bree

如何设计Nodejs的定时任务

为什么选择bree?

选择bree我有下面几个理由

轻量

实际在选型中,我根据了我的需要选择了Bree。选择这个框架的主要原因是它比较轻量,没有附带数据库。

错误处理

你可以重写错误和信息处理函数,使用你喜欢的日志库来处理和记录错误信息。

便于控制

在任务处理中,我们需要考虑到任务的重试,取消等工作。 bree推荐使用 promise-fun 来解决promise中的大部分常见问题。 下面我简单介绍几个

丰富的日期格式

支持使用 laterhuman-interval, or ms 字符串定义任务,当然 日期对象和cron语法也是可以的。

其他

当然这个库也解决了定时器的缺陷问题,使用进程和线程负载任务,对于没有太多后端经验的前端来说十分合适。

总结

在这个简短的文章中,我们讨论了在nodejs中如何实现简单的定时任务,并且指出了定时器的缺陷。最后我们推荐了Nodejs中常见的任务调度框架,根据作者的个人经验推荐了Bree来作为上手框架。

最后,文中也介绍了用 promise-fun 来解决promise使用中的大部分常见问题。

有了promise-fun这个库,那么是不是重试和取消相关的文章就不用介绍了呢!其实不是这样!

p-retry,重试的逻辑控制比较简单,无法投入到复杂的生产中。

同样p-cancelable 也存在一定的问题,都需要解决。

其他

个人水平有限,还望大家多多评论,支持小弟。

如何设计Nodejs的定时任务