本帖最后由 phoben 于 2024-8-5 11:04 编辑
一直以来,我们都采用官方自带的“计划任务”来完成一些固定频率或事件来触发某些逻辑,但是同时也有一定局限性。 由于计划任务无法动态的根据需要变更执行的间隔时间,也无法精确到毫秒级来完成某些任务,所以定时任务的需求有着广泛的应用场景。 本插件是基于多级时间轮开发的定时任务管理工具,可轻松的将任意活字格命令添加到任务列队中,由插件自主管理任务的运行。
想要创建一个定时任务,方法非常简单,只需要做2件事: 1. 初始化时间轮; 2. 添加任务;
步骤一:初始化时间轮 建议在活字格应用部署、重启时执行一次初始化操作。 这样后端就能在每次部署完成后,自动启动时间轮。
步骤二:添加任务 可以编写命令来添加一个任务,允许携带参数,执行时间也可以使用变量定义。 这样你就可以在任意逻辑里,动态的来添加任务到列队中。
为什么要用时间轮来管理定时任务?
在以往的业务场景中,面对这样的需求,我们一般采用“轮询”的机制来模拟定时任务的执行,也就是在一个数据表中,存储着各种任务和需要执行的时间,然后通过“计划任务”来定时轮询表里可执行的任务。
虽然通过这种方法,也能够模拟出相同效果,但是当任务数量较大时,性能瓶颈就会出现,轮询时间设置过长,会导致任务得不到及时执行,时间过短,又会造成系统短时间内频繁读表+执行复杂逻辑,造成数据库压力大。
使用时间轮就很好的解决这个问题,首先时间轮并不与数据表交互,它将所有任务信息以数据的方式存放到内存中,执行完成后就将任务数据删除,而且采用异步多线程的方式执行业务逻辑,这样一来,哪怕我们以毫秒为颗粒度来执行任务,也不会造成性能问题和阻塞后方任务。
时间轮完全避免了对磁盘和数据库的读写操作。在计划任务推进方面,它可以每秒(甚至更短的时间)推进一次并获取任务信息,这对任何服务器来说都不会造成压力。 由于时间轮每次推进的复杂度是O(1)(即常量),因此推进的频率可以设置得更短。
什么是时间轮?
你可以把时间轮想象成一个类似时钟一样的“轮盘”,每个轮盘拥有若干个“槽位“,而每个槽位都可以放置若干个“任务”。 轮盘按照一定时间进行转动,每当转动到某个“槽位”时,将内部任务进行执行。
如下图所示: 当然,上图只是将时间轮概念抽象出来成为图形,方便大家理解,真实的程序中,并没有这样的轮盘,一切都是用代码模拟出来的。
为什么需要多级时间轮?
上面我们搞懂了单个时间轮的运行原理,那么多级时间轮就像由多个从大到小的齿轮组合而成,小齿轮转动一周会带动大齿轮转动一格 这样做的目的就是兼容一些长效任务,比如,最小的时间轮只有60个格子,每1秒转动一次,那么意味着超过60秒的定时任务,将无法放置在此轮盘上。
这时候多级时间轮就起到了作用,任务被防止后,程序会自动分析它应该被放置的轮盘,当轮盘转动之该槽位时,该任务又会自动被下放至颗粒度更小的轮盘上
经过这样一套“骚操作”,我们就可以将任务的定时范围最小到毫秒、最大到年为单位了。
一级时间轮
多级时间轮降级 红色圆形代表任务
插件获取方法:
1. (推荐)活字格设计器——插件中心——搜索“定时任务”——安装插件; 2. 葡萄城市场搜索“定时任务”,下载试用;
|