2019独角兽企业重金招聘Python工程师标准>>>

分布式定时任务框架---Uncode Schedule

 rabbitGYK 关注

2016.11.27 20:36* 字数 1446 阅读 7141评论 5喜欢 36赞赏 1

博客原文

作为一个支付公司的项目组,经常会有很多对账功能(签约对账、支付订单对账、记账对账),这些都是以定时任务的形式实现,组内经常需要维护一些定时任务,在使用过程中主要关注定时任务的稳定性、健壮性和可控性,分布式定时任务+任务监控基本满足使用需求。

定时任务的现状

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

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

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

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. 源码分析
见下一篇文章。

转载自:
http://rabbitgyk.com/2018/01/27/uncode-schedule-framework/
https://www.jianshu.com/p/780235132d81

转载于:https://my.oschina.net/mengzhang6/blog/2413727

分布式定时任务框架---Uncode Schedule相关推荐

  1. 第五章 - 分布式定时任务框架ElasticJob之SpringBoot整合SimpleJob作业(实战一)

    系列文章目录 第一章 - 分布式定时任务框架ElasticJob之JavaApi整合Simple作业 第二章 - 分布式定时任务框架ElasticJob之JavaApi整合DataflowJob作业 ...

  2. 轻量级分布式定时任务框架XXL-Job

    轻量级分布式定时任务框架XXL-Job: XXL-JOB是一款轻量级的分布式定时任务框架,上手简单,操作容易,XXL-Job可以到官网下载也可以去gitee上拉取源码,其中核心模块分页两个:1:是分布 ...

  3. 全云化架构(十一):分布式定时任务框架对比

    分布式定时任务框架对比 把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式.叫做分布式定时任务. 常见的分布式定时任务平台有elastic-job , ...

  4. 基于spring+quartz的分布式定时任务框架

    http://www.cnblogs.com/aaronfeng/p/5537177.html 问题背景 我公司是一个快速发展的创业公司,目前有200人,主要业务是旅游和酒店相关的,应用迭代更新周期比 ...

  5. 分布式定时任务框架选型,写得太好了!

    点击关注公众号,实用技术文章及时了解 为什么我们需要定时任务 我们先思考下面几个业务场景的解决方案: 支付系统每天凌晨1点跑批,进行一天清算,每月1号进行上个月清算 电商整点抢购,商品价格8点整开始优 ...

  6. 分布式定时任务框架Elastic-Job的使用

    为什么80%的码农都做不了架构师?>>>    一.前言 Elastic-Job是一个优秀的分布式作业调度框架. Elastic-Job是一个分布式调度解决方案,由两个相互独立的子项 ...

  7. 深度学习核心技术精讲100篇(五十五)-深度解读分布式定时任务框架

    前言 我们先思考下面几个业务场景的解决方案: 支付系统每天凌晨1点跑批,进行一天清算,每月1号进行上个月清算 电商整点抢购,商品价格8点整开始优惠 12306购票系统,超过30分钟没有成功支付订单的, ...

  8. java 项目初始化一个定时任务_elastic-job 分布式定时任务框架 在 SpringBoot 中如何使用(一)初始化任务并定时执行...

    第一篇需要实现一个最简单的需求:某个任务定时执行,多台机子只让其中一台机子执行任务 一.安装 分布式应用程序协调服务 zookeeper,安装步骤在链接里面 二.在springboot项目中引入 el ...

  9. 使用redis分布式锁+lua脚本实现分布式定时任务控制demo

    2019独角兽企业重金招聘Python工程师标准>>> 分布式系统经常要遇到定时任务执行的问题,不能重复执行,但很多时候又不能统一到一个微服务里面,因为这样就失去了微服务的意义.由于 ...

  10. 【xxl-job】轻松实现分布式定时任务demo实例

    [项目描述] 前段时间专门独立了一个spring boot服务,用于做和第三方erp系统的对接工作.此服务的第一个需求工作就是可以通过不同的规则,设置不同的定时任务,从而获取erp系统的商品数据.所以 ...

最新文章

  1. 2007过年休息的日子
  2. 【c语言】蓝桥杯算法训练 sign函数
  3. 为什么python画不了图-python-为什么pygame不画一个圆?
  4. c memcpy 与 strcpy 区别
  5. Java,Math类中的ceil、floor和round函数源码解析以及自己重写实现
  6. JavaScript实现k-nearest算法(附完整源码)
  7. 教你学会Linux/Unix下的vi文本编辑器
  8. Hibernate一对多映射示例注释
  9. mamp安装php扩展,向MAMP添加GMP PHP扩展
  10. HDU5904 LCIS【LCIS】
  11. Mac 安装 Grunt
  12. 论文笔记_S2D.59_2015-ICRA_V-LOAM_低漂移、鲁棒和快速的视觉-激光 里程计和建图
  13. 通过sql脚本可以从数据库中查到数据,但是通过jdbc却获取不到
  14. 数学基础知识02——常用积分公式
  15. 解决BT5不能上网的问题
  16. python语言中的转义字符_怎么使用Python转义字符
  17. 万字拆解Ubras:年销15亿、暴涨10倍,内衣新秀的春天到了?
  18. c语言程序设计对称字符串,清华大学C语言程序设计 L13_字符串精选.pdf
  19. ARM——开发工具—编译器
  20. CIC详细设计说明文档

热门文章

  1. mac双系统w ndows8,U盘如何安装MAC双系统
  2. java做 binggo,CONTRIBUTING.md
  3. 计算机怎么连接手机网络,电脑怎么连接手机的热点上网?
  4. 毕设过程中使用WPS的自定义生成目录中混入图片等非相关元素
  5. 前端做CRM管理系统是做什么_总结一下最近做crm客户管理系统使用到的前端知识点...
  6. 修改WMB执行组监听端口
  7. PS卸载不彻底,ADMUI3删除不掉怎么办
  8. 软件测试项目反思,软件测试之项目线上问题总结与反思
  9. WPS 调整多级编号
  10. word自定义多级编号列表