我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:香港跑狗图 > 调度策略 >

CSDN首发丨TBSchedule应用实战手册

归档日期:06-10       文本归类:调度策略      文章编辑:爱尚语录

  TBSchedule应用实战(二)—— 使用Spring配置TBSchedule

  TBSchedule应用实战(四)——“Hello,效率之神(集群篇)”(下篇更新)

  TBSchedule应用实战(五)——“Hello,效率之神(分布式计算篇)”(下篇更新)

  TBSchedule应用实战(六)——深入理解tbs之框架结构总览(下篇更新)

  TBSchedule应用实战(七)——深入理解tbs之运行机制手把手(下篇更新)

  TBSchedule(以下简称tbs)应该是国产市面上最早开源得一款“分布式定时任务调度”框架,其优越的性能,zookeeper集群注册中心,自动灾备等种种特性受到各类型互联网企业的关注与青睐。2014年tbs早期作者空玄、玄难、huijin在发布3.2.18-SNAPSHOT版本后该项目陷入长达近2年的停更,目前由署名zzllkk2003发布了3.3.3.2正式版。

  作者混迹于官方tbs技术讨论群(89558542,tbs官方团队玄难,华序,空玄和笔者均在此群)已久,帮助解决问题无数,现应一众朋友邀请将tbs再一次做一个全面的介绍。虽然tbs源码层次分明,结构清晰,但涉及线程池与多线程管理知识点较多,为面向各个开发龄的朋友快速上手,作者故意反其道而行之由浅到深进行《TBSchedule应用实战》系列课程。请各位对tbs感兴趣的朋友耐心、仔细地读完每一节课程,希望哪怕只有一年java开发经验的朋友看完该系列之后,也能够对tbs有一个全面地认识以及较强的应用能力。

  1、控制台部分:将上节官方提供的tbs console admin(点击下载)扔到tomcat里启动,如何使用tomcat请自行网上查询。启动成功后如下图所示(参数可能与图中不一样):

  2、新建一个空项目,需要的maven依赖如下,当然也可以直接下载作者的示例工程。

  3、现在跟着作者敲代码,不需要理解为什么,你只需要知道5分钟之后你已经可以使用tbs了:

  上方的zookeeper地址改成你自己的zookeeper地址,单机,集群均可。接着run一下,正常的话会看下以下日志:

  此时不停刷屏得DEBUG的日志分别为:1)zk链接日志;2)调度器信息写入日志;3)内置心跳日志。现在我们也不去过问为什么,直接在Log4j中屏蔽掉DEBUG级别日志。之后重启,是不是清爽多了?编码的部分到此结束,相信一个熟练使用IDE的朋友根本用不了5分钟。

  现在我们把填入tbs调度器中的各项参数也填入到控制台,点击保存后,再点击管理主页。

  小伙伴们可以进一步检查我们的调度程序是否启动成功,怎么看呢?点击机器管理,如下图如果发现你的IP在处理任务机列表里那么恭喜了,注册成功,可以开始调度了!

  当我们回到程序,你多半会失望的发现各种各样的小问题,那么请倒回去再仔细看一遍教学。又如果你看到了以下日志:

  TBSchedule应用实战(二)—— 使用Spring配置TBSchedule摘要:本节可以下载作者全教程示例源码:

  上节我们使用最少的代码启动的tbs调度器并且成功运行了一个job,那么反正tbs强依赖Spring,索性我们也就把二者整合在一起,整合步骤同官方文档一样,这里也就把配置文件贴上,并附上Spring启动版示例工程。

  摘要:此章节极为重要,要想用好,用活tbs请仔细熟读该章节。阅读过程中如果仍有不能理解的问题欢迎提问,作者会及时作答并遵照自己的理解使用作者的示例工作多配置,多体验各种配置下任务执行效果能够极大提升读者对tbs的理解程度。

  本节以图文并茂的方式尽量让朋友们认清tbs中每一个配置的具体作用,一遍敲黑板,一遍重复:重点!重点!重点!

  zookeeper超时:应用中为应用连接zk超时时间,控制台为控制台连接zk超时时间。

  zookeeper根目录:代表每一个调度器在zookeeper中的唯一路径,所有的调度器Server信息,执行器job信息均存于该目录。同时也可以切换该目录地址以切换不同的调度器。(例如:用户信息离线计算分布在一个三机集群,根目录地址为/tbschedule/userinfo/tasks;用户账户信息离线计算分布在另一个三级集群,根目录地址为/tbschedule/useraccounts/accountinfo/tasks。)

  要点1:由于zookeeper新版本权限控制的问题,每次新增节点必须先在控制台配置并保存,然后再启动应用。否则会出现控制台一直连接不上的问题。

  要点2:对Zookeeper根目录配置用户名密码不能保证节点的绝对安全,且不说再进入控制台的时候会保留上一次配置的信息。另利用zookeeper客户端也是可以对节点进行权限消除,删除等操作的。所以作者认为用户名密码不如不配,还省去管理的麻烦。

  隔离域概念:虽说现在大部分企业的个人开发机、开发环境、测试环境网络都是隔离的,但也有不少混用。此时为了不影响其它环境的正常使用就需要用到隔离域。官方没有过多的提及隔离域的用法是因为所谓的隔离域无非就是一个传入selectTasks()的参数而已,与代码耦合,使用不当很可能影响到正常业务。这里只讲解其用法但并不推荐大家使用。

  隔离域作用:仅用于隔离IP地址,以避免在IP地址配置为全扫描时造成的环境混乱。

  上图:启动第一个默认策略,运行名为:FirstScheduleDemo – BASE任务配置;启动第二个TEST策略,运行名为:FirstScheduleDemo – TEST任务配置。但他们实际都是运行的任务FirstScheduleDemo相同的配置,只是传入selectTasks()方法的第二个参数ownSign值为BASE或者TEST。这个神秘的参数懂了没?没什么卵用对不对? ╮(╯▽╰)╭

  任务参数:自定义调度策略时需要的动态参数,Schedule任务类型没有实现该方法,因而在Schedule类型任务下无效,无需配置。

  概念:这里的单JVM不太好理解,如果是一路看着作者前几篇教程过来的朋友,把这里理解成单个调度器实例可以启动的最大线程组数量(一个线个子线程)。一个线程组负责执行对应任务中的一个任务项。那么不难理解,如果不限制该值,当所有实例加起来的线程组总数大于任务项时,任务项被均匀分配到线程组中,多出来的线程组作为灾备处于“待命”状态,过多的“待命”必然会有线程资源的浪费。而当其小于任务项时,多余的任务项会被分配到某一线程组下并行,一个线程组处理太多的任务项也会造成该实例占用资源升高,效率降低,极端情况下可能会压死实例。

  如何限制该值:这里官方控制台有一个误导。假设单JVM最大线,最大线,启动一个调度器你会发现该调度器仍会启动3个线程组。此时所谓的“单JVM最大线程组数量”是没有效果的,如果有单线程运行的需求,请配置单JVM最大线,最大线,并将任务配置中的“线。此时该任务处于真正的单线程运行,避免业务处理中的线:灾备(重要)。当执行任务的调度器为集群时,某一调度器宕机达到60s,tbs会将任务转移到另一个调度器中的线:多重并发执行。知道了线程组的概念,那么我们可以利用任务项同时激活多个线程组,再加上任务执行本身也可以配置线程数。所以此时我们可以做到单个调度器上:(线程组数*子线程数)个线程同时处理任务,作者将此场景称之为多重并发执行,其执行效率相当恐怖,但需要自己处理好任务处理幂等性的问题。

  注意:结合上述分配图看,理论上,也是大多数情况下,tbs都会启动最大线程组数量的线程组以保证可容灾性。但在实际应用中偶尔也会发生线程组启动不全的情况,这种情况仅限于某任务所配置的任务项刚好整倍数于线程组数的时候。

本文链接:http://mikephotos.net/diaoducelue/575.html