分布式作业 Elastic-Job 快速上手指南

转载自 分布式作业 Elastic-Job 快速上手指南

Elastic-Job支持 JAVA API 和 Spring 配置两种方式配置任务,这里我们使用 JAVA API 的形式来创建一个简单的任务入门,现在都是 Spring Boot 时代了,所以不建议使用 Spring 配置文件的形式。

Elastic-Job 需要依赖 Zookeeper 中间件,用于注册和协调作业分布式行为的组件,目前仅支持 Zookeeper。我们已经创建了 Zookeeper 集群!

环境要求

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,导致调用里面方法的时候会找不到方法,所以需要单独引入 curator-client 的依赖包。

<dependency><groupId>org.apache.curator</groupId><artifactId>curator-client</artifactId><version>2.11.1</version>
</dependency>

创建作业

Elastic-Job 提供 Simple、Dataflow 和 Script 3种作业类型。

方法参数 shardingContext 包含作业配置、片和运行时信息。可通过 getShardingTotalCount(), getShardingItem() 等方法分别获取分片总数,运行在本作业服务器的分片序列号等。

这里我们创建一个简单(Simple)作业。

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涉及分布式作业框架中分片的概念

任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的服务器分别执行某一个或几个分片项。

例如:有一个遍历数据库某张表的作业,现有2台服务器。为了快速的执行作业,那么每台服务器应执行作业的50%。为满足此需求,可将作业分成2片,每台服务器执行1片。作业遍历数据的逻辑应为:服务器A遍历ID以奇数结尾的数据;服务器B遍历ID以偶数结尾的数据。如果分成10片,则作业遍历数据的逻辑应为:每片分到的分片项应为ID%10,而服务器A被分配到分片项0,1,2,3,4;服务器B被分配到分片项5,6,7,8,9,直接的结果就是服务器A遍历ID以0-4结尾的数据;服务器B遍历ID以5-9结尾的数据。

作业分片策略:http://elasticjob.io/docs/elastic-job-lite/02-guide/job-sharding-strategy/

配置作业

Elastic-Job 配置分为3个层级,分别是 Core, Type 和 Root,每个层级使用相似于装饰者模式的方式装配。

Core 对应 JobCoreConfiguration,用于提供作业核心配置信息,如:作业名称、分片总数、CRON表达式等。

Type 对应 JobTypeConfiguration,有3个子类分别对应 SIMPLE, DATAFLOW 和 SCRIPT 类型作业,提供3种作业需要的不同配置,如:DATAFLOW 类型是否流式处理或 SCRIPT 类型的命令行等。

Root 对应 JobRootConfiguration,有2个子类分别对应 Lite 和 Cloud 部署类型,提供不同部署类型所需的配置,如:Lite类型的是否需要覆盖本地配置或 Cloud 占用 CPU 或 Memory 数量等。

在 Spring Boot 启动类里面加作业配置代码。

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() {// 定义作业核心配置JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder("demoSimpleJob", "0/15 * * * * ?", 10).build();// 定义SIMPLE类型配置SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig, MyElasticJob.class.getCanonicalName());// 定义Lite作业根配置LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).build();
}@Bean
public CommandLineRunner commandLineRunner() {return (String... args) -> {new JobScheduler(createRegistryCenter(), createJobConfiguration()).init();};
}

SimpleJobConfiguration 实现了JobTypeConfiguration接口。

LiteJobConfiguration 实现了JobRootConfiguration接口。

使用CommandLineRunner,可以等 Spring Boot 启动后再启动 Elastic-Job 作业。

其他的最基础的 Spring Boot 的配置就不说了,不懂的可以去公众号菜单 Spring Boot 专题中学习。

更多作业的配置请参考官方文档:http://elasticjob.io/docs/elastic-job-lite/02-guide/config-manual/

启动作业

在工具里面使用 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 个分片都在一个实例输出来了,现在我们把它打成 jar 包,然后再用另外一个端口启动看下是否分片成功。

两边分别输出:

