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
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
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