27 May 2017

elastic-job 当当开源分布式job系列(1)

今天是我第一天开始接触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的开发实战。