27 May 2017
今天是我第一天开始接触elasticjob。主要是单位里领导要求做一套可以分布式的job系统,支持按间隔,或者按照指定时间点进行任务的调度。用户可以通过编写相关的包的方式来编写自己的job逻辑,然后交给我的系统进行调度运行,最好支持高可用和分布式,分片运行的概念。
如果没有分布式的要求,其实使用java世界里的job大哥大quartz就能很好的完成前面的所有的要求,
问题还是考虑到后期的扩展,高可用,还是需要考虑分布式的方案。最终通过网络搜索,找到了当当网很久前开源的elasticjob。看了下github的地址,最近还是有人提交更新的,应该值得一试。于是就有了今天的blog系列。如果方案可行且领导批准,那我就会把我的心得和使用结果记录在这里。并且应该会有一部分源码的分析。
首先试elastic-job的地址 https://github.com/dangdangdotcom/elastic-job
分布式调度协调
弹性扩容缩容
失效转移
错过执行作业重触发
作业分片一致性,保证同一分片在分布式环境中仅一个执行实例
自诊断并修复分布式不稳定造成的问题
支持并行调度
支持作业生命周期操作
丰富的作业类型
Spring整合以及命名空间提供
运维平台
elastic-job-core
elastic-job核心模块,只通过Quartz和Curator就可执行分布式作业。
elastic-job-spring
elastic-job对spring支持的模块,包括命名空间,依赖注入,占位符等。
elastic-job-console
elastic-job web控制台,可将编译之后的war放入tomcat等servlet容器中使用。
elastic-job-example
使用例子。
elastic-job-test
测试elastic-job使用的公用类,使用方无需关注。
引入maven依赖
elastic-job已经发布到中央仓库,可以在pom.xml文件中直接引入maven坐标。
<!-- 引入elastic-job核心模块 -->
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-core</artifactId>
<version>xxxlatest</version>
</dependency>
<!-- 使用springframework自定义命名空间时引入 -->
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-spring</artifactId>
<version>xxxlatest</version>
</dependency>
第一步就是clone整个项目下来,里面有源码和必要的example。源码采用maven进行编译
编译步骤:
mvn clean install -Dmaven.test.skip=true
进行elastic-job的安装,安装后,所有的源码会放到本地maven仓库里,这里跳过了所有的test
第二步,
编译所有的examples
cd elastic-job-example
mvn clean package -Dmaven.test.skip=true
然后就是使用自己心爱的ide打开源码或者example进行编译调试以及学习。我这里用的试idea。当然里面有个小插曲,这里的elastic-job的源码大量采用了lombok进行java代码的生成,主要是一些constructor,getter,setter等。当然好处是减少了模板代码的出现,眼睛不至于这么累。缺点,就是,你得多学个东西,然后idea里或者eclipse里需要自己配置下。具体的网上搜索下就行了。还有就是,有时候代码从example跳转到elasticjob源码的时候,有时候会行数与class有些差异,当然问题不大,强迫症看着有些不舒服。
先从elastic-job-lite的JavaMain开始进行运行,默认使用h2 in-memory模式记录任务状态,可以通过修改代码的方式,改用mysql记录,方便自己查询结果
另外,默认JavaMain这个example使用的是zookeeper官方测试框架提供的内存zookeeper实例进行调试,后期需要自己设置zookeeper集群进行维护和开发。
zookeeper就是elasticjob的核心之一,用于维护集群的可用性,任务的分发协商。elasticjob基于Zookeeper和其客户端Curator实现的全局作业注册控制中心。用于注册,控制和协调分布式作业执行。
以上就是简单的入门环境搭建。期待下个回合的elasticjob的开发实战。