MyElasticJob - 0
MyElasticJob - 1
MyElasticJob - 2
MyElasticJob - default
MyElasticJob - default

MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default

上面的输出信息说明分片成功了,然后停掉一个项目后发现又自动触发分片,所有的都在同一个输出来了。

可以看出分片功能真的非常实用,作业开发起来真的很方便,整个架构也很清晰,推荐大家使用。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7-指令系统

README】 1.本文总结自bilibili《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 机器指令&#xff1a; CPU能够识别并且执行的操作命令&#xff1b;有可以理解为不同cpu&#xff0c;在生产时预设了一组…

WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例

最近出于工作需要&#xff0c;了解了一下微服务架构&#xff08;Microservice Architecture&#xff0c;MSA&#xff09;。我经过两周业余时间的努力&#xff0c;凭着自己对微服务架构的理解&#xff0c;从无到有&#xff0c;基于.NET打造了一个演示微服务架构的应用程序案例&a…

常用的数据交换格式有哪些_高程数据格式介绍

高程数据格式介绍1 概述目前业内常用的地形数据格式有img,tif,grp及dem,其中dem在地形表达中能力最强&#xff0c;效果最好&#xff0c;本文围绕dem的数据格式进行介绍。2 DEM简介数字高程模型(Digital Elevation Model)&#xff0c;简称DEM&#xff0c;是通过有限的地形高程数…

switch case 支持的 6 种数据类型

转载自 switch case 支持的 6 种数据类型那么今天就讲一下 Java 中的 switch case 语句吧&#xff0c;有忘记的同学正好可以温习一下。 Java 中 switch case 语句用来判断一个变量与一系列值中某个值是否相等&#xff0c;每个值称为一个分支。 语法格式如下&#xff1a; switc…

1-操作系统启动前的工作

【README】 1.本文总结自B站《操作系统&#xff08;哈工大李治军老师&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 【1】计算机上电 1&#xff09; 问题&#xff1a; 这神秘的黑色背后发生了什么 &#xff1f;计算机是怎么工作的&#x…

傅里叶变换公式_理解1维傅里叶变换

上个学期&#xff0c;学习了信号与系统。虽然知道了傅里叶变换的作用以及如何使用。但是对于它的本质&#xff0c;也就是FT是如何探测到频率的尚有疑惑。而恰好在知乎上发现了一些很好的回答。故将这些回答整理在这。感性理解1维FT知友Heinrich写的傅里叶分析之掐死教程&#x…

ASP.NET Core的配置(3): 将配置绑定为对象

出于编程上的便利&#xff0c;我们通常不会直接利用ConfigurationBuilder创建的Configuration对象读取某个单一配置项的值&#xff0c;而是倾向于将一组相关的配置绑定为一个对象&#xff0c;我们将后者称为Options对象。我们在《ASP.NET Core的配置&#xff08;1&#xff09;&…

11 个简练的 Java 性能调优技巧

转载自 11 个简练的 Java 性能调优技巧想要让你的项目一直高性能运作吗&#xff1f;以下有一些技巧你可以拿去消除缓存瓶颈&#xff0c;还有一些其他的性能调优建议。 大多数开发者认为性能优化是一个复杂的话题&#xff0c;它需要大量的工作经验和相关知识理论。好吧&#xff…

pre1-flink理论-批处理与流处理+简单示例

【README】 1.本文包含了 批处理与流处理的代码示例&#xff1b; 批处理&#xff1a;把数据 攒在一起&#xff08;或攒一段时间或攒一定内存大小&#xff09;&#xff0c;然后再处理&#xff0c;这叫批处理&#xff1b;流处理&#xff1a;数据每来一个就处理一个&#xff1b;…

python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式

本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式。分享给大家供大家参考&#xff0c;具体如下&#xff1a;表单介绍表单是HTML页面中负责数据采集功能的部件。由表单标签&#xff0c;表单域和表单按钮组成。通过表单&#xff0c;将用户输入的数据提交给服务器&am…

高级 | Java中获取类名的3种方法

