资讯专栏INFORMATION COLUMN

TB-schedule的使用

邹立鹏 / 2648人阅读

摘要:使用方法任务名称对应调度策略中的任务名称任务处理的对应处理机中的名称心跳频率秒假定服务死亡间隔秒保持默认线程数处理该任务的线程数,在没有划分多任务项的情况下,多线程是没有意义的,且线程数大于任务项也是没有意义的。

使用方法

任务名称:对应调度策略中的任务名称

任务处理的SpringBean:对应处理机中的Bean名称

心跳频率(秒)/假定服务死亡间隔(秒):保持默认

线程数:处理该任务的线程数,在没有划分多任务项的情况下,多线程是没有意义的,且线程数 大于任务项也是没有意义的。如果要开启多机多线程,必须对数据做任务项过滤

处理模式:SLEEP(推荐)、NOSLEEP(单个线程处理完分配到的数据后,立刻会重新获取数据)

每次获取数据量:子计时单元开始,线程会不断的去获取数据(eachFetchDataNum参数),直到获取不到数据子计时单元才结束

每次执行数量:执行机实现IScheduleTaskDealMulti接口时使用,handleTask方法参数arg0的数量(taskTypeInfo中executeNumber)

没有数据时休眠时长(秒):
未设置开始时间:当获取不到数据时,休眠此时间,再执行获取数据操作
设置开始时间,未设置结束时间:无效(实际上子计时单元即将停止了)
设置开始时间,设置结束时间:当获取不到数据时,休眠此时间,再执行获取数据操作

每次处理完数据后休眠时间(秒):子计时单元内,两次获取数据操作间隔(对于总会返回数据的任务,使用这个配置来控制间隔)

执行开始时间:子计时任务开始时间

执行结束时间:子计时任务结束时间

单线程组最大任务项:配置单JVM处理的最大任务项数量,多任务项情况下,可按需限制,一般默认,多执行机会均衡分配(TBScheduleManager的任务调度器使用,未研究过。。)

策略名称:策略标示,随意填写

任务类型:一般保持默认Schedule

任务名称:对应任务栏被调度任务名称

任务参数:一般不用,保持空

单JVM最大线程组数量:单个JVM允许开启的线程数

最大线程组数量:多处理机情况下的线程总数限制(总线程数为2,如果配置任务项的线程为4是没有意义的)

IP地址(逗号分隔):如图说明,此处注意多处理机如果没有根据任务项划分数据处理,会导致多处理机重复处理数据

TBScheduleProcessorSleep多线程工作原理

启动task配置的threadNum数量的线程去处理任务。由其中一个线程去获取任务并放入taskList队列中,所有的线程从这个队列中获取任务执行。如果是Multi任务,可以一次取多个任务执行。在一个线程获取任务的过程中,其他线程处于休眠状态,任务获取完毕唤醒其他线程。

TBScheduleProcessorSleep#loadScheduleData

IScheduleTaskDeal#selectTasks,由此方法的实现返回获取的任务

两次loadScheduleData之间有休眠,即在task上配置的SleepTimeInterval(每次处理完数据后休眠时间)

一旦TBScheduleProcessorSleep启动了,会一直循环执行,直到PauseTimer让其停止。但如果没有配置结束时间,则一直运行。(对于运行间隔较短的任务,应通过上述休眠时间来实现控制)

注意事项

计划任务开始/恢复的时候Factory会创建TBScheduleProcessorSleepTBScheduleProcessorNotSleep对象;计划停止的时候,会将已经在执行的任务处理完,但是缓存在队列中带执行的任务将被丢弃

IScheduleTaskDealSingle和IScheduleTaskDealMulti两个接口,除了execute方法上参数不同,功能上没有区别

处理模式为Sleep下getComparator()没有作用,一般情况下,使用Sleep模式

原理 zk数据的大致结构

factory部分:

