分布式定时任务调度平台TBSchedule技术介绍

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/adi851270440/article/details/80512157

1. 概述

        TBSchedule是阿里开发的一款分布式任务调度平台,旨在将调度作业从业务系统中分离出来,降低或者是消除和业务系统的耦合度,进行高效异步任务处理,目前被广泛应用在阿里巴巴、淘宝、支付宝、京东、聚美、汽车之家、国美等很多互联网企业的流程调度系统中。


TBSchedule调度平台关键字

        TBSchedule有很多特性,包括批量任务,多主机,多线程,动态扩展,实时或定时任务,分片,并发,不重复执行。TBSchedule通过任务分片将一个大的任务拆分成多个子任务,这些子任务在多台应用服务器上不重复的并发执行,而分配给每台服务器上的任务又可以启动多个线程处理,从而大大提高执行效率;应用服务器支持动态扩容和失效转移,当任务量较大时,可以随时扩展应用服务器的个数,当有服务器宕机时,他的待执行任务将会分配给其他服务器执行;TBSchedule的任务管理可以通过管理页面进行,可以设置任务的定时的开始和结束,也可以设置任务立即执行;另外,TBSchedule可以设置应用白名单,即某个任务在哪些机器上执行。

        TBSchedule依赖于ZK存储调度数据,包括注册的服务器信息,调度策略,任务分片信息,任务的分配情况等。TBSchedule启动两个心跳线程:服务器信息心跳检测线程和任务信息的心跳检测线程,通过这两个线程维护zk上的调度信息,清除没有心跳的服务器和任务,重新分配任务项,停止或恢复执行任务等。

2. 技术原理

        

TBSchedule运行流程图

        TBSchedule会在初始化zk配置时,根据用户配置的根节点名称创建一个根节点,以后对zk所有的操作都在该根节点下进行。初始化配置中,TBSchedule会在根节点下创建三个子节点:factory、strategy、baseTaskType,这三个节点分别维护着调度服务器信息、调度策略信息和任务信息。

        初始化配置完成后,TBSchedule会创建并启动两个线程:服务器信息心跳检测和任务信息的心跳检测。服务器信息心跳检测每2秒钟执行一次,主要工作包括在factory目录下创建服务器节点,并且根据调度策略的白名单将服务器分配给调度策略;然后根据调度策略配置单台服务器线程组数和总的线程组数,给每台服务器分配线程组数,线程组数即每台服务器启动的任务处理器数,每个线程组都会启动若干个线程来处理任务;最后维护任务处理器数和线程组数的平衡,如果任务处理器数超过分配的线程组数,则删除多余的任务处理器(要等任务执行完毕),否则新增任务处理器。任务信息的心跳检测的启动时间是每个任务分别配置的,它的主要工作包括,清除没有心跳的任务处理器,选举leader,并由leader处理器执行任务分配。在服务器信息心跳检测线程最后会去启动任务的执行,计算任务的开始时间,包括实时和定时执行任务,然后Timer调度器启动任务执行。任务开始执行时,每个线程组会启动多个线程执行任务,当taskList中没有数据时,其他线程等待,最后一个线程调用selectTasks方法获取数据,并唤醒其他线程调用execute方法执行任务。

        TBSchedule策略和任务的创建只能通过管理页面完成,它提供了功能丰富的管理页面。当要创建一个调度任务时,首先应该给这个任务创建调度策略,创建策略如图所示。

创建调度策略

        其中,单JVM最大线程组数量表示每个服务器上可以创建的任务处理器个数,最大线程组数量表示所有服务器最多创建的线程组数量,IP地址表示该任务可以在哪些机器上执行。


创建任务

        创建调度策略后开始创建调度任务,包括任务实体beanId,心跳检测线程的频率,假定服务死亡间隔表示任务处理器没有心跳多长时间判定为死亡,线程数表示每个线程组执行任务时启动的线程个数,每次获取数据量表示每次查取数据的条数,处理模式分为sleep和notsleep两种,执行开始时间和执行结束时间表示定时任务的开始和结束时间,格式为cron表达式,不填标识实时任务,立即执行。任务项是任务拆分的依据,作为参数传递,以逗号分隔,表示该定时任务要拆分成几个任务项以及每个任务项的参数。

      3. 总结

       1) TBSchedule功能强大在很多大型互联网公司被应用,经过了充分的验证,是一款优秀的调度平台。

       2)TBSchedule没有官方文档,而且开源代码在淘宝平台http://code.taobao.org/svn/tbschedule上面,不方便下载。

       3)不支持jdk1.8以上(因为依赖的spring jar包较老,程序中需要通过该jar包获取版本信息,只能取到1.7以下的jdk信息)

       4)TBSchedule获取的是内网IP地址(127.0.0.1或者localhost),不容易通过IP地址区分服务器。


展开阅读全文

没有更多推荐了,返回首页