XXL-JOB v2.1.0,分布式任务调度平台 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xuxueli
V2EX    Java

XXL-JOB v2.1.0,分布式任务调度平台

  •  1
     
  •   xuxueli 2019-07-08 12:03:08 +08:00 5609 次点击
    这是一个创建于 2318 天前的主题,其中的信息可能已经有所发展或是发生改变。

    v2.0.2 Release Notes

    • 1、自研调度组件,移除 quartz 依赖:一方面是为了精简系统降低冗余依赖,另一方面是为了提供系统的可控度与稳定性;
      • 触发:单节点周期性触发,运行事件如 delayqueue ;
      • 调度:集群竞争,负载方式协同处理,锁竞争-更新触发信息-推送时间轮-锁释放-锁竞争;
    • 2、底层表结构重构:移除 11 张 quartz 关表,并对现有表结构优化梳理;
    • 3、任务日志主键调整为 long 数据类型,防止海量日志情况下数据溢出;
    • 4、底层线程模型重构:移除 Quartz 线程池,降低系统线程与内存开销;
    • 5、用户管理:支持在线管理系统用户,存在管理员、普通用户两种角色;
    • 6、权限管理:执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作;
    • 7、调度线程池参数调优;
    • 8、注册表索引优化,缓解锁表问题;
    • 9、新增 Jboot 执行器 Sample 示例项目;
    • 10、任务列表优化,支持根据 "任务状态"、"负责人" 属性筛选任务;
    • 11、任务日志列表交互优化,操作按钮合并为分割按钮;
    • 12、项目依赖升级至较新稳定版本,如 spring、springboot、groovy、xxl-rpc 等等;并清理冗余 POM ;
    • 13、升级 xxl-rpc 至较新版本,修复代理服务初始化时远程服务不可用导致长连冗余创建的问题;
    • 14、首页调度报表的日期排序在 TIDB 下乱序问题修复;
    • 15、调度中心与执行器双向通讯超时时间调整为 3s ;
    • 16、调度组件销毁流程优化,先停止调度线程,然后等待时间轮内存量任务处理完成,最终销毁时间轮线程;
    • 17、执行器回调线程优化,回调地址为空时销毁问题修复;
    • 18、HttpJobHandler 优化,响应数据指定 UTF-8 格式,避免中文乱码;
    • 19、代码优化,ConcurrentHashMap 变量类型改为 ConcurrentMap,避免因不同版本实现不同导致的兼容性问题;

    简介

    XXL-JOB 是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

    输入图片说明

    特性

    • 1、简单:支持通过 Web 页面对任务进行 CRUD 操作,操作简单,一分钟上手;
    • 2、动态:支持动态修改任务状态、启动 /停止任务,以及终止运行中任务,即时生效;
    • 3、调度中心 HA (中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心 HA ;
    • 4、执行器 HA (分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行 HA ;
    • 5、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
    • 6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;
    • 7、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性 HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;
    • 8、故障转移:任务路由策略选择"故障转移"情况下,如果执行器集群中某一台机器故障,将会自动 Failover 切换到一台正常的执行器发送调度请求。
    • 9、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
    • 10、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务;
    • 11、任务失败重试:支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;其中分片任务支持分片粒度的失败重试;
    • 12、任务失败告警;默认提供邮件方式失败告警,同时预留扩展接口,可方便的扩展短信、钉钉等告警方式;
    • 13、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务;
    • 14、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。
    • 15、事件触发:除了"Cron 方式"和"任务依赖方式"触发任务执行之外,支持基于事件的触发任务方式。调度中心提供触发任务单次执行的 API 服务,可根据业务事件灵活触发。
    • 16、任务进度监控:支持实时监控任务进度;
    • 17、Rolling 实时日志:支持在线查看调度结果,并且支持以 Rolling 方式实时查看执行器输出的完整的执行日志;
    • 18、GLUE:提供 Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。支持 30 个版本的历史版本回溯。
    • 19、脚本任务:支持以 GLUE 模式开发和运行脚本任务,包括 Shell、Python、NodeJS、PHP、PowerShell 等类型脚本;
    • 20、命令行任务:原生提供通用命令行任务 Handler ( Bean 任务,"CommandJobHandler");业务方只需要提供命令行即可;
    • 21、任务依赖:支持配置子任务依赖,当父任务执行结束且执行成功后将会主动触发一次子任务的执行, 多个子任务用逗号分隔;
    • 22、一致性:“调度中心”通过 DB 锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行;
    • 23、自定义任务参数:支持在线配置调度任务入参,即时生效;
    • 24、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞;
    • 25、数据加密:调度中心和执行器之间的通讯进行数据加密,提升调度信息安全性;
    • 26、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件;
    • 27、推送 maven 中央仓库: 将会把最新稳定版推送到 maven 中央仓库, 方便用户接入和使用;
    • 28、运行报表:支持实时查看运行数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等;
    • 29、全异步:任务调度流程全异步化设计实现,如异步调度、异步运行、异步回调等,有效对密集调度进行流量削峰,理论上支持任意时长任务的运行;
    • 30、跨平台:原生提供通用 HTTP 任务 Handler ( Bean 任务,"HttpJobHandler");业务方只需要提供 HTTP 链接即可,不限制语言、平台;
    • 31、国际化:调度中心支持国际化设置,提供中文、英文两种可选语言,默认为中文;
    • 32、容器化:提供官方 docker 镜像,并实时更新推送 dockerhub,进一步实现产品开箱即用;
    • 33、线程池隔离:调度线程池进行隔离拆分,慢任务自动降级进入"Slow"线程池,避免耗尽调度线程,提高系统稳定性;;
    • 34、用户管理:支持在线管理系统用户,存在管理员、普通用户两种角色;
    • 35、权限控制:执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作;

    文档地址

    技术交流

    12 条回复    2019-11-12 10:09:52 +08:00
    Kyle18Tang
        1
    Kyle18Tang  
       2019-07-08 13:38:21 +08:00
    今天上午使用 docker 试用了一下,用 ports 映射的话,局域网访问不了,不知道为什么,然后 docker 的 network 使用 hosts 模式的话,rpc 初始化失败,因为我们机器上有应用已经占用了 7080 这个端口,看了源码好像是没有地方配置,现在不知道怎么解决了。。。
    Takamine
        2
    Takamine  
       2019-07-08 14:47:30 +08:00
    @Kyle18Tang 这个端口不是默认 8080 在.propertis 配置直接改就好了吗。
    Kyle18Tang
        3
    Kyle18Tang  
       2019-07-08 14:54:13 +08:00
    @Takamine #2 8080 是 admin 服务的接口,这个我知道可以通过参数更改,主要是 rpc 那个 7080 端口。刚刚在 docker 宿主机上用 curl 访问是可以的,就是不知道为什么在我本地浏览器访问不了,我是用 8180 映射的 8080,访问的 8180 端口。
    Takamine
        4
    Takamine  
       2019-07-08 15:10:18 +08:00
    @Kyle18Tang 会不会是防火墙的问题:doge:。
    xuxueli
        5
    xuxueli  
    OP
       2019-07-08 18:25:04 +08:00 via Android
    调度中心只需要一个端口,默认 8080,保障可以通讯即可。
    执行器内置一个通讯 rpc 端口,默认 9999,需要保障改端口与调度中心互通才可以。
    ericgui
        6
    ericgui  
       2019-07-09 00:19:03 +08:00
    @xuxueli 老哥,你是一个团队还是一个人 ? 我靠,关注你好几年了,你持续不断开这么多坑,而且一直保持更新,真牛逼。。。。
    xuxueli
        7
    xuxueli  
    OP
       2019-07-09 17:11:44 +08:00
    @ericgui 目前社区方式维护的,社区有个小团队在迭代推进。已登记企业用户已经超过 200 家,用户信任,会持续迭代下去 :)
    ericgui
        8
    ericgui  
       2019-07-10 00:06:02 +08:00 via Android
    @xuxueli 牛逼
    ericgui
        9
    ericgui  
       2019-07-13 04:02:33 +08:00
    @xuxueli 老哥,想请教一下,维护这样一个受人欢迎的开源项目,对你的职业发展有什么帮助吗?比如说,让你的职业前景更好了。比如说,由于开源项目,给你带来了更好的工作机会,薪资也高。甚至是,这样的项目能够给你带来直接的收入。

    能否请老哥分享一下?谢谢
    xuxueli
        10
    xuxueli  
    OP
       2019-10-08 10:00:38 +08:00
    @ericgui 并不会有直接受益。好处更多的可能是多认识一些朋友,项目相关专业方向上思考的更深入一些。
    Kyle18Tang
        11
    Kyle18Tang  
       2019-11-08 15:31:34 +08:00
    @xuxueli #5
    xxl-job-admin 有 2 个地方会初始化 rpc,一个地方传入了端口 0,rpc 就会使用默认的 7080,报错信息如下
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxlJobScheduler' defined in URL [jar:file:/usr/local/hosjoy/xxl-job-admin/xxl-job-admin.jar!/BOOT-INF/classes!/com/xxl/job/admin/core/conf/XxlJobScheduler.class]: Invocation of init method failed; nested exception is com.xxl.rpc.util.XxlRpcException: xxl-rpc provider port[7080] is used.
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1630)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:481)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:756)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:124)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
    at com.xxl.job.admin.XxlJobAdminApplication.main(XxlJobAdminApplication.java:13)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
    Caused by: com.xxl.rpc.util.XxlRpcException: xxl-rpc provider port[7080] is used.
    at com.xxl.rpc.remoting.provider.XxlRpcProviderFactory.initConfig(XxlRpcProviderFactory.java:75)
    at com.xxl.job.admin.core.conf.XxlJobScheduler.initRpcProvider(XxlJobScheduler.java:92)
    at com.xxl.job.admin.core.conf.XxlJobScheduler.afterPropertiesSet(XxlJobScheduler.java:52)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1688)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1626)
    ... 24 common frames omitted
    xuxueli
        12
    xuxueli  
    OP
       2019-11-12 10:09:52 +08:00
    @Kyle18Tang 你好,从日志看端口冲突了,制定一个其他端口试试。
    可以加入社区交流群进一步沟通: https://www.xuxueli.com/page/community.html
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4486 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 10:00 PVG 18:00 LAX 02:00 JFK 05:00
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86