xxl-job是一个分布式定时任务调度框架,功能强大,底层使用自己实现的rpc框架进行注册和管理,数据库使用mysql,调度触发使用数据库锁来作为调度锁。

xxl-job主要分为调度中心admin以及任务,任务引入依赖jar包并配置启动类为spring所管理的bean后,将自动通过spring-bean提供的initMethod进行启动线程选择一个端口进行注册以及监听任务调度。

公司目前引入xxl-job框架代替quartz框架作为分布式任务调度组件,并在其之上进行一定开发以及优化,所以这篇文章主要分享一些深入使用,主要是概念的详细介绍。

系统关键概念介绍

执行器

配置中心配置的执行器,概念上对应执行定时任务的服务,支持分布式调度以及调度的各种路由规则配置。注册方式支持自动注册和手动配置机器地址两种方式,心跳时间间隔默认为30s,失效时间90s。

执行器自动注册后,调度中心页面依旧有最长30秒的延迟显示,原因是数据库中注册表更新后,展示执行器的表是由另一个守护线程去更新的,更新频率为默认心跳时间30s,所以管理台展示会有延迟,但不影响任务调度。

任务

任务以执行器为维度配置,每个任务必须属于一个执行器,当任务触发时会根据该任务所属的执行器去寻找执行器的地址列表,然后通过配置的路由规则以及阻塞规则去去执行。

任务支持本地任务以及远程任务,本地任务即按照执行方写好的业务逻辑执行。远程任务通过GLUE,在调度中心管理台写好代码,分发到执行方去执行。建议无特殊需求的话,统一使用本地任务。

任务配置项描述

1. 执行器:选择该任务由哪个执行器去执行

2. 任务描述:简单描述该任务的功能以及作用,如:订单定时跑批

3. 路由策略:设置任务执行时,如何去选择执行器,高频任务建议使用一致性哈希或者第一台执行

4. Cron:Cron表达式,描述任务运行的时间

5. 运行模式:BEAN即为接入服务配置在本地对应的handler运行,其他方式均为管理台设置代码交由接入服务远程执行

6. JobHandler:运行模式为BEAN时必填,值应当为接入服务本地执行任务的handler

7. 阻塞策略:当同一任务多次调度到同一台执行器时,执行器应当使用的策略

8. 子任务ID:如配置,则该任务完成后自动触发一次子任务的执行

9. 任务超时时间:配置后当任务超时时将自动终止任务执行。

10. 失败重试次数:任务失败后重试的次数。

11. 负责人:一般为该任务接入方的负责人

12. 报警邮件:任务报警后发送的邮件地址

13. 任务参数:若配置了任务参数,任务调度时将发送任务参数至执行方handler。

阻塞策略

阻塞策略即同一个任务在执行器的阻塞执行策略。由执行器端控制。典型场景为:任务A分发到执行器A执行,此时任务A再次触发并分发到执行器A,此时根据阻塞策略选择的不同将会有以下三种执行策略:

1. 单机串行 该策略下,同一执行器收到同一任务的调度触发时,若已有任务正在执行,会将后续的任务放入执行线程的队列中,等待线程轮询继续执行,可能会导致线程队列阻塞过多任务导致内存过高,高频且耗时较长任务慎用

2. 丢弃后续调度 该策略下,同一执行器收到同一任务的调度触发时,若已有任务正在执行,会直接丢弃后续同一任务的调度,推荐使用

3. 覆盖之前调度 该策略下,同一执行器收到同一任务的调度触发时,若已有任务正在执行,将会直接停止正在执行的任务(通过线程InterruptedException异常以及volatile变量判断),并将新任务放入队列。一般情况下不建议使用

路由策略

路由策略即任务在配置中心进行调度分发时,选择执行器的策略。由配置中心端控制。典型场景为:任务A触发执行,任务A对应的执行器有执行器A,B,C,D,此时根据路由策略的选择将会有以下几种分发情况

1. 第一个:始终选择第一台执行器作为任务执行器,不论该任务执行器是否正常。

2. 最后一个:始终选择最后一台作为任务执行器

3. 轮询:每个执行器轮流执行

