分布式调度解决的两个问题
1.在集群服务器环境下调度任务
一个互联网应用不断扩大单台服务器是不够的,同样的代码工程需要copy部署到多台服务器,这样的处理形式称之为服务器集群。
而伴随着服务器集群带来了一个问题,比如定时的后台任务,例如数据统计、邮件发送等我们希望这些任务同一时间只有一个任务在进行,但是集群服务器上面每台服务器都可能部署着同样的功能模块,一起执行可能引起一些问题,比如重复的操作可能产生一些错误的数据,再如,重复的操作浪费服务器资源。
这样,很容易想到的一个解决方案就是,某个任务只在特定某台机器上面执行。这是一个可行的方案,但是也会有明显缺陷,比如在一个有N台服务器的集群中:在1-10号服务器上面同时存在任务A工程,只在1号机器上运行;在11-20号服务器上同时存在任务B工程,只跑在11号机器上运行等等,这样的话维护人员需要自己记住这些任务部署的机器编号,而且任务多了需要部署的机器也多了,另外如果当规模缩小需要减少服务器的时候这些任务运行的服务器可能都要重新编排一次。而最严重的问题是当负责执行任务的服务器挂了的时候,业务也就停止了。
那么我们需要在这样一个集群环境下希望某些事情同一时间只有一个服务器在执行,并且当这个服务器挂了的时候另外选一台机器代替它工作起来——分布式调度就可以解决这个问题
2.把一个任务拆分多个任务同时进行
有些时候同一个任务是可以拆分成多个小任务同时进行的,比如一张数据表中数据迁移至另一张表,我们需要将A表中的数据迁移至A1表,如果表的数据越多执行时间越慢,而这样的业务其实是可以多台机器同时进行来加快迁移速度的,利用分布式调度也可以解决这个问题。
分布式调度运用
Elastic-job-lite 当当网开源的一个基于Zookeeper的分布式调度解决方案。原理如下图:
Elastic-job-lite 通过向Zookeeper注册client ,然后zookeeper的通知机制来实现同一个时间运行一个client。