前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式定时任务框架之Uncode Schedule入门

分布式定时任务框架之Uncode Schedule入门

作者头像
lyb-geek
发布2018-07-26 10:17:54
7180
发布2018-07-26 10:17:54
举报
文章被收录于专栏:Linyb极客之路Linyb极客之路

定时任务的现状

就定时任务来说,首先是操作系统层面一直支持的功能,所以我们的各种对定时任务的实现手段才能得以发挥。由于操作系统和编程语言种类繁多,本文中将重点从linux操作系统、java语言以及java生态中开源框架来介绍定时任务。

1. linux系统级的定时任务执行器:crontab 这是一个系统级的定时器,具有灵活简单的特性,同时也是缺乏管理功能和分布式支持。一般的使用方法是,使用shell脚本调用业务实现jar包。

2. java语言中的定时器:java.util.Timer 这是一个java语言内置的定时器,这是所有基于java语言的开源框架实现的基础。其中,典型的任务调度方法:

代码语言:javascript
复制
public void schedule(TimerTask task, long delay);
public void schedule(TimerTask task, Date time);
public void schedule(TimerTask task, long delay, long period);
public void schedule(TimerTask task, Date firstTime, long period);
public void scheduleAtFixedRate(TimerTask task, long delay, long period);
public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period);

3. java定时任务开源框架(常用) 3.1. Quartz(java定时任务的标准) 3.2. spring task 在spring中实现定时任务有两种方式,一是spring对quartz进行了封装,二是独立实现了定时任务的调度器称为spring task。其中spring task相对较为简单,cron表达式不支持L W;而quartz不但完整支持cron表达式,而且具有很多高级特性,如JDBCJobStore(作业仓库)、集群模式。

4. 分布式定时任务开源框架 4.1. Elastic-Job(当当网) 4.2. light-task-scheduler 4.3. clover 4.4. TBSchedule(阿里) 4.5. niubi-job 4.6. Uncode-Schedule 基于java的分布式定时任务的开源框架还是很多的,这里没有一一列举,有些框架设计的非常完善复杂,可根据具体使用场景选择适当的框架,当某些功能不符合你的预期的时候,可以去修改一下源代码实现自己想要的功能,这是开源框架的好处。

根据我们所有定时任务的特点和实际运行需求,我选择了Uncode-Schedule框架,这个框架相对简单、灵活,并且修改源代码以满足特定需求相对容易。

分布式定时任务面临的问题

对于分布式应用来说,一致性始终是首要问题,另外就是对任务和执行任务的机器的管理问题。

1. 一致性问题 1.1. 一个任务不能同时在多台机器上执行 1.2. 当某一台执行任务的机器宕机时,该机器上的任务自动重新分配至其他机器 1.3. 任务的均衡分配 1.4. 心跳检测

2. 任务的管理和监控 2.1. 任务的动态添加和删除 2.2. 控制执行任务的机器 2.3. 随时手动执行任务

Uncode-Schedule开源框架分析

Uncode-Schedule是一个实现分布式定时任务的开源框架,java语言实现,本章将从上面的几个问题入手分析该框架的实现机制。

1. 功能概述 Uncode-Schedule是基于zookeeper的分布式任务调度组件,非常小巧,使用简单,开发时只需要引入jar包,不需要单独部署服务端。而且定时任务的实现方式和原始的spring/quartz task保持一致,所以普通的定时任务改造成分布式很方便。

1.1. 它能够确保所有任务在集群中不重复,不遗漏的执行。 1.2. 单节点故障时,任务能够自动转移到其他节点继续执行。 1.3. 支持动态添加和删除任务。 1.4. 支持添加机器ip黑名单。 1.5. 支持手动执行任务。

2. 注意事项 在使用Uncode-Schedule框架开发定时任务时,需要注意几个问题: 2.1. 开发的定时任务在业务要保证幂等性。主要是为了解决单点故障时,任务转移重复执行带来的问题。 2.2. 任务节点启动时必须保证zookeeper可用。 2.3. 任务节点运行期zookeeper集群不可用时任务节点保持可用前状态运行,当zookeeper集群恢复后,任务正常运行。 2.4. 手动执行任务时,需要选择在哪台机器执行。

3. 模块架构 3.1. Uncode-Schedule分布式定时任务的设计结构如下图:

Uncode-Schedule架构图

zookeeper集群负责存储定时任务和机器的数据,起到存储数据和保持一致性的关键作用。在所有的执行任务的节点中有一个leader,它会负责任务的分配。任务的管理和监控平台可单独部署。

3.2. 每一个任务节点的内部结构如下图:

worker node结构图

执行任务的节点上支持的任务类型包括spring的封装的quartz任务和spring task;另外该框架还自定义了一种任务Uncode Task,实际上是一种由zookeeper存储调度信息的任务,最终还是由spring的调度器ThreadPoolTaskScheduler控制的,不过这种任务是可动态添加和删除的。

3. 使用方法 Uncode-Schedule框架的使用方法是很简单的,而且我也没有对原作者的使用方法做修改,所以具体使用方法可参考github上的README文档。

我根据对框架的功能完善,自己设计了一个任务的管理和监控平台。主要在其中添加了手动执行的功能,其他的监控功能会进一步完善。

4.demo地址

uncode-schedule demo地址https://github.com/rabbitgyk/uncode-schedule uncode-schedule-manage demo地址https://github.com/rabbitgyk/uncode-schedule-manage

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linyb极客之路 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定时任务的现状
  • 分布式定时任务面临的问题
  • Uncode-Schedule开源框架分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档