elastic-job

Name 描述
JobRegistry job注册表
GuaranteeService 保证分布式任务全部开始和结束状态的服务
ElasticJobListener 弹性化分布式作业监听器接口
JobScheduler 作业调度器.
JobNodeStorage 作业节点数据访问类
JobScheduleController 作业调度控制器,其实就是quartz的scheduler

config 节点

代表了这个job的配置信息,如果app启动的时候没有设置override=true && zk上的配置不为空,那么就使用zk已经存在的zk信息,这一点要特别注意,如果改了配置信息,但是没有设置override就会出问题,但是有些信息也可以调节console里面的配置,因为他是以zk为准的。

配置参数

Name 描述
monitorExecution 默认是true,当job触发的时候如果上一次还有分片在运行中则忽略掉本次运行
maxTimeDiffSeconds 任务执行机器和zk机器的时间差,如果设置了不是-1,那么两者误差要在这个范围内,否则启动报错,但是只是记到了错误日志,启动还是可以继续的
  • 每个sharding节点下的子节点有哪些?

    • instance 节点,记录了这个分片执行的instance的ip、pid
    • running
    • misfire
    • disabled
    • failover 节点,表示这个分片原来是运行在实例上的的后来失败被转义到别的实例上的
  • 重新分片
    在每次执行任务的时候,有一个步骤是获取分片上下文,这个时候会检查是否需要重新分片。

      1. 如何确定是否需要分片呢?
        当监听到分片总数变化、实例数量变化、分布式作业不一致、注册作业启动信息的时候会创建需要重新分片的节点 :leader/sharding/necessary
        只有存在这个节点,才可能开始下面的分片逻辑:
  • 分片

    1. 如果当前实例是leader节点,他会等待所有的分片都执行完成后,创建 /leader/sharding/processing 节点,表示分片动作正在执行中,那么非leader节点看到存在这个节点就会一直等着不会继续执行,leader节点首先重置所有的分片信息,例如原来是 0,1,2三个分片,现在分片0,1 那么就会把2删掉,接着使用分片策略,最后形成
      Map<JobInstance, List<Integer>> 这个结构,最后将每个分片下面的instance节点的值写为对应实例的id。最后删除/leader/sharding/necessary 和 /leader/sharding/processing 节点
    1. 如果当前实例不是leader节点,就一直等到分片完成在继续执行,然后
  • misfire
    misfire 在quartz里的原因是cron设置的执行间隔很小,但是任务执行的时间很长,导致下一次触发执行的时候上一次的任务还没有执行完成,这样本次任务在执行的时候发现sharding下面还有running节点,就会设置这个sharding下的misfire节点 ,然后跳过本次执行

  • failover
    failover 功能指的是当一个实例在执行过程中宕机,可以把分片转移到其他的实例上运行

    • 什么时候需要failover?
      节点 /leader/failover/items 存在 并且 下面的子节点不为空 并且当前任务没有在运行状态
      创建临时节点 sharding/xx/failover
      同时删除 /leader/failover/items/xx
      立即启动作业 scheduler.triggerJob(jobDetail.getKey());

    • /leader/failover/items 节点以及子节点表示失效的节点,这些节点什么时候创建的呢?

每次执行完成,删除failover节点

  • 监听器
    app启动的时候会开启这些监听器

    • electionListenerManager

    • shardingListenerManager

      • ShardingTotalCountChangedJobListener
        分片数量变化,得到通知,更新本地的分片数量缓存,同时创建/leader/sharding/necessary节点
      • ListenServersChangedJobListener
        如果是server数量变化或者instance数量变化就设创建/leader/sharding/necessary节点
    • failoverListenerManager
      监听/jobName , 节点或者数据变化会执行 ,注册了两个zk listener

      • JobCrashedJobListener

        • 监听节点删除事件,检查 sharding 下的子节点 instance ,如果instaceid和挂掉的机器instanceid是一样的,这样就搜集了挂掉实例上运行的所有分片,如果 /sharding/xx/failover 节点没有创建,那么就创建 /leader/failover/items/xx 节点。
          然后创建临时节点 sharding/xx/failover
          同时删除 /leader/failover/items/xx
          立即启动作业 scheduler.triggerJob(jobDetail.getKey());
      • FailoverSettingsChangedJobListener
        监听config配置节点,如果配置改变了(通过控制台改变),如果配置不再支持failover了,那么就删掉所有的 sharding/xx/failover 节点

  • monitorExecutionListenerManager
  • shutdownListenerManager
  • triggerListenerManager
  • rescheduleListenerManager
  • guaranteeListenerManager
  • regCenterConnectionStateListener
  • 任务状态
  • jobStatusTraceEvent
    TASK_STAGING
    TASK_RUNNING,
    TASK_FINISHED,
    TASK_KILLED,
    TASK_LOST,
    TASK_FAILED,
    TASK_ERROR,
    TASK_DROPPED,
    TASK_GONE,
    TASK_GONE_BY_OPERATOR,
    TASK_UNREACHABLE,
    TASK_UNKNOWN
INSERT INTO `JOB_STATUS_TRACE_LOG` (`id`, `job_name`, `original_task_id`, `task_id`, `slave_id`, `source`, `execution_type`, `sharding_item`,  `state`, `message`, `creation_time`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);

JobStatusTraceEvent
JobStatusTraceEvent

  • 线程池
new ThreadPoolExecutor(
threadSize, 
threadSize, 
5L, 
TimeUnit.MINUTES, 
workQueue, 
 new BasicThreadFactory.Builder().namingPattern(Joiner.on("-").join(namingPattern, "%s")).build());

 threadPoolExecutor.allowCoreThreadTimeOut(true);
1. 固定大小线程池
2. 允许core线程超时
3.  线程数量 = Runtime.getRuntime().availableProcessors() * 2
  • 如果我们自定义的业务逻辑报错会怎么处理
    在框架里会catch住,将错误堆栈信息提交到eventbus,并记录到日志。

提供的扩展点

    1. 默认的线程池是固定大小、线程数量是cpu个数的2倍,对于cpu密集和IO密集不能做区分,因此提供了线程池的扩展点

app启动

  1. 从zk中获取到config
  2. xx
  • 通过jobProperties 可以设置任务执行的线程池和异常处理策略
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容