公司有一个单独跑各种定时的一个项目,最近总是频繁的出现故障,主要的原因就是机器的性能问题。
确实一台4核8G的机器,要负责上百个定时任务,有的任务线程十分的频繁,随着后面业务的拓展,这种单机的模式显然已经不能满足后续的需求。
来吧,那就开始重构吧。
重构的大体思路就是,由单机版重构为分布式形式,用拓展的思路,堆服务器的套路,解决后面无穷无尽的需求。
因为单位用的PRC架构是比较流行的Zookeeper+dubbo,zk作为优秀的分布式管理平台,做这种分布式的定时任务,那简直再适合不过了。
为了演示方便,我就在本地起一个zk的服务,然后新建两个SpringBoot作为虚拟的分布式定时服务。
一:本地搭建zookeeper环境
为了方便测试,首先就是本地搭建zk的环境,这种zk的包网上十分普遍,我用的zk版本是3.4.2。
二:新建两个SpringBoot
import com.dangdang.ddframe.job.api.ShardingContext;//当当网的开源架构
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.zen.elasticjob.spring.boot.annotation.ElasticJobConfig;
@ElasticJobConfig(cron = "0/5 * * * * ? *", shardingTotalCount = 1,
shardingItemParameters = "0=ZKJob1A,1=ZKJob1B",
startedTimeoutMilliseconds = 5000L,
completedTimeoutMilliseconds = 10000L)
public class ZKJob1 implements SimpleJob{
@Override
public void execute(ShardingContext shardingContext) {
System.out.print("任务【1】开始"+System.currentTimeMillis()+"nt");
}
}
分布式的作业框架用的是当当网开源的elastic-job,这个框架十分契合公司需求,也是市场上十分成熟的框架,并且对SpringBoot十分友好,引入就能用
com.github.xjzrc.spring.boot elastic-job-lite-spring-boot-starter1.0.1 org.apache.curator curator-frameworkorg.apache.curator curator-recipesorg.apache.curator curator-framework2.10.0 org.apache.curator curator-recipes2.10.0 org.apache.curator curator-framework
还有就是再配置文件中配置本地的zk地址,为了注册使用(为了安全起见,我用了zk的权限令牌模式,避免将服务暴露给别人)
spring.elasticjob.zookeeper.server-lists=127.0.0.1:2181 //本地地址 spring.elasticjob.zookeeper.namespace=zk1 //命名空间 spring.elasticjob.zookeeper.digest=zookee:zookee //令牌模式 spring.elasticjob.zookeeper.connection-timeout-milliseconds=10000 //超时时间 server.port=9091
三;启动脚本
最后就是分别启动两个boot
可以看到,当两台机器都启动的情况下,zk只会跑其中一台机器的定时,当将任务1的定时停止后,任务2的定时会同时启动。
这种情况就完美的解决了多任务同时进行的痛点,最大程度上的将并发的难点,分摊到各台机器上去,并且ZK最主要的特性就是一致性,这就避免了多服务器的情况下,同一个时间点跑同一个定时的问题。
问题完美解决,后面再有更多的需求,那就都交给了zookeeper这个管理员。



