如何设计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定时任务框架介绍
框架一览
上面是社区里面比较流行的任务调度工具。
大家要是对上面的库比较有兴趣的话,可以看看这篇文章
Bree
为什么选择bree?
选择bree我有下面几个理由
轻量
实际在选型中,我根据了我的需要选择了Bree。选择这个框架的主要原因是它比较轻量,没有附带数据库。
错误处理
你可以重写错误和信息处理函数,使用你喜欢的日志库来处理和记录错误信息。
便于控制
在任务处理中,我们需要考虑到任务的重试,取消等工作。 bree推荐使用 promise-fun 来解决promise中的大部分常见问题。 下面我简单介绍几个
- delay: 延后一些时间再执行promise
- p-retry: 重试promsie
- p-cancelable: 创建可取消的promsie
- p-queue: 能进行并发控制的队列
丰富的日期格式
支持使用 later, human-interval, or ms 字符串定义任务,当然 日期对象和cron语法也是可以的。
其他
当然这个库也解决了定时器的缺陷问题,使用进程和线程负载任务,对于没有太多后端经验的前端来说十分合适。
总结
在这个简短的文章中,我们讨论了在nodejs中如何实现简单的定时任务,并且指出了定时器的缺陷。最后我们推荐了Nodejs中常见的任务调度框架,根据作者的个人经验推荐了Bree来作为上手框架。
最后,文中也介绍了用 promise-fun 来解决promise使用中的大部分常见问题。
有了promise-fun这个库,那么是不是重试和取消相关的文章就不用介绍了呢!其实不是这样!
p-retry,重试的逻辑控制比较简单,无法投入到复杂的生产中。
同样p-cancelable 也存在一定的问题,都需要解决。
其他
个人水平有限,还望大家多多评论,支持小弟。
转载自:https://juejin.cn/post/7183707676461760569