4. 随机:随机选择一个执行器执行

5. 一致性HASH:根据任务ID做一致性哈希选择执行器,同一个任务必定只分发到同一个执行器。高频或耗时较长任务推荐使用

6. 最不经常使用:选择平均使用频率最低的执行器。

7. 最近最久未使用:选择最近的最久未使用的执行器。

8. 故障转移:分别进行心跳检测,选择第一台心跳检测正常的机器执行。

9. 忙碌转移:分别进行忙碌检测,选择第一台空闲的机器执行。

10. 分片广播:广播到所有执行器执行,并提供分片参数,分片参数获取方式如下,应用在被触发时动态获取自己是第几个分片,共有几个分片:

日志问题

xxl-job相关日志使用默认使用slf4j作为日志框架,使用专门的API写入日志时,会输出2种日志,客户端日志与服务端日志

客户端日志

客户端日志根据配置文件中配置的logpath指定,根据源码分析,客户端日志将通过FileOutputStream写到对应文件,且无法通过配置修改,所以只好修改了源码中的逻辑,改为该值为空未配置时,直接通过slf4j写入。

服务端日志

使用xxljob的日志api输出日志时,日志也会在调度管理台看到,能看到的原理是xxl-job管理台会通过rpc调用执行器的接口,执行器收到请求后从指定的日志文件中读取执行的日志并返回,这里存在一个比较麻烦的问题,就是xxl-job这种日志的逻辑,无法很好的兼容到项目统一的日志模块里,十分不便。

所以实际使用过程中,我们在xxl-job管理台查询日志时,对其进行了改造,修改为不从rpc查询,而是走我们日志管理的搜索引擎根据执行的jobid查询相关日志,结合客户端日志输出的改造,从而统一xxl-job和我们系统间的日志管理。

框架目前发现的缺点以及存在的问题

  1. 目前定时任务的调度串行是依赖db锁的,某个子微服务或者子系统内部使用还好,但是不适合整个公司级别共用,这点和数据库的耦合比较高,并没有本地缓存之类的,对数据库的HA依赖非常高。
  2. 管理模块以及权限模块,组内和小公司用用可以,不适合作为多个系统多个部门之间共用的中间件。
  3. 管理台存在一些简单的安全bug,sql注入和js脚本注入非常简单。(公司的安全测试测出来的)
  4. 相关协议支持较差,使用自己实现的RPC协议,如果需要dubbo或者spring cloud,需要自己拓展。并且虽然底层是netty,但是本身对netty异常的封装并不是很好,导致一些奇怪的网络问题或者其他的协议,会报莫名其妙的错,没有一定netty理解的人是看不懂的,这点我提了Issue,不过出于这套框架解耦与独立的设计,估计是不会支持dubbo和spring cloud的。
  5. 上面提到的,日志模块更建议自己整体修改下写入逻辑,管理台看不到无所谓,(毕竟定时任务也没谁会去管理台看日志,并且这部分日志写多了对性能和网络开销有影响的),写到本地使用elk之类的再查就可以了。
  6. 定时任务触发的流水号或者跟踪id,需要改动原框架,否则也会影响后续日志追踪的问题。

总体而言这是一个很不错的框架,关于定时任务的执行器和调度器关系也很优雅,值得拓展或者进行一定定制开发。目前使用来,稳定性也没有问题。

