前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ScheduleMaster新特性之延时任务初体验

ScheduleMaster新特性之延时任务初体验

作者头像
HOHO
发布2020-06-19 10:38:30
6140
发布2020-06-19 10:38:30
举报

ScheduleMaster在上个月底更新到了2.0版本,在功能和代码以及文档上都往前跨了很大一步,详细信息可以参考这篇文章:.NET Core下的开源分布式任务调度系统ScheduleMaster-v2.0低调发布

这次的更新点主要包含:

  • 开发了延时任务功能。
  • 抽象出分布式锁服务并默认数据库实现。
  • 补充了单元测试。
  • 补充了几篇文档。
  • 修复了已知的bug。

其中的重头戏自然是延时任务功能,所谓的延时任务就是在指定时刻执行指定逻辑,这在平时需求开发中是非常常见的,作为一款功能齐全的调度系统这当然也是必备的功能。

关于延时任务的实现原理我早期写过一篇文章《采用简易的环形延时队列处理秒级定时任务的解决方案》来介绍,ScheduleMaster也是在这个基础上改进而来。

当然了,其他的实现方式也还有很多,主流的实现方案可以参考下面这篇文章,整理的比较齐全:史上最全的延迟任务实现方式汇总!附代码(强烈推荐)

我采用的就是比较经典的时间轮算法,原理就不再重复介绍了可以移步到我前面的文章,下面看看实现效果。

实现了什么效果

我们先通过一段测试代码看看延时队列的运行情况:

代码语言:javascript
复制
 [Fact]
 public void Run()
 {
     //初始化容器
     DelayPlanManager.Init();
     Debug.WriteLine($"延时队列初始化完成时间:{DateTime.Now}");

     Func<DelayQueueSlot, Task> callback = (result) =>
      {
          var np = result as NotifyPlan;
          //模拟业务
          Debug.WriteLine($"[{DateTime.Now}]ID:{np.Key},地址:{np.NotifyUrl},延迟秒数:{np.TimeSpan}");

          return Task.CompletedTask;
      };

     //模拟生产端写入任务
     Task[] tasks = new Task[10];
     for (int i = 0; i < 10; i++)
     {
         tasks[i] = new Task(() =>
         {
             for (int k = 0; k < 200; k++)
             {
                 int rndNum = new Random().Next(20, 500);
                 DelayPlanManager.Insert(new NotifyPlan
                 {
                     NotifyUrl = "http://localhost:56655/api/1.0/value/delaypost",
                     Key = Guid.NewGuid().ToString(),
                     Callback = callback
                 }, DateTime.Now.AddSeconds(rndNum));
             }
         }, TaskCreationOptions.LongRunning);
         tasks[i].Start();
     }
     Task.WaitAll(tasks);

     //构造消费者
     while (true)
     {
        DelayPlanManager.Read();
        System.Threading.Thread.Sleep(1000);
     }
 }

代码中创建了2000个延时任务,延时范围在20秒至500秒,所以我们预测在程序启动后最快20秒就开始有信息输出,程序调式结果为:

当一个周期执行完后刚好过了1分钟:

分秒不差。

先睹为快

再看看在项目中的实际应用。

控制台创建任务页面:

不过实际使用中通过API方式创建显然更符合需求,所以一如既往地提供了开放API供业务系统接入,详细使用方式参考官方文档【使用API接入任务】。

系统提供了2种延迟模式供选择,即相对时间绝对时间,可以在系统参数中配置,默认是使用相对时间。但使用相对时间模式有一点要注意,各节点间可能存在系统时间差导致任务被多次执行,所以业务做好幂等性控制至关重要。

延时任务管理页面:

这里解释下任务的各个状态

  • 已作废,表示已经从执行计划移除
  • 已创建,表示刚创建好还没有加入执行计划
  • 已就绪,表示已加入到执行计划中等待执行
  • 已完成,表示执行成功
  • 异常,表示执行失败

继续看一下任务运行情况。

单节点执行成功:

异常重试效果:

可用的参数配置:

更多好玩的东西欢迎下载体验~

写在最后

喜欢的朋友请来一波star支持,并持续关注~~

传送门:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现了什么效果
  • 先睹为快
  • 写在最后
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档