在实际开发中,我们经常会遇到需要定时运行batch,每天定时执行一次对账操作的场景。通常使用spring定时框架、ScheduledExecutorService等定时任务。但是这些只适用于单机。当有多个节点时,会出现定时任务重复执行的问题。这时候就需要使用分布式定时任务来解决。分布式定时任务不仅解决了上述问题,还提供了分片处理提高处理效率、分布式调度协调、弹性伸缩、故障转移等优势。1、常见的分布式定时任务有哪些?目前开源的分布式定时任务很多,下面列举一些常用的:elastic-job:当当网开发的弹性分布式任务调度系统,功能丰富强大,由zookeeper实现分布式协调,高可用,任务分片,并支持云开发。xxl-job:大众点评员工徐学礼于2015年发布的分布式任务调度平台,是一个轻量级的分布式任务调度框架。其核心设计目标是快速开发、易学、轻量、易扩展。Saturn:是唯品会自主研发的分布式定时任务调度平台。基于当当网的elastic-jobversion1开发,可以很好的部署在docker容器上。其中elastic-job(E-job)和xxl-job(X-job)应用比较广泛。两者的技术选型不再具体讨论。下面对两者进行综合比较,供参考,可结合实际业务技术场景进行选择。2、elastic-job的工作碎片化策略有哪些?结合实际场景,选择合适的作业分片策略,进行分片处理,可以提高任务的执行效率。下面是elastic-job提供的分片策略。平均分配作业分片策略。OdevitySortByNameJobShardingStrategy。策略说明:基于平均分配算法的分片策略也是默认的分片策略。当作业数能被服务器数整除时,就会均匀分布。(首先是IP地址)服务器。缺点:平均分片策略,当分片数小于作业服务器数时,作业总是会分配给IP地址高的服务器,而IP地址低的服务器闲置。2.OdevitySortByNameJobShardingStrategy分片策略com.dangdang.ddframe.job.lite.api.strategy.impl.OdevitySortByNameJobShardingStrategy策略说明:该策略的核心思想是利用IP升/降算法根据奇数或降序实现分片作业名哈希值的偶数,如果作业名的哈希值为奇数,则IP按照升序排列,如果作业名的哈希值为偶数,则IP按照降序排列。该方法用于将不同的作业分片负载均衡到不同的服务器。如果jobname的hash值为偶数,则采用IP降序算法实现分片,避免了采用平均分配算法时IP地址较低的服务器空闲的问题。它在内部使用平均算法。3.RotateServerByNameJobShardingStrategy分片策略com.dangdang.ddframe.job.lite.api.strategy.impl.RotateServerByNameJobShardingStrategy策略说明:根据job名称的hash值轮换server列表的sharding策略,内部也是采用averagesharding计算。,4.自定义sharding策略可以根据需求实现JobShardingStrategy接口和sharding方法。下面是Spring中切换自定义分配策略的配置方法。3.总结elastic-job提供的三种sharding策略,总体上还是采用了averagesharding算法,只是实例排序不同而已。支持自定义分片策略您可以根据自己的需要自定义分片策略。在实际项目应用中,多采用平均分片策略。
