分布式作业 Elastic-Job 快速上手指南
轉(zhuǎn)載自?分布式作業(yè) Elastic-Job 快速上手指南
Elastic-Job支持 JAVA API 和 Spring 配置兩種方式配置任務(wù),這里我們使用 JAVA API 的形式來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的任務(wù)入門,現(xiàn)在都是 Spring Boot 時(shí)代了,所以不建議使用 Spring 配置文件的形式。
Elastic-Job 需要依賴 Zookeeper 中間件,用于注冊(cè)和協(xié)調(diào)作業(yè)分布式行為的組件,目前僅支持 Zookeeper。我們已經(jīng)創(chuàng)建了 Zookeeper 集群!
環(huán)境要求
1、Java 請(qǐng)使用 JDK 1.7 及其以上版本。
2、Zookeeper 請(qǐng)使用 Zookeeper 3.4.6 及其以上版本。
3、Maven 請(qǐng)使用 Maven 3.0.4 及其以上版本。
引入maven依賴
<dependency><groupId>com.dangdang</groupId><artifactId>elastic-job-lite-core</artifactId><version>2.1.5</version> </dependency>這里有一個(gè)坑,這個(gè)依賴?yán)锩鏁?huì)包含有兩個(gè)不同版本的 curator-client,導(dǎo)致調(diào)用里面方法的時(shí)候會(huì)找不到方法,所以需要單獨(dú)引入 curator-client 的依賴包。
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-client</artifactId><version>2.11.1</version> </dependency>創(chuàng)建作業(yè)
Elastic-Job 提供 Simple、Dataflow 和 Script 3種作業(yè)類型。
方法參數(shù) shardingContext 包含作業(yè)配置、片和運(yùn)行時(shí)信息。可通過(guò) getShardingTotalCount(), getShardingItem() 等方法分別獲取分片總數(shù),運(yùn)行在本作業(yè)服務(wù)器的分片序列號(hào)等。
這里我們創(chuàng)建一個(gè)簡(jiǎn)單(Simple)作業(yè)。
public class MyElasticJob implements SimpleJob {@Overridepublic void execute(ShardingContext context) {switch (context.getShardingItem()) {case 0: {System.out.println("MyElasticJob - 0");break;}case 1: {System.out.println("MyElasticJob - 1");break;}case 2: {System.out.println("MyElasticJob - 2");break;}default: {System.out.println("MyElasticJob - default");}}} }上面的0-2涉及分布式作業(yè)框架中分片的概念
任務(wù)的分布式執(zhí)行,需要將一個(gè)任務(wù)拆分為多個(gè)獨(dú)立的任務(wù)項(xiàng),然后由分布式的服務(wù)器分別執(zhí)行某一個(gè)或幾個(gè)分片項(xiàng)。
例如:有一個(gè)遍歷數(shù)據(jù)庫(kù)某張表的作業(yè),現(xiàn)有2臺(tái)服務(wù)器。為了快速的執(zhí)行作業(yè),那么每臺(tái)服務(wù)器應(yīng)執(zhí)行作業(yè)的50%。為滿足此需求,可將作業(yè)分成2片,每臺(tái)服務(wù)器執(zhí)行1片。作業(yè)遍歷數(shù)據(jù)的邏輯應(yīng)為:服務(wù)器A遍歷ID以奇數(shù)結(jié)尾的數(shù)據(jù);服務(wù)器B遍歷ID以偶數(shù)結(jié)尾的數(shù)據(jù)。如果分成10片,則作業(yè)遍歷數(shù)據(jù)的邏輯應(yīng)為:每片分到的分片項(xiàng)應(yīng)為ID%10,而服務(wù)器A被分配到分片項(xiàng)0,1,2,3,4;服務(wù)器B被分配到分片項(xiàng)5,6,7,8,9,直接的結(jié)果就是服務(wù)器A遍歷ID以0-4結(jié)尾的數(shù)據(jù);服務(wù)器B遍歷ID以5-9結(jié)尾的數(shù)據(jù)。
作業(yè)分片策略:http://elasticjob.io/docs/elastic-job-lite/02-guide/job-sharding-strategy/
配置作業(yè)
Elastic-Job 配置分為3個(gè)層級(jí),分別是 Core, Type 和 Root,每個(gè)層級(jí)使用相似于裝飾者模式的方式裝配。
Core 對(duì)應(yīng) JobCoreConfiguration,用于提供作業(yè)核心配置信息,如:作業(yè)名稱、分片總數(shù)、CRON表達(dá)式等。
Type 對(duì)應(yīng) JobTypeConfiguration,有3個(gè)子類分別對(duì)應(yīng) SIMPLE, DATAFLOW 和 SCRIPT 類型作業(yè),提供3種作業(yè)需要的不同配置,如:DATAFLOW 類型是否流式處理或 SCRIPT 類型的命令行等。
Root 對(duì)應(yīng) JobRootConfiguration,有2個(gè)子類分別對(duì)應(yīng) Lite 和 Cloud 部署類型,提供不同部署類型所需的配置,如:Lite類型的是否需要覆蓋本地配置或 Cloud 占用 CPU 或 Memory 數(shù)量等。
在 Spring Boot 啟動(dòng)類里面加作業(yè)配置代碼。
private static CoordinatorRegistryCenter createRegistryCenter() {CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(new ZookeeperConfiguration("192.168.10.31:2181,192.168.10.32:2181,192.168.10.33:2181", "elastic-job-demo"));regCenter.init();return regCenter; }private static LiteJobConfiguration createJobConfiguration() {// 定義作業(yè)核心配置JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder("demoSimpleJob", "0/15 * * * * ?", 10).build();// 定義SIMPLE類型配置SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig, MyElasticJob.class.getCanonicalName());// 定義Lite作業(yè)根配置LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).build(); }@Bean public CommandLineRunner commandLineRunner() {return (String... args) -> {new JobScheduler(createRegistryCenter(), createJobConfiguration()).init();}; }SimpleJobConfiguration 實(shí)現(xiàn)了JobTypeConfiguration接口。
LiteJobConfiguration 實(shí)現(xiàn)了JobRootConfiguration接口。
使用CommandLineRunner,可以等 Spring Boot 啟動(dòng)后再啟動(dòng) Elastic-Job 作業(yè)。
其他的最基礎(chǔ)的 Spring Boot 的配置就不說(shuō)了,不懂的可以去公眾號(hào)菜單 Spring Boot 專題中學(xué)習(xí)。
更多作業(yè)的配置請(qǐng)參考官方文檔:http://elasticjob.io/docs/elastic-job-lite/02-guide/config-manual/
啟動(dòng)作業(yè)
在工具里面使用 maven 命令 spring-boot:run 啟動(dòng)即可。
程序輸出:
MyElasticJob - 0 MyElasticJob - 1 MyElasticJob - 2 MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default由于是單個(gè)實(shí)例,所有 10 個(gè)分片都在一個(gè)實(shí)例輸出來(lái)了,現(xiàn)在我們把它打成 jar 包,然后再用另外一個(gè)端口啟動(dòng)看下是否分片成功。
兩邊分別輸出:
MyElasticJob - 0 MyElasticJob - 1 MyElasticJob - 2 MyElasticJob - default MyElasticJob - default和
MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default上面的輸出信息說(shuō)明分片成功了,然后停掉一個(gè)項(xiàng)目后發(fā)現(xiàn)又自動(dòng)觸發(fā)分片,所有的都在同一個(gè)輸出來(lái)了。
可以看出分片功能真的非常實(shí)用,作業(yè)開(kāi)發(fā)起來(lái)真的很方便,整個(gè)架構(gòu)也很清晰,推薦大家使用。
總結(jié)
以上是生活随笔為你收集整理的分布式作业 Elastic-Job 快速上手指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java中的基本数据类型转换(自动、强制
- 下一篇: 什么是晶体 何谓晶体