1. 前言

我们先思考下面几个业务场景的解决方案:

  • 支付系统每天凌晨1点跑批,进行一天清算,每月1号进行上个月清算

  • 电商整点抢购,商品价格8点整开始优惠

  • 12306购票系统,超过30分钟没有成功支付订单的,进行回收处理

  • 商品成功发货后,需要向客户发送短信提醒

类似的业务场景非常多,我们怎么解决?

很多业务场景需要我们某一特定的时刻去做某件任务,定时任务解决的就是这种业务场景。一般来说,系统可以使用消息传递代替部分定时任务,两者有很多相似之处,可以相互替换场景。

如,上面发货成功发短信通知客户的业务场景,我们可以在发货成功后发送MQ消息到队列,然后去消费mq消息,发送短信。

但在某些场景下不能互换:

时间驱动/事件驱动:内部系统一般可以通过时间来驱动,但涉及到外部系统,则只能使用时间驱动。如怕取外部网站价格,每小时爬一次

批量处理/逐条处理:批量处理堆积的数据更加高效,在不需要实时性的情况下比消息中间件更有优势。而且有的业务逻辑只能批量处理。如移动每个月结算我们的话费

实时性/非实时性:消息中间件能够做到实时处理数据,但是有些情况下并不需要实时,比如:vip升级

系统内部/系统解耦:定时任务调度一般是在系统内部,而消息中间件可用于两个系统间

2. 定时任务框架

单机

  • timer:是一个定时器类,通过该类可以为指定的定时任务进行配置。TimerTask类是一个定时任务类,该类实现了Runnable接口,缺点异常未检查会中止线程

  • ScheduledExecutorService:相对延迟或者周期作为定时任务调度,缺点没有绝对的日期或者时间

  • spring定时框架:配置简单功能较多,如果系统使用单机的话可以优先考虑spring定时器

分布式

  • Quartz:Java事实上的定时任务标准。但Quartz关注点在于定时任务而非数据,并无一套根据数据处理而定制化的流程。虽然Quartz可以基于数据库实现作业的高可用,但缺少分布式并行调度的功能

  • TBSchedule:阿里早期开源的分布式任务调度系统。代码略陈旧,使用timer而非线程池执行任务调度。众所周知,timer在处理异常状况时是有缺陷的。而且TBSchedule作业类型较为单一,只能是获取/处理数据一种模式。还有就是文档缺失比较严重

  • elastic-job:当当开发的弹性分布式任务调度系统,功能丰富强大,采用zookeeper实现分布式协调,实现任务高可用以及分片,目前是版本2.15,并且可以支持云开发,这个我写了系列教程了,在码猿技术专栏公从号可以搜索阅读。

  • Saturn:是唯品会自主研发的分布式的定时任务的调度平台,基于当当的elastic-job 版本1开发,并且可以很好的部署到docker容器上。

  • xxl-job:是大众点评员工徐雪里于2015年发布的分布式任务调度平台,是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。

3. 分布式任务调度系统对比

参与对比的可选系统方案:elastic——job (以下简称E-Job)与 xxx-job(以下简称X-Job)

项目背景及社区力量

X-Job:
大众点评公司下员工许雪里、贡献者 3人; 
github有2470star、1015fork; 
QQ讨论群6个; 
有登记在使用的超过40家公司;
文档齐全

E-Job:
当当网开源,贡献者17人; 
github有2524star、1015fork; 
QQ讨论群1个、源码讨论群1个;
有登记在使用的超过50家公司;
文档齐全; 
有明确的发展计划

支持集群部署

X-Job:集群部署唯一要求为:保证每个集群节点配置(db和登陆账号等)保持一致。调度中心通过db配置区分不同集群。

执行器支持集群部署,提升调度系统可用性,同时提升任务处理能力。
集群部署唯一要求为:保证集群中每个执行器的配置项 xxl.job.admin.addresses/调度中心地址”保持一致,执行器根据该配置进行执行器自动注册等操作。

E-Job:重写Quartz基于数据库的分布式功能,改用Zookeeper实现注册中心

作业注册中心:基于Zookeeper和其客户端Curator实现的全局作业注册控制中心。用于注册,控制和协调分布式作业执行。

多节点部署时任务不能重复执行

X-Job:使用Quartz基于数据库的分布式功能

E-Job:将任务拆分为n个任务项后,各个服务器分别执行各自分配到的任务项。一旦有新的服务器加入集群,或现有服务器下线,elastic-job将在保留本次任务执行不变的情况下,下次任务开始前触发任务重分片。

日志可追溯

X-Job:支持,有日志查询界面

E-Job:可通过事件订阅的方式处理调度过程的重要事件,用于查询、统计和监控。Elastic-Job目前提供了基于关系型数据库两种事件订阅方式记录事件。

监控告警

X-Job:调度失败时,将会触发失败报警,如发送报警邮件。

