找回密码
 立即注册

QQ登录

只需一步,快速开始

phoben 讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2024-8-2 11:15  /   查看:963  /  回复:3
本帖最后由 phoben 于 2024-8-5 11:04 编辑
一直以来,我们都采用官方自带的“计划任务”来完成一些固定频率或事件来触发某些逻辑,但是同时也有一定局限性。
由于计划任务无法动态的根据需要变更执行的间隔时间,也无法精确到毫秒级来完成某些任务,所以定时任务的需求有着广泛的应用场景。
本插件是基于多级时间轮开发的定时任务管理工具,可轻松的将任意活字格命令添加到任务列队中,由插件自主管理任务的运行。


想要创建一个定时任务,方法非常简单,只需要做2件事:
1. 初始化时间轮;
2. 添加任务;

步骤一:初始化时间轮
建议在活字格应用部署、重启时执行一次初始化操作。
这样后端就能在每次部署完成后,自动启动时间轮。



步骤二:添加任务
可以编写命令来添加一个任务,允许携带参数,执行时间也可以使用变量定义。
这样你就可以在任意逻辑里,动态的来添加任务到列队中。





为什么要用时间轮来管理定时任务?

    在以往的业务场景中,面对这样的需求,我们一般采用“轮询”的机制来模拟定时任务的执行,也就是在一个数据表中,存储着各种任务和需要执行的时间,然后通过“计划任务”来定时轮询表里可执行的任务。

    虽然通过这种方法,也能够模拟出相同效果,但是当任务数量较大时,性能瓶颈就会出现,轮询时间设置过长,会导致任务得不到及时执行,时间过短,又会造成系统短时间内频繁读表+执行复杂逻辑,造成数据库压力大。

    使用时间轮就很好的解决这个问题,首先时间轮并不与数据表交互,它将所有任务信息以数据的方式存放到内存中,执行完成后就将任务数据删除,而且采用异步多线程的方式执行业务逻辑,这样一来,哪怕我们以毫秒为颗粒度来执行任务,也不会造成性能问题和阻塞后方任务。

     时间轮完全避免了对磁盘和数据库的读写操作。在计划任务推进方面,它可以每秒(甚至更短的时间)推进一次并获取任务信息,这对任何服务器来说都不会造成压力。
     由于时间轮每次推进的复杂度是O(1)(即常量),因此推进的频率可以设置得更短。



什么是时间轮?

你可以把时间轮想象成一个类似时钟一样的“轮盘”,每个轮盘拥有若干个“槽位“,而每个槽位都可以放置若干个“任务”。
轮盘按照一定时间进行转动,每当转动到某个“槽位”时,将内部任务进行执行。

如下图所示:
当然,上图只是将时间轮概念抽象出来成为图形,方便大家理解,真实的程序中,并没有这样的轮盘,一切都是用代码模拟出来的。



为什么需要多级时间轮?

上面我们搞懂了单个时间轮的运行原理,那么多级时间轮就像由多个从大到小的齿轮组合而成,小齿轮转动一周会带动大齿轮转动一格
这样做的目的就是兼容一些长效任务,比如,最小的时间轮只有60个格子,每1秒转动一次,那么意味着超过60秒的定时任务,将无法放置在此轮盘上。

这时候多级时间轮就起到了作用,任务被防止后,程序会自动分析它应该被放置的轮盘,当轮盘转动之该槽位时,该任务又会自动被下放至颗粒度更小的轮盘上

经过这样一套“骚操作”,我们就可以将任务的定时范围最小到毫秒、最大到年为单位了。



一级时间轮

多级时间轮降级
红色圆形代表任务



插件获取方法:

1. (推荐)活字格设计器——插件中心——搜索“定时任务”——安装插件;
2. 葡萄城市场搜索“定时任务”,下载试用;

葡萄城市场插件下载地址:商品详情 (grapecity.com.cn)


3 个回复

倒序浏览
KinShing
中级会员   /  发表于:2024-8-2 19:06:37
沙发
回复 使用道具 举报
Aa金砂
高级会员   /  发表于:2024-8-3 11:24:15
板凳
工控程序就是这样
回复 使用道具 举报
phoben讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2024-8-3 11:26:46
地板
Aa金砂 发表于 2024-8-3 11:24
工控程序就是这样

嗯,时间轮应用还是很广泛的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部