分布式系统:分布式任务调度xxl-job较深入使用的更多相关文章

  1. 转载《分布式任务调度平台XXL-JOB》

    <分布式任务调度平台XXL-JOB>       博文转自 https://www.cnblogs.com/xuxueli/p/5021979.html 一.简介 1.1 概述 XXL-J ...

  2. 分布式任务调度平台XXL-JOB

    <分布式任务调度平台XXL-JOB>       一.简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并 ...

  3. 分布式任务调度平台XXL-JOB搭建教程

    关于分布式任务调度平台XXL-JOB,其实作者 许雪里 在其发布的中文教程中已经介绍的很清楚了,这里我就不做过多的介绍了,关于其搭建教程,本人依照其文档搭建起来基本上也没遇到啥问题,这里通过博客的形式 ...

  4. 《分布式任务调度平台XXL-JOB》

    一.简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 1.2 特性 1.简单:支 ...

  5. 分布式任务调度系统xxl-job搭建(基于docker)

    一.简介 XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 更多介绍,请访问官网: http://w ...

  6. XXL-JOB分布式任务调度平台安装与部署

    配XXL-JOB分布式任务调度平台安装与部署

  7. 一文读懂分布式任务调度平台XXL-JOB

    本文主要介绍分布式任务调度平台XXL-JOB(v2.1.0版本),包括功能特性.实现原理.优缺点.同类框架比较等 基本介绍 项目开发中,常常以下场景需要分布式任务调度: 同一服务多个实例的任务存在互斥 ...

  8. 分布式任务调度平台XXL-JOB快速使用与问题总结

    1.XXL-JOB简介 XXL-JOB is a lightweight distributed task scheduling framework. It's core design goal is ...

  9. 【Distributed】分布式任务调度平台

    一.概述 什么是定时任务 二.Java实现定时任务方式 2.1 Thread 2.2 TimerTask 2.3 ScheduledExecutorService 2.4 Quartz 引入maven ...

随机推荐

  1. SpringBoot基于JustAuth实现第三方授权登录

    1. 简介   随着科技时代日渐繁荣,越来越多的应用融入我们的生活.不同的应用系统不同的用户密码,造成了极差的用户体验.要是能使用常见的应用账号实现全应用的认证登录,将会更加促进应用产品的推广,为生活 ...

  2. 解决因缺少驱动程序,导致“未在本地计算机上注册microsoft.ace.12.0”异常

    写了一个winform程序,功能是选择一个excel表格,把里面的内容写进sqlite数据库中,在本地测试没问题,但是在其他电脑上就会报错"未在本地计算机上注册microsoft.ace.1 ...

  3. 软件测试最常用的 SQL 命令 | 掌握基本查询、条件查询、聚合查询

    1.DML核心CRUD增删改查 缩写全称和对应 SQL: * DML 数据操纵语言:Data Manipulation Language * Create 增加:insert * Retrieve 查 ...

  4. Python编程基础:循环结构

    一.为什么要用循环 现在有一个任务,要求你输出一百遍"好好学习,天天向上!",想一想,你会怎么做? (一)老老实实的笨方法 print("第1遍写:好好学习,天天向上!& ...

  5. Python利用openpyxl带格式统计数据(2)- 处理mysql数据

    上一篇些了openpyxl处理excel数据,再写一篇处理mysql数据的,还是老规矩,贴图,要处理的数据截图: 再贴最终要求的统计格式截图: 第三贴代码: 1 ''' 2 #利用openpyxl向e ...

  6. 关于新创公司所需的icp,网文,软著和备案的申请

    刚从一个集团离职来到了创业团队,前期是什么都没有,甚至是公司名字都不知道,哈哈.所以就有了后面的坑踩了一遍又一遍.刚开始是在霍尔果斯注册,结果办icp费了半年的时间,东找西找还没下证.又碰上新疆严查不 ...

  7. (五)cp命令复制文件或者目录

    一.cp的含义.功能及命令格式 cp(英文copy的缩写)命令可以将一个文件或者目录从一个位置复制到另外一个位置.cp的功能就是将一个文件复制成 一个指定的目的文件或者复制到一个指定的目录中,兼具复制 ...

  8. 容器编排系统K8s之PV、PVC、SC资源

    前文我们聊到了k8s中给Pod添加存储卷相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14180752.html:今天我们来聊一下持久存储卷相关话题 ...

  9. CentOS7 实战源码安装mysql5.7.17数据库服务器

    CentOS7 实战源码安装mysql5.7.17数据库服务器 简介:实战演练mysql数据库服务器的搭建  mysql简介: mysql是一个开源的关系型数据库管理系统,现在是oracle公司旗下的 ...

  10. Ubuntu系统下电脑驱动的安装(wifi无线网卡)

    今天给自己的笔记本电脑安装了新的Ubuntu 16.04但是安装之后发现wifi无法启用.这里特说明解决过程. 首先,网上的大部分教程是 选择"系统设置",点击"软件和更 ...