1 概述
Elastic-Job-Lite
定位爲輕量級無中心化解決方案,使用jar包的形式提供分佈式任務的協調服務,外部依賴僅Zookeeper
。
具體參考,官網
2 核心理念
分佈式調度
Elastic-Job-Lite
並無作業調度中心節點,而是基於部署作業框架的程序在到達相應時間點時各自觸發調度。- 註冊中心僅用於作業註冊和監控信息存儲。而主作業節點僅用於處理分片和清理等功能。
作業高可用
Elastic-Job-Lite
提供最安全的方式執行作業。將分片總數設置爲1,並使用多於1臺的服務器執行作業,作業將會以1主n從的方式執行。- 一旦執行作業的服務器崩潰,等待執行的服務器將會在下次作業啓動時替補執行。開啓失效轉移功能效果更好,可以保證在本次作業執行時崩潰,備機立即啓動替補執行。
最大限度利用資源
Elastic-Job-Lite
也提供最靈活的方式,最大限度的提高執行作業的吞吐量。將分片項設置爲大於服務器的數量,最好是大於服務器倍數的數量,作業將會合理的利用分佈式資源,動態的分配分片項。- 例如:3臺服務器,分成10片,則分片項分配結果爲服務器A=0,1,2;服務器B=3,4,5;服務器C=6,7,8,9。 如果服務器C崩潰,則分片項分配結果爲服務器A=0,1,2,3,4;服務器B=5,6,7,8,9。在不丟失分片項的情況下,最大限度的利用現有資源提高吞吐量。
3 添加依賴
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>2.1.5</version>
</dependency>
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring</artifactId>
<version>2.1.5</version>
</dependency>
4 配置文件
# 數據源配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/springboot?characterEncoding=utf-8&verifyServerCertificate=false&useSSL=false&requireSSL=false
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
# zk配置
regCenter:
serverList: localhost:2181
namespace: elastic-job-lite-springboot
# 定時任務配置
simpleJob:
cron: 0/5 * * * * ?
shardingTotalCount: 3
shardingItemParameters: 0=Beijing,1=Shanghai,2=Guangzhou
5 註冊中心配置
@Configuration
@ConditionalOnExpression("'${regCenter.serverList}'.length() > 0")
public class RegistryCenterConfig {
@Bean(initMethod = "init")
public ZookeeperRegistryCenter regCenter(@Value("${regCenter.serverList}") final String serverList,
@Value("${regCenter.namespace}") final String namespace) {
return new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverList, namespace));
}
}
6 事件追蹤源配置
@Configuration
public class JobEventConfig {
@Resource
private DataSource dataSource;
@Bean
public JobEventConfiguration jobEventConfiguration() {
return new JobEventRdbConfiguration(dataSource);
}
}
7 任務配置
@Configuration
public class SimpleJobConfig {
@Resource
private ZookeeperRegistryCenter regCenter;
@Resource
private JobEventConfiguration jobEventConfiguration;
@Bean
public SimpleJob simpleJob() {
return new SpringSimpleJob();
}
@Bean(initMethod = "init")
public JobScheduler simpleJobScheduler(final SimpleJob simpleJob,
@Value("${simpleJob.cron}") final String cron,
@Value("${simpleJob.shardingTotalCount}") final int shardingTotalCount,
@Value("${simpleJob.shardingItemParameters}") final String shardingItemParameters) {
return new SpringJobScheduler(simpleJob, regCenter,
getLiteJobConfiguration(simpleJob.getClass(), cron, shardingTotalCount, shardingItemParameters)
, jobEventConfiguration);
}
private LiteJobConfiguration getLiteJobConfiguration(final Class<? extends SimpleJob> jobClass,
final String cron, final int shardingTotalCount,
final String shardingItemParameters) {
return LiteJobConfiguration.newBuilder(new SimpleJobConfiguration(JobCoreConfiguration.newBuilder(
jobClass.getName(), cron, shardingTotalCount).shardingItemParameters(shardingItemParameters).build(),
jobClass.getCanonicalName()))
.overwrite(true).build();
}
}
省略實體代碼,請參考源碼
8 測試結果
8.1 啓動zk
- 官網下載,zookeeper,解壓,啓動腳本
/zookeeper-XX/bin/zkServer.sh
8.2 啓動工程
9 工程目錄
10 結束語
Elastic-Job-Lite
與XXL job
最大的區別是,沒有調度中心,更加輕量化,但是要依賴zk
,讀者可以根據自己項目需求選擇,本文源碼。
歡迎關注博主公衆號,第一時間推送最新文章