/rootPath/factory
/rootPath/factory/facotoryUUID1
/rootPath/strategy
/rootPath/strategy/strategy1
/rootPath/strategy/strategy1/factoryUUID1

factory(永久节点)存储执行机注册的主机信息,每个执行机启动后,都会在factory下创建一个临时顺序子节点,该节点名是由TBSchedule源码生成的主机唯一标示。每个factory对应一个执行机启动的TBScheduleManagerFactory实例,每个JVM可以有多个factory实例,factory实例也可以存在于不同的JVM中。(一般一个JVM对应一个factory,即任务执行终端)

strategy(永久节点)是在调度机配置的任务策略,每个factory启动时候回去检查自己能处理哪几个strategy,如果能处理则在/rootPath/strategy/strategy1/路径下注册自己,注册的这个信息在tbschedule源码里叫做FactoryRunningInfo

调度配置为永久节点

[zk: 172.26.50.86:2181(CONNECTED) 56] get /rootPath/strategy/IScheduleTaskDealSingleTest
{"strategyName":"IScheduleTaskDealSingleTest","IPList":["127.0.0.1"],"numOfSingleServer":0,"assignNum":1,"kind":"Schedule","taskName":"IScheduleTaskDealSingleTest","taskParameter":"0","sts":"resume"}

[zk: 172.26.50.86:2181(CONNECTED) 57] get /rootPath/strategy/IScheduleTaskDealSingleTest/127.0.0.1$IAN$7D3122FC0C574603B6CFD0C146641A77$0000000000
{"strategyName":"IScheduleTaskDealSingleTest","uuid":"127.0.0.1$IAN$7D3122FC0C574603B6CFD0C146641A77$0000000000","requestNum":1,"currentNum":0,"message":""}

ScheduleServer部分:

/rootPath/baseTaskType
/rootPath/baseTaskType/task1
/rootPath/baseTaskType/task1/task1
/rootPath/baseTaskType/task1/task1/server
/rootPath/baseTaskType/task1/task1/server/scheduleServerUUID1
/rootPath/baseTaskType/task1/task1/taskItem
/rootPath/baseTaskType/task1/task1/taskItem/0
/rootPath/baseTaskType/task1/task1/taskItem/0/cur_server
/rootPath/baseTaskType/task1/task1/taskItem/0/deal_desc
/rootPath/baseTaskType/task1/task1/taskItem/0/parameter
/rootPath/baseTaskType/task1/task1/taskItem/0/req_server
/rootPath/baseTaskType/task1/task1/taskItem/0/sts

baseTaskType(永久节点)存储调度机创建的任务信息

例如:task1是在后台配置的任务。
/rootPath/baseTaskType/task1/task1/server/scheduleServerUUID1表示可以用来处理任务的调度器,每个factory实例可以有多个ScheduleServer实例。
/rootPath/baseTaskType/task1/task1/taskItem表示配置任务时,每个任务可以拆分成几个小的任务项。该节点的子节点,表示这个任务项运行时的信息,例如cur_server表示这个taskItem正在被哪个ScheduleServer处理。这些在tbschedule源码里也叫作runningInfo。

任务配置为永久节点

[zk: 172.26.50.86:2181(CONNECTED) 37] ls /rootPath/baseTaskType
[IScheduleTaskDealSingleTest]

[zk: 172.26.50.86:2181(CONNECTED) 39] get /rootPath/baseTaskType/IScheduleTaskDealSingleTest
{"baseTaskType":"IScheduleTaskDealSingleTest","heartBeatRate":5000,"judgeDeadInterval":60000,"sleepTimeNoData":500,"sleepTimeInterval":0,"fetchDataNumber":500,"executeNumber":1,"threadNumber":1,"processorType":"SLEEP","permitRunStartTime":"0 * * * * ?","expireOwnSignInterval":1.0,"dealBeanName":"iScheduleTaskDealSingleTest","taskParameter":"0","taskKind":"static","taskItems":["0"],"maxTaskItemsOfOneThreadGroup":0,"version":0,"sts":"resume"}
核心类图

