大国骄傲,国产分布式调度系统,你可能了解过,可是没有深刻过

写在前面:

小编比较推崇成体系的学习,不管是什么样的技术,流行或者不流行,均可以造成一整套知识体系java

不信的,能够来看我最近的文章node

第一次见到这么齐全的redis知识图谱,老大不再用担忧个人技术linux

成体系的学习能给本身带来不少的帮助,不管是工做仍是面试仍是为了你以后的发展,今天整理这篇文章也是由于前段时间,公司要改造现有的单节点调度为分布式任务调度,因此研究了不少的相关的文档等资料,也就有了今天的文章git

当时为了那个框架,自己想要省点事,研究了目前市面上主流的开源分布式任务调度框架,可是最后用起来就一个感受:麻烦!特别是以前在一个类里写了好多个调度任务,改造起来更加麻烦。我这人又比较懒,总感受用了别人写好的工具还要改一大堆,内心就有点不舒服。github

可是绝对不能拒绝说分布式调度系统的重要性,中途插一句啊:web

分布式调度系统的重要性

分布式调度在互联网企业中占据着十分重要的做用,尤为是电子商务领域,因为存在数据量大、高并发的特色,对数据处理的要求较高,既要保证高效性,也要保证准确性和安全性,相对比较耗时的业务逻辑每每会从中剥离开来进行异步处理。面试

我的研发

因而我就想本身写一个框架,毕竟本身以为分布式任务调度在全部分布式系统中是最简单的,由于通常公司任务调度自己不可能同时调度海量的任务,很大的并发,改形成分布式主要仍是为了分散任务到多个节点,以便同一时间处理更多的任务。redis

后面有一天,我在公司前台取快递,看到这样一个现象:咱们好几个同事(包括我)在前台那从头至尾看快递是否是本身的,是本身的就取走,不是就忽略,而后我就收到了启发。这个场景类比到分布式调度系统中,咱们能够认为是快递公司或者快递员已经把每一个快递按照咱们名字电话分好了快递,咱们只须要取走本身的就好了。可是从另一个角度看,也能够理解成咱们每一个人都是从头至尾看了全部快递,而后按照某种约定的规则,若是是本身的快递就拿走,不是本身的就忽略继续看下一个。若是把快递想象成任务,一堆人去拿一堆快递也能够很顺利的拿到各自的快递,那么一堆节点本身去取任务是否是也能够很好的处理各自的任务呢?spring

就在这个灵感以后,我便开始行动,关键代码附上设计模式

package com.rdpaas.task.scheduler;

import com.rdpaas.task.common.*;

import com.rdpaas.task.config.EasyJobConfig;

import com.rdpaas.task.repository.NodeRepository;

import com.rdpaas.task.repository.TaskRepository;

import com.rdpaas.task.strategy.Strategy;

import org.slf4j.Logger; import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

import java.util.Date; import java.util.List;

import java.util.concurrent.*;

/** * 任务调度器 *

@author rongdi *

@date 2019-03-13 21:15 */

@Component

public class TaskExecutor {

private static final Logger logger = LoggerFactory.getLogger(TaskExecutor.class);

@Autowired

private TaskRepository taskRepository;

@Autowired

private NodeRepository nodeRepository;

@Autowired

private EasyJobConfig config;

/** * 建立任务到期延时队列 */

private DelayQueue<DelayItem<Task>> taskQueue = new DelayQueue<>();

/** * 能够明确知道最多只会运行2个线程,直接使用系统自带工具就能够了 */

private ExecutorService bossPool = Executors.newFixedThreadPool(2);

/** * 声明工做线程池 */

private ThreadPoolExecutor workerPool;

@PostConstruct

public void init() {

/** * 自定义线程池,初始线程数量corePoolSize,线程池等待队列大小queueSize,当初始线程都有任务,而且等待队列满后 * 线程数量会自动扩充最大线程数maxSize,当新扩充的线程空闲60s后自动回收.自定义线程池是由于Executors那几个线程工具 * 各有各的弊端,不适合生产使用 */

workerPool = new ThreadPoolExecutor(config.getCorePoolSize(), config.getMaxPoolSize(), 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(config.getQueueSize()));

/** * 执行待处理任务加载线程 */

bossPool.execute(new Loader());

/** * 执行任务调度线程 */

bossPool.execute(new Boss());

} class Loader implements Runnable

好了,至此,基本结束,可是,就像java的设计模式同样,平时不多能用到那么多,可是你不会能够吗?答案是必定的,确定不行,那么一样的,咱们是公司业务容许我大展身手能够本身发展,可是要是公司不能让你自由发挥呢?仍是要用现成的不是吗?接下来看一下我整理的比较经常使用的分布式任务调度系统

国产平台介绍

一、opencron

https://gitee.com/benjobs/ope...

opencron 是一个功能完善且通用的开源定时任务调度系统,拥有先进可靠的自动化任务管理调度功能,提供可操做的 web 图形化管理知足多种场景下各类复杂的定时任务调度,同时集成了 linux 实时监控、webssh 等功能特性。

你是否有定时执行任务计划的需求,须要在linux的crontab里一必定义任务?