任务调度失败时邮件通知的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔

E-Job:通过事件订阅方式可自行实现

作业运行状态监控、监听作业服务器存活、监听近期数据处理成功、数据流类型作业(可通过监听近期数据处理成功数判断作业流量是否正常,如果小于作业正常处理的阀值,可选择报警。)、监听近期数据处理失败(可通过监听近期数据处理失败数判断作业处理结果,如果大于0,可选择报警。)

弹性扩容缩容

X-Job:使用Quartz基于数据库的分布式功能,服务器超出一定数量会给数据库造成一定的压力

E-Job:通过zk实现各服务的注册、控制及协调

支持并行调度

X-Job:调度系统多线程(默认10个线程)触发调度运行,确保调度精确执行,不被堵塞。

E-Job:采用任务分片方式实现。将一个任务拆分为n个独立的任务项,由分布式的服务器并行执行各自分配到的分片项。

高可用策略

X-Job:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行;

E-Job:调度器的高可用是通过运行几个指向同一个ZooKeeper集群的Elastic-Job-Cloud-Scheduler实例来实现的。ZooKeeper用于在当前主Elastic-Job-Cloud-Scheduler实例失败的情况下执行领导者选举。通过至少两个调度器实例来构成集群,集群中只有一个调度器实例提供服务,其他实例处于”待命”状态。当该实例失败时,集群会选举剩余实例中的一个来继续提供服务。

失败处理策略

X-Job:调度失败时的处理策略,策略包括:失败告警(默认)、失败重试;

E-Job:弹性扩容缩容在下次作业运行前重分片,但本次作业执行的过程中,下线的服务器所分配的作业将不会重新被分配。失效转移功能可以在本次作业运行中用空闲服务器抓取孤儿作业分片执行。同样失效转移功能也会牺牲部分性能。

动态分片策略

X-Job:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。

执行器集群部署时,任务路由策略选择”分片广播”情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时传递分片参数;可根据分片参数开发分片任务;

E-Job:支持多种分片策略,可自定义分片策略

默认包含三种分片策略:基于平均分配算法的分片策略、 作业名的哈希值奇偶数决定IP升降序算法的分片策略、根据作业名的哈希值对Job实例列表进行轮转的分片策略,支持自定义分片策略

elastic-job的分片是通过zookeeper来实现的。分片的分片由主节点分配,如下三种情况都会触发主节点上的分片算法执行:a、新的Job实例加入集群 b、现有的Job实例下线(如果下线的是leader节点,那么先选举然后触发分片算法的执行) c、主节点选举”

4. 和quartz框架对比

  • 调用API的的方式操作任务,不人性化;

  • 需要持久化业务QuartzJobBean到底层数据表中,系统侵入性相当严重。

  • 调度逻辑和QuartzJobBean耦合在同一个项目中,这将导致一个问题,在调度任务数量逐渐增多,同时调度任务逻辑逐渐加重的情况加,此时调度系统的性能将大大受限于业务;

  • Quartz关注点在于定时任务而非数据,并无一套根据数据处理而定制化的流程。虽然Quartz可以基于数据库实现作业的高可用,但缺少分布式并行调度的功能。

5. 综合对比

6. 总结和结论

共同点:

E-Job和X-job都有广泛的用户基础和完整的技术文档,都能满足定时任务的基本功能需求。

不同点:

X-Job 侧重的业务实现的简单和管理的方便,学习成本简单,失败策略和路由策略丰富。推荐使用在“用户基数相对少,服务器数量在一定范围内”的情景下使用。

E-Job 关注的是数据,增加了弹性扩容和数据分片的思路,以便于更大限度的利用分布式服务器的资源。但是学习成本相对高些,推荐在“数据量庞大,且部署服务器数量较多”时使用。

7. 附定时任务的其他方案

发货后超过10天未收货时系统自动确认收货的多种实现方式:

  • 每天定时半夜筛选第二天 可以自动确认收货的订单,然后第二天 每10分钟 执行一次确认收货 开销不会太大吧 时间也相对精确

  • 自动确认收货这个状态如果仅仅是让客户端看的话,等用户下一次上线的时间,做一次运算就可以了。

  • 延迟和定时消息投递

  • ActiveMQ提供了一种broker端消息定时调度机制。适用于:1、不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,2、想让消息没隔一定时间投递一次,一共投递指定的次数

  • RabbitMQ可以针对Queue和Message设置 x-message-tt,来控制消息的生存时间,如果超时,则消息变为dead letter。利用DLX,当消息在一个队列中变成死信后,它能被重新publish到另一个Exchange。这时候消息就可以重新被消费。

好了,今天就分享到这里。希望对你有所帮助!、

往期推荐

2.3W字,这可能是把Nginx讲得最全面的一篇文章了,建议收藏备用

架构设计分享:项目用得到的多级缓存架构设计方案

