xxl-job 调查结果 #4
KirinRyuuri
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
ecron 调查文档
xxl-job 简单分为了两个部分,一个部分是调度中心,也就是负责任务注册、分配和调度、执行器注册和调度、日志管理等主要功能;另一个部分是执行器,主要负责具体执行任务,并观察任务执行情况,将信息上报给调度中心。
格式如下:
Q:调查问题内容
A:调查结果内容
TODO:(版本号) 为已经在计划中的功能。
Q:调度系统本身的集群模式:主从 or 对等
A:完全主从。
主要是为了便于部署和使用,任务的注册和调度都在调度中心进行,所有的执行器都将任务交给调度中心进行统一管理分配,分配的方式由调度中心统一安排。
调度中心需要接入MySQL
Q:在集群模式下,调度系统本身如何调度资源,例如如果要调度任务 A,那么应该是在调度系统进群的哪个节点上调度
A:由调度中心统一分配,依赖后端数据库(比如MySQL)自己的锁机制。
基本上的步骤可以理解为,第一步注册一个执行器,第二步在调度中心创建任务,并选择对应的执行器(或者交给调度中心进行选择),第三部调度中心调用执行器进行任务执行。
Q:任务分类:重复任务,定时任务,一次性任务,实时任务
A:都支持
任务的调度类型主要分为四种
任务管理:
Q:任务运行信息:如何查询,是否有回调机制通知用户任务执行情况
A:任务的运行信息在调度中心查看。调度中心对外开放一个日志回调,执行器在任务执行的全流程中向调度中心上报日志的执行状况。
调度中心的任务调度日志包含:
调度中心提供一个 RESTful 的 API 给用户实时查看任务进度
API 示例
可以通过设置子任务的方式来达成“任务完成之后进行通知或者其他处理”
在任务完成时,也可以通过 IJobHandler(Java)或者状态码(非Java) 中携带的信息来判断任务是否正常执行
Q:任务日志
A:支持,并且任务全流程状态都是通过执行器向调度中心上报日志来改变的。
可能存在的问题:执行器如果崩了没传回日志,那么调度中心在下次心跳之前不会知道执行器崩了。
给出的解决办法:从调度中心上将运行中超过10mins的任务手动标记为失败。
Q:是否允许删除任务
A:只限Java:
会
interrupt
执行线程,触发InterruptedException
,然后调用destroy()
方法来进行资源回收注:主线程和子线程都需要在收到
InterruptedException
的时候向上继续抛出,方便JobHandler
处理任务执行器内置的 RESTful API 中也有对于的接口
API 示例
Q:删除的时候如何是否会取消当前任务
A:会,同时可以利用
destory()
来处理任务的收尾操作Q:如何处理已经生成但是还没有调度的任务
A:因为是主从,所以直接在调度中心取消任务就可以了。
如果任务已经下发到执行器,也可以手动终止任务。
Q:是否允许修改任务
A:允许。直接在调度中心修改任务属性即可。
Q:是否允许修改调度配置,如果允许,那么修改调度配置会发生什么
A:主从架构,任务下发执行之前都可以修改,修改调度配置会等到任务运行时再调度。
Q:任务编排:是否支持,大概原理,以及支持到了何种地步
A:支持。
原理是在任务属性中的“子任务”字段。只支持后置任务(即子任务),不支持前置任务,不支持参数传递。
TODO:(v7.34)将来会支持DAG流程任务,即像流程图一样按照路径执行任务,并且可以传递参数。替代现在的子任务功能。
任务注册与任务发现(即确定哪些用户部署的实例是可以执行某个任务的):
Q:有没有后台管理界面可以注册任务,如果有,注册的时候需要填写什么信息
A:有,注册中心。
Q:可不可以编程形式注册,如果可以怎么接入
A:可以,提供 RESTful API
Q:任务形态:http 任务,grpc 任务,亦或是本地任务
A:不支持 gRPC 任务,但是剩下两个都支持。
HTTP任务:通过调度中心的管理页面来创建任务,包括源码(Java、Shell、Python、PHP、NodeJS、Powershell)和BEAN模式(Java,使用
JobHandler
,也可以用注解标明)、GLUE模式(Java,通过注解注入执行器)调度模型:
Q:怎么查找待调度的任务
A:线程池调度任务,然后在数据库(MySQL)中寻找合适的任务
注:任务调度基本上都是秒为最小间隔单位
Q:线程模型(goroutine 模型)
Q:调度语义:
A:支持以下调度方式:固定最前或者最后;轮询;随机;HASH;LFU、LRU;心跳(同时发送心跳,使用先返回的);空闲(同时发送空闲检测,使用先返回的);分片广播(把一个大任务分成多个小任务交给执行器执行)
Q:调度策略:
A:在任务创建的时候,就选择目标执行器
A:不支持,一是因为主从,二是执行器组成集群也只会有一个具体的执行器,三是分片广播任务也只是把一个大任务分成多个子任务,每个执行器还是执行单独的任务。
容错
A:有
超时控制
A:有。可能存在执行器崩溃没返回任务结果导致任务超时,默认超时10mins。
A:没找到
A:默认使用邮件,可以扩展短信、钉钉等。可以参考
EmailJobAlarm
实现com.xxl.job.admin.core.alarm.JobAlarm
接口就可以支持自定义的告警A:没有。
分组只有 管理员、普通用户 这两个分组。只有执行器控制权这一个粒度的权限控制。
A:没有。只有基础的 AccessToken 校验功能,还只是调度中心和执行器之间的。
TODO:(7.34)AccessToken 的动态生成、过期,控制的调度、回调控制。
A:全部存在数据库(MySQL)中,不支持分库分表。
表结构
update:
Q:主从模式
调度中心支持HA(集群)部署,所有调度中心都链接同一个数据库(MySQL)
执行器支持HA(集群)部署,所有执行器回调地址相同,且为所有集群部署的调度中心
调度中心
在集群部署模式下,调度中心(A)与调度中心(B)之间属于平等关系, A 与 B 均从同一个数据库(MySQL)中获取任务,谁先抢到算谁的;假设 A 失效,则 A 下的执行器会链接到其他调度中心(如 B )。
执行器
在集群部署模式下,执行器与执行器之间没有关联,也可以算为平等关系,执行器失效的情况由调度中心处理。
Beta Was this translation helpful? Give feedback.
All reactions