TBScheduleManagerFactoryfactory 实例对象,管理这个factory内部所有的事情。
ZKManager 负责与zk之间的连接,数据交换。
IScheduleDataManager 负责/rootPath/baseTaskType及其子节点所有数据模型维护。
ScheduleDataManger4ZK 负责/rootPath/factory、/rootPath/strategy及其字节点数据模型维护。
IStrategyTask 每个实例代表一个线程组,每个strategy可对应多个IStrategyTask实例,来真正处理配置的任务。

类之间的关系图:

Factory 任务处理器(可以理解为JVM)
strategy 为配置的任务

一个Factory处理多个strategy,每个strategy下有多个IStrategyTask对象。
TBScheduleManager实现IStrategyTask接口,一个TBScheduleManager实例与ScheduleServer、IScheduleProcessor、IScheduleTaskDeal是一对一关系。
ScheduleServer是针对某个task的调度器
IScheduleProcessor是处理任务的多线程任务处理器,控制我们任务数据的循环执行(有TBScheduleProcessorSleepTBScheduleProcessorNotSleep两种实现)
IScheduleTaskDeal是我们需要实现的任务对象(架构组提供的AbstractTaskDealSingleAbstractTaskDealMulti为其abstract实现)

参考文章

http://www.jianshu.com/p/e925...
http://blog.csdn.net/taosir_z...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68093.html

相关文章

  • Spring 指南(目录)

    摘要:指南无论你正在构建什么,这些指南都旨在让你尽快提高工作效率使用团队推荐的最新项目版本和技术。使用进行消息传递了解如何将用作消息代理。安全架构的主题指南,这些位如何组合以及它们如何与交互。使用的主题指南以及如何为应用程序创建容器镜像。 Spring 指南 无论你正在构建什么,这些指南都旨在让你尽快提高工作效率 — 使用Spring团队推荐的最新Spring项目版本和技术。 入门指南 这些...

    only_do 评论0 收藏0
  • 不得不提前端性能优化

    摘要:对于广大的前端开发人员来说,网站构建本是家常便饭其中也不得不涉及到性能优化的问题。将不影响首屏的资源和当前屏幕资源不用的资源放到用户需要时才加载,可以大大提升重要资源的显示速度和降低总体流量按需加载会导致大量重绘,影响渲染性能。对于广大的前端开发人员来说,网站构建本是家常便饭;其中也不得不涉及到性能优化的问题。之前也有接触过,今天总结一下这方面的技巧,下面是我的一下认知,欢迎探讨:   Nu...

    xushaojieaaa 评论0 收藏0
  • MongoDB指南---12、使用explain()和hint()、何时不应该使用索引

    摘要:表示本次查询使用了索引,具体来说,是使用了和上的索引,。建立索引时,或者是每执行次查询之后,查询优化器都会重新评估查询计划。上一篇文章指南使用复合索引操作符如何使用索引索引对象和数组索引基数下一篇文章指南索引类型 上一篇文章:MongoDB指南---11、使用复合索引、$操作符如何使用索引、索引对象和数组、索引基数下一篇文章:MongoDB指南---13、索引类型 使用explain...

    LiangJ 评论0 收藏0
  • MongoDB指南---12、使用explain()和hint()、何时不应该使用索引

    摘要:表示本次查询使用了索引,具体来说,是使用了和上的索引,。建立索引时,或者是每执行次查询之后,查询优化器都会重新评估查询计划。上一篇文章指南使用复合索引操作符如何使用索引索引对象和数组索引基数下一篇文章指南索引类型 上一篇文章:MongoDB指南---11、使用复合索引、$操作符如何使用索引、索引对象和数组、索引基数下一篇文章:MongoDB指南---13、索引类型 使用explain...

    DTeam 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<