tbschedule源码学习
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源码学习相关推荐
- Shiro源码学习之二
接上一篇 Shiro源码学习之一 3.subject.login 进入login public void login(AuthenticationToken token) throws Authent ...
- Shiro源码学习之一
一.最基本的使用 1.Maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId&g ...
- mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...
前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...
- vue实例没有挂载到html上,vue 源码学习 - 实例挂载
前言 在学习vue源码之前需要先了解源码目录设计(了解各个模块的功能)丶Flow语法. src ├── compiler # 把模板解析成 ast 语法树,ast 语法树优化,代码生成等功能. ├── ...
- 2021-03-19Tomcat源码学习--WebAppClassLoader类加载机制
Tomcat源码学习--WebAppClassLoader类加载机制 在WebappClassLoaderBase中重写了ClassLoader的loadClass方法,在这个实现方法中我们可以一窥t ...
- jQuery源码学习之Callbacks
jQuery源码学习之Callbacks jQuery的ajax.deferred通过回调实现异步,其实现核心是Callbacks. 使用方法 使用首先要先新建一个实例对象.创建时可以传入参数flag ...
- JDK源码学习笔记——Integer
一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private fi ...
- DotText源码学习——ASP.NET的工作机制
--本文是<项目驱动学习--DotText源码学习>系列的第一篇文章,在这之后会持续发表相关的文章. 概论 在阅读DotText源码之前,让我们首先了解一下ASP.NET的工作机制,可以使 ...
- Vuex源码学习(五)加工后的module
没有看过moduleCollection那可不行!Vuex源码学习(四)module与moduleCollection 感谢提出代码块和截图建议的小伙伴 代码块和截图的区别: 代码块部分希望大家按照我 ...
- 我的angularjs源码学习之旅2——依赖注入
依赖注入起源于实现控制反转的典型框架Spring框架,用来削减计算机程序的耦合问题.简单来说,在定义方法的时候,方法所依赖的对象就被隐性的注入到该方法中,在方法中可以直接使用,而不需要在执行该函数的时 ...
最新文章
- Luogu P3177 [HAOI2015] 树上染色(树上背包)
- OKR怎么使用比较好?
- vs2005常用快捷键
- nginx中的rewrite用法及实例
- 基于DSP技术的多路语音实时采集与压缩处理系统
- Spring【AOP模块】就是这么简单
- vue-cli详细教程
- Java加入背景音乐
- 被哥哥巨额索赔56亿?贾跃亭回应:40多亿为联合担保
- Spring Boot : SpringApplicationRunListener
- 详解 SGA 与实例优化(部分)
- 用户角色权限设计思路
- 期末复习—计算机组成原理—计算机的分类
- vum安装mysql_Vue自动化工具(Vue-CLI)的安装
- mysql的填充因子_为索引指定填充因子
- Android App网络通信中通过runOnUiThread快速操纵界面以及利用线程池Executor调度异步任务实战(附源码 简单易懂)
- WEP/WPA/WPA2加密标准有什么区别?
- Arduino uno esp01s 硬串口通信
- altera fpga 型号说明_ALTERA的FPGA命名规则
- 【总结】本地springboot连接腾讯云Redis
热门文章
- java读取服务器文件_JAVA读取服务器端文件
- 一个以表驱动得汉字转拼音的库
- Javascript时间脚本收集
- SolidWorks零件图转工程图
- Android半透明对话框实现
- python 给qq点赞_Python实现QQ自动点赞
- phpQuery占用过多内存的解决方法
- java中handler机制_自己动手撸一个Handler,让你彻底搞懂Handler机制,揍吻你服不服?...
- VS2010+VAX+CUDA6.0配置语法高亮和自动补充
- CrossApp_01