分布式任务调度框架—SkySchedule介绍(二)

概述

 

SkySchedule发布之后(详见《分布式任务调度框架--SkySchedule介绍》),已有部分用户在使用,收到一些反馈意见。比如iteye网友sxp2558发现的.properties配置文件使用了“user.name”作为key,会被系统变量“user.name”覆盖,实际取到的是主机名,目前该问题已经修复。

 

目前反馈最多的问题是SkySchedule没有管理界面,不方便查看当前的任务分配情况。今天抽时间写了一个简单的管理页面,由于前端技术水平有限,比较简陋。下面简单展示下,如果还不了解SkySchedule工作原理的朋友请移步上一篇介绍文章《分布式任务调度框架--SkySchedule介绍》

 

准备阶段

 

首先从githubhttps://github.com/gantianxing/skySchedule.git获取最新代码;

使用jdk1.8 +maven编译打包;

然后把SkySchedule服务端sky-server子工程对应的warsky-server-1.0-SNAPSHOT.war部署到tomcat8,启动程序;

 

访问服务端管理页面http://localhost:8080/,初始界面如下:



 

 

由于还没有接入客户端,这里客户端列表为空。

 

添加一个客户端

 

这里还是以sky-test工程模拟客户端工程(实际工作中请在自己需要做分布式任务调度的工程里引入sky-client工程对应的客户端jar包:sky-client-1.0-SNAPSHOT.jar)

 

修改客户端配置文件SkySchedule-client.properties中的server.ip.portgroup.id对应的值:

server.ip.port为服务端nettyip和端口,ip为刚才启动的服务端对应的ip,端口默认为9991。如果有多个服务端实例,请以”,”间隔。

 

group.id可以理解为客户端分组,每个系统对应一个分组id,每个分组id下有多个客户端,分布式任务调度就是把一批任务平均分配给这些客户端执行,我这里配置的第一个group.id=1000,首先启动一个sky-test实例,刷新服务端管理页面http://localhost:8080/(每隔15秒自动刷新),页面内容如下:



 

 

现在只有1个客户端节点,获取任务的sql语句为select * from xxx where id%1=0,改客户端将执行xxx任务表里所有的任务。这里客户端id是由客户端ip:uuid组成(192.168.21.1ip,数据uuid1590479018)。

 

添加多个客户端

 

现在再加一个group.id1000的客户端实例(在ip10.14.140.6的机器上启动一个tomcat实例),再次刷新服务端管理页面http://localhost:8080/,页面内容如下:



 

 

现在有两个客户端节点,其中ip192.168.21.1客户端将执行任务表中id尾数为偶数的任务,ip10.14.140.6的客户端将执行任务表中id尾数为奇数的任务。

 

以此类推,如果再启动一个实例,任务表中任务将被分为3份分别由不同的客户端执行。如果任务多,添加更多个客户端实例即可,注意这些客户端实例的group.id要相同,才能执行同一个任务表中的任务。

 

减少客户端

 

由于业务量减少,任务表中的任务数相应的会减少,这时可能更少的客户端就可以满足业务需求。这时直接对部分客户端下线即可,SkySchedule会自动感知客户端个数的变化,对任务进行重新分配。

 

同样的场景还有某一个客户端突然出现故障down掉,这时SkySchedule会自动感知,并重新进行任务分配。如果这个客户端故障解除,客户端重启后,SkySchedule也会自动感知,再次对任务进行重新分配。

 

比如这里停止ip10.14.140.6的客户端,刷新服务端管理页面http://localhost:8080/,页面内容如下:



 

 

这时所有的任务会分布到192.168.21.1(原理依然是id%1=0)

 

如果有多个系统、或者多个任务表要实现分布式调度怎么办呢,可以通过添加不同的group.id实现,如下:

 

 

添加多个客户端分组

 

假设现在有另外一个系统也需要接入“分布式任务调度”,可以把这个系统的配置文件SkySchedule-client.properties中的group.id配置为另一个值(不要和已有的重复)。

 

比如,这里测试还是用sky-test,只是把group.id设为2000,再次启动一个tomcat实例,刷新服务端管理页面http://localhost:8080/,页面内容如下:



 

 

以此类推,可以接入更多的客户端系统,进行互不干涉的分布式任务调度。

 

最后

 

服务端的管理页面http://localhost:8080/每隔15秒自动刷新,获取最新的客户端列表。如果需要调整这个时间间隔,可以自行修改sky-server子工程中的hello.jsp中的相关代码:

//循环执行,每隔15秒钟执行一次check
window.setInterval(check, 15000);

关于SkySchedule管理页面的使用介绍就到次为止,如有问题、意见或者建议,欢迎留言交流,谢谢。

 

转载请注明出处:

http://moon-walker.iteye.com/blog/2391954

猜你喜欢

转载自moon-walker.iteye.com/blog/2391954