phoben 发表于 2024-8-2 11:15:11

【插件预告】巧用时间轮灵活管理定时任务——一个毫秒级、多线程的定时任务管理工具

本帖最后由 phoben 于 2024-8-5 11:04 编辑

一直以来,我们都采用官方自带的“计划任务”来完成一些固定频率或事件来触发某些逻辑,但是同时也有一定局限性。由于计划任务无法动态的根据需要变更执行的间隔时间,也无法精确到毫秒级来完成某些任务,所以定时任务的需求有着广泛的应用场景。本插件是基于多级时间轮开发的定时任务管理工具,可轻松的将任意活字格命令添加到任务列队中,由插件自主管理任务的运行。

想要创建一个定时任务,方法非常简单,只需要做2件事:1. 初始化时间轮;2. 添加任务;
步骤一:初始化时间轮建议在活字格应用部署、重启时执行一次初始化操作。这样后端就能在每次部署完成后,自动启动时间轮。https://mallcdn.grapecity.com.cn/787b710a4fffa8e7acc0dad4470957ba

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


为什么要用时间轮来管理定时任务?
    在以往的业务场景中,面对这样的需求,我们一般采用“轮询”的机制来模拟定时任务的执行,也就是在一个数据表中,存储着各种任务和需要执行的时间,然后通过“计划任务”来定时轮询表里可执行的任务。
    虽然通过这种方法,也能够模拟出相同效果,但是当任务数量较大时,性能瓶颈就会出现,轮询时间设置过长,会导致任务得不到及时执行,时间过短,又会造成系统短时间内频繁读表+执行复杂逻辑,造成数据库压力大。
    使用时间轮就很好的解决这个问题,首先时间轮并不与数据表交互,它将所有任务信息以数据的方式存放到内存中,执行完成后就将任务数据删除,而且采用异步多线程的方式执行业务逻辑,这样一来,哪怕我们以毫秒为颗粒度来执行任务,也不会造成性能问题和阻塞后方任务。
   时间轮完全避免了对磁盘和数据库的读写操作。在计划任务推进方面,它可以每秒(甚至更短的时间)推进一次并获取任务信息,这对任何服务器来说都不会造成压力。   由于时间轮每次推进的复杂度是O(1)(即常量),因此推进的频率可以设置得更短。

什么是时间轮?
你可以把时间轮想象成一个类似时钟一样的“轮盘”,每个轮盘拥有若干个“槽位“,而每个槽位都可以放置若干个“任务”。轮盘按照一定时间进行转动,每当转动到某个“槽位”时,将内部任务进行执行。
如下图所示:https://mallcdn.grapecity.com.cn/bd310475fc36ace8eeb295b620f44d68当然,上图只是将时间轮概念抽象出来成为图形,方便大家理解,真实的程序中,并没有这样的轮盘,一切都是用代码模拟出来的。

为什么需要多级时间轮?
上面我们搞懂了单个时间轮的运行原理,那么多级时间轮就像由多个从大到小的齿轮组合而成,小齿轮转动一周会带动大齿轮转动一格这样做的目的就是兼容一些长效任务,比如,最小的时间轮只有60个格子,每1秒转动一次,那么意味着超过60秒的定时任务,将无法放置在此轮盘上。
这时候多级时间轮就起到了作用,任务被防止后,程序会自动分析它应该被放置的轮盘,当轮盘转动之该槽位时,该任务又会自动被下放至颗粒度更小的轮盘上
经过这样一套“骚操作”,我们就可以将任务的定时范围最小到毫秒、最大到年为单位了。


一级时间轮https://mallcdn.grapecity.com.cn/ed1594feeea4eda68ccceeb116678a6e
多级时间轮降级红色圆形代表任务https://mallcdn.grapecity.com.cn/6bec471fb6d83445467995c7ecd10f56

插件获取方法:
1. (推荐)活字格设计器——插件中心——搜索“定时任务”——安装插件;2. 葡萄城市场搜索“定时任务”,下载试用;
葡萄城市场插件下载地址:商品详情 (grapecity.com.cn)

KinShing 发表于 2024-8-2 19:06:37

:hjyzw::hjyzw:牛

Aa金砂 发表于 2024-8-3 11:24:15

工控程序就是这样

phoben 发表于 2024-8-3 11:26:46

Aa金砂 发表于 2024-8-3 11:24
工控程序就是这样

嗯,时间轮应用还是很广泛的
页: [1]
查看完整版本: 【插件预告】巧用时间轮灵活管理定时任务——一个毫秒级、多线程的定时任务管理工具