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

分布式定时任务框架选型,写得太好了
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实现分布式协调,实现任务⾼可⽤以及分⽚,并且可以⽀持云开发。
Saturn:是唯品会⾃主研发的分布式的定时任务的调度平台,基于当当的elastic-job 版本1开发,并且可以很好的部署到docker容器上。
大肥b
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。这时候消息就可以重新被消费。
好了,今天就分享到这⾥。希望对你有所帮助!
还有更多学习⼲货,QQ搜索号805879199 即可获取~

本文发布于:2024-09-21 15:24:34,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/284539.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:任务   调度   处理   分布式
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议