这是我参与「第五届青训营」伴学笔记创作活动的第5天
定时任务起源
最初定时任务是linux上面的,也是整个互联网行业里最常见的服务之一,我接触定时任务最初是宝塔linux,在上面设置一些定期的服务,比如说ssl,docker的定时运行什么的。 比如说我的宝塔目前运行的几个计划任务如下图。
然后就是接触到crontab了,一个很好用的命令,用它来实现很多功能。后面在玩nas的时候也接触了一些其他的定时任务。
优秀组件
Quarts
不得不提到一个开源的组件了,quarts,很多java开发都用的这个,不过在下了解不多,此处就不多介绍了。附个链接好了:zhuanlan.zhihu.com/p/487151556
Redis
这个东西,我最初都不知道,真的是没想到Redis还能搞分布式定时任务,其实是还挺好用。
利用一个ZSet来搞,把过期时间存储到ZSet里面的Score字段,利用循环来实现定时任务。
添加任务,然后设置好消费任务即可
@Scheduled(cron = "0 0/1 * * * ? *")
LTS
这是一个zookeeper的,集群部署,动态添加,功能很多,没用过,先略过了,后面再补充。
设计
Timer
定时器说白了就是一个数据结构,有增删执行更新四个功能
- Add 新增任务;
- Delete 删除任务;
- Run 执行任务;
- Update 更新。 然后这个东西还可以循环的去进行,就有点像是一个循环队列。 但是事实上,这个是一个有序列表或者堆。 不过具体实现不同公司有不同的方案,在课程文章里面介绍了字节,腾讯等公司的方案,有链表这些之外还有时间轮的方案触发器的方案等。
感觉今天的内容没啥写的,所以再简单的介绍一下容灾和可靠性好了。
可靠性
跟其他的很多分布式的情况一样,需要满足高可靠的需求,所以执行我们至少要at-least-once。这样不是简单的同时设置两个定时任务(当然普通需求多设置几个任务就好了,跟定闹钟一样),而是要百分百保证实现。 这里主要是搞持久化存储,确保成功执行后再过期。
容灾
现在什么都要搞容灾了,什么raid,分布式,两地三中心,超级多的容灾策略。在分布式定时任务上也有业务需要具有容灾能力。 容灾方面的话主要还是靠分布式锁3来实现的。
参考文献: 1.上面附过链接了 2.juejin.cn/post/719632…