tbschedule源码学习

tbschedule使用zk来解决集群间的同步问题,首先看一下zk上面的结构信息

  • factory 是对应着每一个连接的机器,使用唯一的uuid做区分,后缀是zk自己维护的序列号
  • strategy是任务执行策略相关的设置,在每个task-n下面记录了这个任务的策略信息包括可以执行的机器,每个机器该任务执行最多几个线程组,一个线程组里多少个线程。tbschedule在执行的时候这里作为信息的来源。tbschedule的后台也会修改这里
  • tasks的是记录任务分配到那台机子的配置。tbschedule在运行的时候会读写这里的内容。任务的lead机子会定时更新这个目录,tbschedule任务片的派发直接依赖这个目录

tbschedule在启动的逻辑图

重要的类结构解析

  • TBScheduleManagerFactory

    • 这个类必须是单例模式,否则会出现重复执行多次,如果要改配置,再次执行init方法就可以
  • ManagerFactoryTimerTask
    • 保持心跳,定时更新配置,利用zk重新选出leader读取strategy,更新
    • 和TBScheduleManagerFactory的数量一致,也只有一个。
  • TBScheduleManager 任务策略的线程组管理器
    • 这个类本身会创建多个,有定义了多个任务策略的就有多少个
    • 会创建很多个线程IScheduleProcessor,个数为分配到的taskItem的个数
    • 同一个组内执行线程持有相同的执行模式TBScheduleProcessorNotSleep或者TBScheduleProcessorSleep,共享同一个任务池
  • HeartBeatTimerTask
    • 和TBScheduleManager的数量保持一致
    • 定时重新分配zk/task下目录,只有leader

zk在这里的作用

zk作为一个黑盒的资源管理中心,类似于目录和文件于一体的结构,即可以存数据也可以创建子目录。
zk被用来选举出集群中的哪个机子是leader,同时记录任务的各种信息,baseTaskType会被频繁更新。

其他

  • 每一个ManagerFactory在启动以后uuid保持不变。在第一次的时候managerFactory.uuid为null,初始化一个uuid,并向zookeeper注册使用EPHEMERAL_SEQUENTIAL模式(断掉会删除,但是path后会追加一个zookeeper内部维护的递增序列号),后面这个序列号是作为集群选举的关键。 注册后得到地址,保留下来并作为这个managerFactory.uuid。 后面重连的话就会直接使用uuid创建目录,使用EPHEMERAL模式(断掉会删除),后面不管重连多少次都会保持一致。应用重启的话 uuid会网上增加。ManagerFactory.uuid一旦设置值之后就不会再改变

  • IScheduleProcessor 检查是否需要退出的机制和线程中断的机制是一样的,都是协同机制,在某个点检查标志位

  • 为了避免频繁读取zk/task下的结构,使用了本地缓存,用了zk目录节点的version作为是否脏的标识。
  • 任务组每执行完一遍会休眠一段时间,避免重复空执行浪费资源
  • tbschedule分配给每个机子的任务片(0,n)不会相同,每个机子返回可以执行的任务组可以由n多个一般是用返回的任务片取模,这就需要在配置的时候遵守一定的约定。

tbschedule源码学习相关推荐

  1. Shiro源码学习之二

    接上一篇 Shiro源码学习之一 3.subject.login 进入login public void login(AuthenticationToken token) throws Authent ...

  2. Shiro源码学习之一

    一.最基本的使用 1.Maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId&g ...

  3. mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

    前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...

  4. vue实例没有挂载到html上,vue 源码学习 - 实例挂载

    前言 在学习vue源码之前需要先了解源码目录设计(了解各个模块的功能)丶Flow语法. src ├── compiler # 把模板解析成 ast 语法树,ast 语法树优化,代码生成等功能. ├── ...

  5. 2021-03-19Tomcat源码学习--WebAppClassLoader类加载机制

    Tomcat源码学习--WebAppClassLoader类加载机制 在WebappClassLoaderBase中重写了ClassLoader的loadClass方法,在这个实现方法中我们可以一窥t ...

  6. jQuery源码学习之Callbacks

    jQuery源码学习之Callbacks jQuery的ajax.deferred通过回调实现异步,其实现核心是Callbacks. 使用方法 使用首先要先新建一个实例对象.创建时可以传入参数flag ...

  7. JDK源码学习笔记——Integer

    一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private fi ...

  8. DotText源码学习——ASP.NET的工作机制

    --本文是<项目驱动学习--DotText源码学习>系列的第一篇文章,在这之后会持续发表相关的文章. 概论 在阅读DotText源码之前,让我们首先了解一下ASP.NET的工作机制,可以使 ...

  9. Vuex源码学习(五)加工后的module

    没有看过moduleCollection那可不行!Vuex源码学习(四)module与moduleCollection 感谢提出代码块和截图建议的小伙伴 代码块和截图的区别: 代码块部分希望大家按照我 ...

  10. 我的angularjs源码学习之旅2——依赖注入

    依赖注入起源于实现控制反转的典型框架Spring框架,用来削减计算机程序的耦合问题.简单来说,在定义方法的时候,方法所依赖的对象就被隐性的注入到该方法中,在方法中可以直接使用,而不需要在执行该函数的时 ...

最新文章

  1. Luogu P3177 [HAOI2015] 树上染色(树上背包)
  2. OKR怎么使用比较好?
  3. vs2005常用快捷键
  4. nginx中的rewrite用法及实例
  5. 基于DSP技术的多路语音实时采集与压缩处理系统
  6. Spring【AOP模块】就是这么简单
  7. vue-cli详细教程
  8. Java加入背景音乐
  9. 被哥哥巨额索赔56亿?贾跃亭回应:40多亿为联合担保
  10. Spring Boot : SpringApplicationRunListener
  11. 详解 SGA 与实例优化(部分)
  12. 用户角色权限设计思路
  13. 期末复习—计算机组成原理—计算机的分类
  14. vum安装mysql_Vue自动化工具(Vue-CLI)的安装
  15. mysql的填充因子_为索引指定填充因子
  16. Android App网络通信中通过runOnUiThread快速操纵界面以及利用线程池Executor调度异步任务实战(附源码 简单易懂)
  17. WEP/WPA/WPA2加密标准有什么区别?
  18. Arduino uno esp01s 硬串口通信
  19. altera fpga 型号说明_ALTERA的FPGA命名规则
  20. 【总结】本地springboot连接腾讯云Redis

热门文章

  1. java读取服务器文件_JAVA读取服务器端文件
  2. 一个以表驱动得汉字转拼音的库
  3. Javascript时间脚本收集
  4. SolidWorks零件图转工程图
  5. Android半透明对话框实现
  6. python 给qq点赞_Python实现QQ自动点赞
  7. phpQuery占用过多内存的解决方法
  8. java中handler机制_自己动手撸一个Handler,让你彻底搞懂Handler机制,揍吻你服不服?...
  9. VS2010+VAX+CUDA6.0配置语法高亮和自动补充
  10. CrossApp_01