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

定时任务选型

背景

  目前项目定时任务采用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. use matplotlib to draw scatter plot

    There are many pionts in this kind of table. How to do it? We can use scatter() to draw it. Code: im ...

  2. 《学习R》笔记:科学计算器、检查变量和工作区、向量、矩阵和数组、列表和数据框

    一.第二章 科学计算器 要检查两个数字是否一样,要使用 all.equal() ,不要使用 == ,== 符号仅用于比较两个整型数是否存在相同 . > all.equal(sqrt(2)^2,2 ...

  3. Python 比较 相等性 真值

    1 == 操作符测试 值 的相等性: is 测试对象的一致性.注意短字符串的is相等性测试,PVM会缓存短字符串,s1 is s2 将返回true. 2 false:"", [], ...

  4. C#重写窗体的方法

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. 第十篇 Form表单

    Form表单 阅读目录(Content) Form介绍 普通的登录 使用form组件 Form那些事儿 常用字段演示 校验 使用Django Form流程 补充进阶 应用Bootstrap样式 批量添 ...

  6. DRF教程10-关系字段

    https://www.django-rest-framework.org/api-guide/relations/ 在编程中核心的就是数据结构. 关系字段用来表示model之间的关系,比如外键,m2 ...

  7. spring第9天(事务)

    依赖:spring-context,spring-jdbc(这个本身有依赖spring-tx,关于事务的),druid,mysql-connector-java,aspectjweaver五个 由于我 ...

  8. 启用sql日志

    SHOW VARIABLES LIKE "general_log%"; -- 查询是否启用日志 SET GLOBAL general_log = 'ON';  -- 设置启用 SE ...

  9. 基于Ambari Server部署HDP集群实战案例

    基于Ambari Server部署HDP集群实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.部署Ambari Server端 博主推荐阅读: https://www.c ...

  10. 洛谷 P2004 领地选择

    题目传送门 解题思路: 二维前缀和. AC代码: #include<iostream> #include<cstdio> using namespace std; ][],an ...