转载自 高级 | Java中获取类名的3种方法获取类名的方法 Java 中获取类名的方式主要有以下三种。 getName() 返回的是虚拟机里面的class的类名表现形式。 getCanonicalName() 返回的是更容易理解的类名表示。 getSimpleName() 返回的是类的简称。 都有什么区别&#xff1f; 通过…

Asp.net 面向接口可扩展框架之核心容器

新框架的容器部分终于调通了&#xff01;容器实在太重要了,所以有用了一个名词叫“核心容器”。 容器为什么那么重要呢&#xff1f;这个有必要好好说道说道。 1、首先我们从框架名称面向接口编程说起,什么是面向接口编程&#xff1f;(这个度娘回答一下) 解读一下:类是个体的定义…

pre2-flink单机部署与job提交

【README】 本文记录了flink单机部署&#xff0c;以及flink job2种提交方式&#xff1b; 【1】flink 单机部署 step1&#xff09;下载flink 包&#xff1b; Apache Flink: Stateful Computations over Data Streamshttps://flink.apache.org/ step2&#xff09;解压 tar -z…

到底什么是跨域?附解决方案

转载自 到底什么是跨域&#xff1f;附解决方案什么是跨域 要了解跨域&#xff0c;先要说说同源策略。 同源策略是由 Netscape 公司提出的一个著名的安全策略&#xff0c;所有支持 JavaScript 的浏览器都会使用这个策略。 所谓同源是指&#xff0c;域名&#xff0c;协议&#xf…

vue 字典_【开源】基于Vue的前端组件库HeyUI

说道vue组件库&#xff0c;目前主流的基本就是iview和element。今天又发现一个很不错的。HeyUI。组件也很丰富&#xff0c;入门比较简单。反正开源框架我们有不嫌多&#xff0c;多多益善啊。感兴趣的可以看看。关于HeyUIHeyUI 是一套基于 Vue2.0 的开源 UI 组件库&#xff0c;主…

(译)java8-流定义

【README】 本文翻译自 Stream In Java - GeeksforGeeks &#xff0c; 主要介绍了java8流&#xff1b; 【1】流 1&#xff09;流定义&#xff1a;流是支持各种方法的对象序列&#xff08;一系列对象&#xff09;&#xff0c;这些方法可以流水线化调用以产生期望结果&#xff…

基于CefSharp构建基于Chromium的应用程序

chromium是google chrome浏览器所采用的内核&#xff0c;最开始由苹果的webkit发展而出&#xff0c;由于webkit在发展上存在分歧&#xff0c;而google希望在开发上有更大的自由 度&#xff0c;2013年google决定自己开发webcore的分支&#xff0c;叫做Blink引擎&#xff0c;而后…

最新后端架构师技术图谱

转载自 最新后端架构师技术图谱深呼吸&#xff0c;慢慢学&#xff0c;技术长路漫漫… 数据结构二叉树完全二叉树平衡二叉树二叉查找树&#xff08;BST&#xff09;红黑树B-&#xff0c;B&#xff0c;B*树LSM 树队列集合链表、数组字典、关联数组栈树BitSet常用算法KPM 算法选择…

ansible脚本-Playbook(一)

Playbook组成部分&#xff1a; task 任务&#xff1a;包含目标主机上执行的操作&#xff0c;使用模块定义这些操作&#xff0c;每个任务都是一个模块的调用Variables变量&#xff1a;存储和传递数据&#xff0c;变量可以自定义&#xff0c;可以在playbook当中定义为全局变量&a…

三级pc技术_第十九周PC、笔电、数码周边新品汇总:AMD英特尔激战正酣

【dogkeji-科技犬】各位网友周末好&#xff0c;又到了2020年第十九周的PC、笔电、数码周边新品发布汇总时刻&#xff08;2020年5月4日至2020年5月9日&#xff09;&#xff0c;那么本周有那些PC、笔电、数码周边新品发布呢&#xff1f;通过科技犬的汇总我们来一起回顾一下吧。AM…