分布式作业 Elastic-Job 快速上手指南
轉(zhuǎn)載自?分布式作業(yè) Elastic-Job 快速上手指南
Elastic-Job支持 JAVA API 和 Spring 配置兩種方式配置任務(wù),這里我們使用 JAVA API 的形式來創(chuàng)建一個簡單的任務(wù)入門,現(xiàn)在都是 Spring Boot 時代了,所以不建議使用 Spring 配置文件的形式。
Elastic-Job 需要依賴 Zookeeper 中間件,用于注冊和協(xié)調(diào)作業(yè)分布式行為的組件,目前僅支持 Zookeeper。我們已經(jīng)創(chuàng)建了 Zookeeper 集群!
環(huán)境要求
1、Java 請使用 JDK 1.7 及其以上版本。
2、Zookeeper 請使用 Zookeeper 3.4.6 及其以上版本。
3、Maven 請使用 Maven 3.0.4 及其以上版本。
引入maven依賴
<dependency><groupId>com.dangdang</groupId><artifactId>elastic-job-lite-core</artifactId><version>2.1.5</version> </dependency>這里有一個坑,這個依賴里面會包含有兩個不同版本的 curator-client,導(dǎo)致調(diào)用里面方法的時候會找不到方法,所以需要單獨引入 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è)配置、片和運行時信息。可通過 getShardingTotalCount(), getShardingItem() 等方法分別獲取分片總數(shù),運行在本作業(yè)服務(wù)器的分片序列號等。
這里我們創(chuàng)建一個簡單(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í)行,需要將一個任務(wù)拆分為多個獨立的任務(wù)項,然后由分布式的服務(wù)器分別執(zhí)行某一個或幾個分片項。
例如:有一個遍歷數(shù)據(jù)庫某張表的作業(yè),現(xiàn)有2臺服務(wù)器。為了快速的執(zhí)行作業(yè),那么每臺服務(wù)器應(yīng)執(zhí)行作業(yè)的50%。為滿足此需求,可將作業(yè)分成2片,每臺服務(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)為:每片分到的分片項應(yīng)為ID%10,而服務(wù)器A被分配到分片項0,1,2,3,4;服務(wù)器B被分配到分片項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個層級,分別是 Core, Type 和 Root,每個層級使用相似于裝飾者模式的方式裝配。
Core 對應(yīng) JobCoreConfiguration,用于提供作業(yè)核心配置信息,如:作業(yè)名稱、分片總數(shù)、CRON表達式等。
Type 對應(yīng) JobTypeConfiguration,有3個子類分別對應(yīng) SIMPLE, DATAFLOW 和 SCRIPT 類型作業(yè),提供3種作業(yè)需要的不同配置,如:DATAFLOW 類型是否流式處理或 SCRIPT 類型的命令行等。
Root 對應(yīng) JobRootConfiguration,有2個子類分別對應(yīng) Lite 和 Cloud 部署類型,提供不同部署類型所需的配置,如:Lite類型的是否需要覆蓋本地配置或 Cloud 占用 CPU 或 Memory 數(shù)量等。
在 Spring Boot 啟動類里面加作業(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 實現(xiàn)了JobTypeConfiguration接口。
LiteJobConfiguration 實現(xiàn)了JobRootConfiguration接口。
使用CommandLineRunner,可以等 Spring Boot 啟動后再啟動 Elastic-Job 作業(yè)。
其他的最基礎(chǔ)的 Spring Boot 的配置就不說了,不懂的可以去公眾號菜單 Spring Boot 專題中學(xué)習(xí)。
更多作業(yè)的配置請參考官方文檔:http://elasticjob.io/docs/elastic-job-lite/02-guide/config-manual/
啟動作業(yè)
在工具里面使用 maven 命令 spring-boot:run 啟動即可。
程序輸出:
MyElasticJob - 0 MyElasticJob - 1 MyElasticJob - 2 MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default由于是單個實例,所有 10 個分片都在一個實例輸出來了,現(xiàn)在我們把它打成 jar 包,然后再用另外一個端口啟動看下是否分片成功。
兩邊分別輸出:
MyElasticJob - 0 MyElasticJob - 1 MyElasticJob - 2 MyElasticJob - default MyElasticJob - default和
MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default上面的輸出信息說明分片成功了,然后停掉一個項目后發(fā)現(xiàn)又自動觸發(fā)分片,所有的都在同一個輸出來了。
可以看出分片功能真的非常實用,作業(yè)開發(fā)起來真的很方便,整個架構(gòu)也很清晰,推薦大家使用。
總結(jié)
以上是生活随笔為你收集整理的分布式作业 Elastic-Job 快速上手指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中的基本数据类型转换(自动、强制
- 下一篇: switch case 支持的 6 种数