案例分享,git项目持续集成实践

SpringBoot + Redis搭建支撑10w 人的秒杀抢单系统!

100多个高频MySQL面试问题及答案

Java8 Stream:20+实际例子,玩转集合的筛选、归约、分组、聚合

扩展Redis的JSON处理模块,非常强调性能的RedisJson!速学

ELK 搭建 TB 级海量日志监控系统,这个太强了!

这个注解能够提升Spring Boot项目中API接口并发能力

回复干货】获取精选干货视频教程

回复加群】加入疑难问题攻坚交流群

回复mat】获取内存溢出问题分析详细文档教程

回复赚钱】获取用java写一个能赚钱的微信机器人

回复副业】获取程序员副业攻略一份

好文请点赞+分享

开源分布式定时任务框架技术选型相关推荐

  1. 服务化框架技术选型实践

    前言 首先本文不讨论为什么要服务化,包括服务化的优点缺点. 其次本文也不讨论什么是微服务,也不讨论微服务和SOA的区别. 最后本文也不讨论哪个技术最优. 服务框架构成 最基本的服务框架 基本的服务化框 ...

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

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

  3. 字节跳动开源分布式训练框架BytePS,登上GitHub热榜

    问耕 发自 凹非寺 量子位 出品 | 公众号 QbitAI 字节跳动开源了通用分布式训练框架BytePS,这个框架支持TensorFlow.Keras.PyTorch.MXNet,可以运行在TCP或R ...

  4. 快手八卦!突破TensorFlow、PyTorch并行瓶颈的开源分布式训练框架来了!

    来源:AI前线本文约5200字,建议阅读8分钟 本文介绍了专门针对分布式场景设计了特定的优化算法同比,性能较同类提升60%. 近日,快手和苏黎世理工宣布开源分布式训练框架 Bagua(八卦),相比于 ...

  5. Java 开源分布式缓存框架Ehcache

    Ehcache 是一个Java实现的开源分布式缓存框架,EhCache 可以有效地减轻数据库的负载,可以让数据保存在不同服务器的内存中,在需要数据的时候可以快速存取.同时EhCache 扩展非常简单, ...

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

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

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

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

  8. 开源分布式计算系统框架比较

    开源分布式计算系统框架(Storm,Spark, MapReduce ) 目前流行的分布式计算框架主要有 Hadoop MapReduce, Spark Streaming, Storm; 这三个框架 ...

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

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

  10. 【转】服务化框架技术选型与京东JSF解密

    声明:本文转载自微信公众号"开涛的博客",转载务必声明. 作者:章耿,原京东资深架构师,曾负责京东服务框架,配置中心等基础平台.近十年工作经验,专注于基础中间件等底层技术架构,对分 ...

最新文章

  1. LabVIEW纹理分析(基础篇—9)
  2. hibernate 多对多(many-to-many)
  3. spring boot 架构问题 时间处理 (映射,时区问题)
  4. 一个类可以实现多个接口吗_Java入门:基础知识(面向对象:接口)
  5. C++的decltype
  6. Pandas入门教程(三)
  7. 脚本清理maven项目打包残留文件,节省磁盘空间
  8. 为热门项目 若依(ruoyi) 添加flyway,自动管理数据库版本
  9. 战地一的服务器在哪个文件夹,战地1怎么加入服务器 战地1加入服务器方法
  10. android4.0 禁止横竖屏切换使用 android:configChanges=orientation|keyboardHidden无效
  11. Python数据库模块pymssql连接SQLServer数据库操作详解
  12. 电脑丢失api-ms-win-core-libraryloader-|1-1-1.dll怎么办
  13. 自学人工智能途径_成为数据科学家,AI或ML工程师的自学途径
  14. Postman测试导出导入Excel教程
  15. 基于 Vue3 的颜色选择器
  16. 极光推送 简书android,极光推送第一篇:配置
  17. PHP字节转换,KB换算MG、GB、TB
  18. 欧阳的科研历程-1 目标
  19. 王牌战士服务器维修,王牌战士开服时间表 开服时间一览[多图]
  20. 分时线的9代表什么_A股市场:股票集合竞价时涨停,9点20分主力却突然撤单,代表着什么?...

热门文章

  1. 浅谈网络中数字签名技术
  2. Retina屏兼容处理
  3. 《动森》为何流行:“我就是想找个地方待着”
  4. iOS 音乐播放器(二)
  5. 网络发现已关闭。网络计算机和设备不可见。请启用网络和共享中心中的网络发现。
  6. HEVC帧内预测学习(一)CTU、CU、PU、TU单元划分的理解
  7. 发邮箱被对方服务器退回,别人给我发邮件总被退回给他,这是怎么回事?
  8. python queue put阻塞_python queue length_queue length_python queue put
  9. web前端学习(十)flex布局
  10. mysql 查询优化实验报告_数据库优化查询实验报告.docx