  • 须要在每台linux服务器的crontab里一必定义任务;
  • 任务的执行监控太不方便了;
  • 得登陆到每台机器查看定时任务的运行结果,机器一多简直是一种灾难;
  • 对于多台机器协同处理一个任务很麻烦,如何保证多台机器上的任务按顺序依次执行?
  • 当任务运行失败,要从新执行,还得从新定义下执行时间,让其重跑,重跑完成了还得改回正常时间;
  • 正在运行的任务要kill掉很麻烦,查看进程而后才能kill ......

大国骄傲,国产分布式调度系统,你可能了解过,可是没有深刻过

二、LTS

https://gitee.com/hugui/light...

LTS,light-task-scheduler,是一款分布式任务调度框架, 支持实时任务、定时任务和 Cron 任务。有较好的伸缩性和扩展性,提供对 Spring 的支持(包括 Xml 和注解),提供业务日志记录器。支持节点监控、任务执行监、JVM 监控,支持动态提交、更改、中止任务。

完整的示例代码:

https://github.com/ltsopensou...

大国骄傲,国产分布式调度系统,你可能了解过,可是没有深刻过

三、XXL-JOB

https://gitee.com/xuxueli0323...

http://www.xuxueli.com/xxl-job

大国骄傲,国产分布式调度系统,你可能了解过,可是没有深刻过

XXL-JOB 是一个轻量级分布式任务调度框架,支持经过 Web 页面对任务进行 CRUD 操做,支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务,支持在线配置调度任务入参和在线查看调度结果。

大国骄傲,国产分布式调度系统,你可能了解过,可是没有深刻过

四、Elastic-Job

https://gitee.com/elasticjob/...

Elastic-Job 是一个分布式调度解决方案,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成。定位为轻量级无中心化解决方案,使用 jar 包的形式提供分布式任务的协调服务。支持分布式调度协调、弹性扩容缩容、失效转移、错过执行做业重触发、并行调度、自诊断和修复等等功能特性。

大国骄傲,国产分布式调度系统,你可能了解过,可是没有深刻过

五、Uncode-Schedule

https://gitee.com/uncode/unco...

Uncode-Schedule 是基于 ZooKeeper + Quartz / spring task 的分布式任务调度组件,确保每一个任务在集群中不一样节点上不重复的执行。支持动态添加和删除任务,支持添加 ip 黑名单,过滤不须要执行任务的节点。

功能概述:

  • 基于zookeeper+spring task/quartz/uncode task的分布任务调度系统。
  • 确保每一个任务在集群中不一样节点上不重复的执行。
  • 单个任务节点故障时自动转移到其余任务节点继续执行。
  • 任务节点启动时必须保证zookeeper可用,任务节点运行期zookeeper集群不可用时任务节点保持可用前状态运行,zookeeper集群恢复正常运期。
  • 支持动态添加、修改和删除任务,支持任务暂停和从新启动。
  • 添加ip黑名单,过滤不须要执行任务的节点。
  • 后台管理和任务执行监控。
  • 支持spring-boot,支持单个任务运行多个实例(使用扩展后缀)。

模块机构:

大国骄傲,国产分布式调度系统,你可能了解过,可是没有深刻过

六、Antares

https://github.com/ihaolin/an...

Antares 是一款基于 Quartz 机制的分布式任务调度管理平台,内部重写执行逻辑,一个任务仅会被服务器集群中的某个节点调度。用户可经过对任务预分片,有效提高任务执行效率;也可经过控制台 antares-tower 对任务进行基本操做,如触发,暂停,监控等。

Antares总体架构:

大国骄傲,国产分布式调度系统,你可能了解过,可是没有深刻过

Antares中的任务状态机:

大国骄傲,国产分布式调度系统,你可能了解过,可是没有深刻过

以为整理的还算齐全的,欢迎点赞+关注给小编一点动力,后期会不断更新相应的文章,谢谢

转发分享给更多人,而后能够私信“资料”获取你须要的资料哦,只要你来,只要我有,小编毫不吝啬关注公众号:Java架构师联盟,每日更新技术好文

相关文章
相关标签/搜索