此内容来自一位好朋友的分享,也是当初建议我写博客提升的朋友。内容只做转载,未做修改。

定时任务选型

背景

  目前项目定时任务采用Spring Task实现,随着项目需求的迭代,新增的定时任务也越来越多。我们也即将面临如下

问题:

  • 任务维护管理(不够直观,不方便管理)

  • 单机事故 (故障)

  • 任务调度混乱(串行,并行。串行可能阻塞)

那么,我们的需求是什么?

  • 图形化管理
  • 支持集群,甚至分布式
  • 任务调度灵活

选型

  重点看了几个目前比较流行的框架:
  • quartz
  • xxl-job
  • elastic-job
  • saturn
  豪不夸张的说,java技术栈中的定时任务框架有两种: quartz其它

Quartz

  quartz是一个基于数据库的调度框架。支持集群,调度灵活。

缺点:

  • 无图形化界面,只提供了API,不方便管理
  • 通过抢占数据库锁来防止多个节点执行同个任务。这也意味着当存在过多节点,任务多且执行频繁的时候可能会有性能问题。

xxl-job

  xxl-job是一款基于quartz封装框架。相比quartz, 其支持友好的图形化界面,功能更为强大。

特色功能:

  • 调度器与执行器分离设计
  • 支持集群,支持分布式(通过分片可完美支持)
  • 任务管理灵活、强大(调度器管理页面可直接写源码)
  • 多语言支持
  • 调度日志及执行日志
  • 负载均衡
  • 故障转移、失败重试
  • 全异步,更轻量
  • 线程隔离(快、慢线程池)

缺点:

  • 抢占锁问题

Elastic-job-lite

  elastic-job也是一款基于quartz封装的框架。对比xxl-job, 两者设计上完全不同,xxl-job为中心化设计,通过调度中心下发调度指令给执行中心。而elastic-job则为无中心化设计。

特色功能:

  • 无中心化设计
  • 解决了quartz的抢占数据库锁问题,改为了zookeeper。
  • 分片功能强大(整体都倾向于分片设计)

缺点:

  • 引入分片机制后,会引入更多复杂的问题,例如拿到分片的机器执行失败怎么处理等,目前还不是很完善
  • 引入注册中心zookeeper。 比较重,还要考虑zookeeper集群

Saturn

  saturn 是基于elastic-job-lite的封装,整体特性与elastic-job-lite相似。故不作具体描述。

对比

以上,分别简述了各个框架,接下来,来个更为直观的表格:

从定时器的选型,到透过源码看XXL-Job(上)的更多相关文章

  1. 从定时器的选型,到透过源码看XXL-Job(下)

    透过源码看xxl-job (注:本文基于xxl-job最新版v2.0.2, quartz版本为 v2.3.1. 以下提到的调度中心均指xxl-job-admin项目) 上回说到,xxl-job是一个中 ...

  2. 追源索骥:透过源码看懂Flink核心框架的执行流程

    li,ol.inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dt, ...

  3. 透过源码看懂Flink核心框架的执行流程

    前言 Flink是大数据处理领域最近很火的一个开源的分布式.高性能的流式处理框架,其对数据的处理可以达到毫秒级别.本文以一个来自官网的WordCount例子为引,全面阐述flink的核心架构及执行流程 ...

  4. 透过源码看看Redis中如何计算QPS

    通常我们采集Redis的性能数据时,或者想要知道Redis当前的性能如何时,需要知道这个实例的QPS数据,那么这个QPS数据是如何计算的呢?我们都有哪些办法或者这个QPS ? QPS顾名思义就是每秒执 ...

  5. 透过源码分析ArrayList运作原理

    List接口的主要实现类ArrayList,是线程不安全的,执行效率高:底层基于Object[] elementData 实现,是一个动态数组,它的容量能动态增加和减少.可以通过元素下标访问对象,使用 ...

  6. 通过源码看android系列之AsyncTask

    整天用AsyncTask,但它的内部原理一直没有特意去研究,今天趁着有时间,码下它的原理. 具体用法就不再说明,相信大家已经用得很熟练了,我们今天就从它怎么运行开始说.先新建好我们的AsyncTask ...

  7. 通过源码看android系列之multidex库

    我们在开发项目时,喜欢引入好多的第三方包,大大的方便了我们的开发,但同时,因为android方法总数的限制,不能超过65k,然而呢,随着我们的开发,65k最终还是会超过,所以,google就给出了这个 ...

  8. 通过源码看原理之 selenium

    # selenium的历史1. selenium1.x:这个时候的selenium,使用的是JavaScript注入技术与浏览器打交道,需要Selenium RC启动一个Server,将操作Web元素 ...

  9. 通过源码了解ASP.NET MVC 几种Filter的执行过程

    一.前言 之前也阅读过MVC的源码,并了解过各个模块的运行原理和执行过程,但都没有形成文章(所以也忘得特别快),总感觉分析源码是大神的工作,而且很多人觉得平时根本不需要知道这些,会用就行了.其实阅读源 ...

随机推荐

  1. 锤子科技向OpenBSD基金会捐款195 万

    导读 专注于提供 OpenBSD 资讯的网站 OpenBSD Journal 昨日报道了锤子科技成为 OpenBSD 基金会 2019 年首位铱金捐赠者的消息. 根据 OpenBSD Journal ...

  2. C++面试常见问题——09static关键字

    static关键字 局部变量 局部变量 局部变量是最常见的量,编译器不会对其进行初始化,除非对其显式赋值,不然初始值是随机的. 普通局部变量存储在栈空间,使用完毕后会立即被释放. 静态局部变量 静态局 ...

  3. Oracle 新建用户、赋予权限

    1.新建用户 新建用户: create User username Identified by password 修改用户密码: alter User username Identified by p ...

  4. CNN经典模型VGG

    VGG是一个很经典的CNN模型,接触深度学习的人大概都有所耳闻.VGG在2014年被提出并拿来参加ImageNet挑战赛,最终实现了92.3%的正确率,得到了当年的亚军.虽然多年过去,又有很多新模型被 ...

  5. 092-PHP定义索引数组

    <?php $arr=array('name'=>'PHP','age'=>22,7=>25,33,21=>35,56); //定义一个索引数组 echo '数组$arr ...

  6. 087-把PHP数组中的元素按随机顺序重新排列shuffle

    <?php $arr=array(3,23,'A','f','123','hello'); //定义一个数组 echo '排序之前的数组信息:<br>'; print_r($arr) ...

  7. IISHelper操作iis

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. Storm 流式计算框架

    1. 简介 是一个分布式, 高容错的 实时计算框架 Storm进程常驻内存, 永久运行 Storm数据不经过磁盘, 在内存中流转, 通过网络直接发送给下游 流式处理(streaming) 与 批处理( ...

  9. Sklearn 预处理数据

    ## 版权所有,转帖注明出处 章节 SciKit-Learn 加载数据集 SciKit-Learn 数据集基本信息 SciKit-Learn 使用matplotlib可视化数据 SciKit-Lear ...

  10. python基础(一)内置类型及方法

    python 内置类型主要包含7大类: 数字 序列 映射 文件 类 实例 异常 其中,最常用数据类型为序列 序列 python中包含7种内建序列 列表(list):由方括号构成,用逗号分隔项目: [a ...