分布式任務調度

今天我們講講分布式定時任務調度—ElasticJob。

一、概述

1、什么是分布式任務調度

我們可以思考?下下?業務場景的解決?案:

  • 某電商平臺需要每天上午10點,下午3點,晚上8點發放?批優惠券

  • 某銀?系統需要在信?卡到期還款?的前三天進?短信提醒

  • 某財務系統需要在每天凌晨0:10分結算前?天的財務數據,統計匯總

以上場景就是任務調度所需要解決的問題

任務調度是為了?動完成特定任務,在約定的特定時刻去執?任務的過程

2、為什么需要分布式調度

我們在之前使?過Spring中提供的定時任務注解@Scheduled,在業務類中?法中貼上這個注解然后在啟動類上貼上 @EnableScheduling 注解

那為什么又需要分布式調度?

感覺Spring給我們提供的這個注解可以完成任務調度的功能,好像已經完美解決問題了,為什么還需要分布式呢?

主要有如下這?點原因:

1.單機處理極限:原本1分鐘內需要處理1萬個訂單,但是現在需要1分鐘內處理10萬個訂單;原來?個統計需要1?時,現在業務?需要10分鐘就統計出來。你也許會說,你也可以多線程、單機多進程處理。的確,多線程并?處理可以提?單位時間的處理效率,但是單機能?畢竟有限(主要是CPU、內存和磁盤),始終會有單機處理不過來的情況。

2.?可?:單機版的定式任務調度只能在?臺機器上運?,如果程序或者系統出現異常就會導致功能不可?。雖然可以在單機程序實現的?夠穩定,但始終有機會遇到?程序引起的故障,?這個對于?個系統的核?功能來說是不可接受的。

3.防?重復執?: 在單機模式下,定時任務是沒什么問題的。但當我們部署了多臺服務,同時?每臺服務?有定時任務時,可能會出現任務重復執行

這個時候就需要分布式的任務調度來實現了。

3、Elastic-Job介紹

Elastic-Job是?個分布式調度的解決?案,由當當?開源,它由兩個相互獨?的?項?Elastic-job-Lite和

Elastic-Job-Cloud組成,使?Elastic-Job可以快速實現分布式任務調度。

Elastic-Job的地址: ElasticJob - Distributed scheduled job solution

功能列表:

  • 分布式調度協調

在分布式環境中,任務能夠按照指定的調度策略執?,并且能夠避免同?任務多實例重復執?。

  • 豐富的調度策略:

基于成熟的定時任務作業框架Quartz cron表達式執?定時任務。

  • 彈性拓容縮容

當集群中增加?個實例,它應當能夠被選舉被執?任務;當集群減少?個實例時,他所執?的任務能被轉移到別的示例中執?。

  • 失效轉移

某示例在任務執?失敗后,會被轉移到其他實例執?。

  • 錯過執?任務重觸發

若因某種原因導致作業錯過執?,?動記錄錯誤執?的作業,并在下次次作業完成后?動觸發。

  • ?持并?調度

?持任務分?,任務分?是指將?個任務分成多個?任務在多個實例同時執?。

  • 作業分??致性

當任務被分?后,保證同?分?在分布式環境中僅?個執?實例。

  • ?持作業?命周期操作

可以動態對任務進?開啟及停?操作。

  • 豐富的作業類型

?持Simple、DataFlow、Script三種作業類型

系統運行架構圖

二、Zookeeper下載

建議:zookeeper3.4.6以上版本,JDK1.7以上,maven在3.0.4以上

我這里將Zookeeper安裝到了Linux系統上,以我自己安裝為例,可自行選擇。

1.上傳,將zookeeper-3.4.11.tar.gz上傳到/usr/local/src/soft/zookeeper目錄下

2.解壓文件到指定目錄

tar -zxvf /usr/local/src/soft/zookeeper-3.4.11.tar.gz -C /usr/local/src/soft/zookeeper

3.拷貝配置文件

cp /usr/local/src/soft/zookeeper/zookeeper-3.4.11/conf/zoo_sample.cfg /usr/local/src/soft/zookeeper/zookeeper-3.4.11/conf/zoo.cfg

4.啟動

/usr/local/src/soft/zookeeper/apache-zookeeper-3.5.6-bin/bin/zkServer.sh start

5.檢查進程是否開啟

這個命令不一定有效

jps

可以試試這個命令,查看狀態

/usr/local/src/soft/zookeeper/apache-zookeeper-3.5.6-bin/bin/zkServer.sh status

三、任務分片參數

1、分片的概念

作業分片是指任務的分布式執行,需要將一個任務拆分為多個獨立的任務項,然后由分布式的應用實例分別執行某一個或者幾個分布項。

例如:Elastic-job快速入門中文件備份的案例,現有兩臺服務器,每臺服務器分別跑一個應用實例。為了快速執行作業,那么可以講任務分成4片,每個應用實例都執行兩片。作業遍歷數據邏輯應為:實例1查找text和image類型文件執行備份,實例2査找radio和vedio類型文件執行備份。如果由于服務器拓容應用實例數量增加為4,則作業諞歷數據的邏輯應為: 4個實例分別處理text,image,radio,video類型的文件。

可以看到,通過對任務的合理分片化,從而達到任務并行處理的效果.

  • 當只有一臺機器時,給定時任務分片四個,在機器中啟動四個線程,分別處理四個分片的內容

  • 當只有兩臺機器時,分片由兩臺機器進行分配,A負責索引為0,1的內容,B負責索引為2,3的內容

  • 三臺機器,如圖

  • 四臺機器,平均分攤

集群之后,可以分攤CPU的處理壓力,提高數據處理的速度,那到底幾臺機器好呢?

分片數建議是機器個數的倍數

在秒殺項目中,我們將秒殺商品的場次分成了10、12、14三個場次。在這里我們就根據場次將其分成三片

2、分片分配機制

ElasticJob的分片分配機制

  • Zookeeper 協調:ElasticJob 通過 Zookeeper 協調任務實例的分片分配。每個任務實例啟動時,會向 Zookeeper 注冊自己,并獲取分配給自己的分片信息。

  • 動態分片分配:如果任務實例的數量發生變化(比如新增或減少實例),Zookeeper 會重新分配分片,確保每個分片都有任務實例處理。

  • 分片參數傳遞:分片參數通過 ShardingContext 傳遞給任務實例,任務實例根據分片參數執行對應的邏輯。

ElasticJob 通過 Zookeeper 協調,將分片分配給不同的任務實例。每個任務實例啟動時,會從 Zookeeper 獲取分配給自己的分片信息(分片編號和分片參數)。

三、項目集成

1、依賴添加

<dependency><groupId>com.dangdang</groupId><artifactId>elastic-job-lite-spring</artifactId><version>2.1.5</version>
</dependency>
<!--zookeeper客戶端-->
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>2.10.0</version>
</dependency>

2、分布式調度配置

1)注冊中心配置

獲取zk的地址和任務名稱,將任務注冊到zk注冊中心中

@Configuration
public class RegistryCenterConfig {@Bean(initMethod = "init")public CoordinatorRegistryCenter createRegistryCenter(@Value("${elasticjob.zookeeper-url}") String zookeeperUrl, @Value("${elasticjob.group-name}") String groupName) {//zk的配置ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration(zookeeperUrl,groupName);//設置zk超時時間zookeeperConfiguration.setSessionTimeoutMilliseconds(100);//創建注冊中心CoordinatorRegistryCenter zookeeperRegistryCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);return zookeeperRegistryCenter;}
}
2)分布式調度參數配置
#分布式定時任務配置
elasticjob:zookeeper-url: 192.168.88.130:2181group-name: shop-job-groupjobCron:#3分鐘執行一次seckillProduct: 0 0/3 * * * ?
3)定時任務配置

需要使用定時任務的服務可能不止一個,不同的定時任務,表達式和分片參數、個數都不一樣

將不同的定時任務創建不同的LiteJobConfiguration對象,指定不同的參數類型,將其創建為一個Bean,交給spring容器管理

@Configuration
public class BusinessJobConfig {
@Bean(initMethod = "init")public SpringJobScheduler initSPJob(CoordinatorRegistryCenter registryCenter, SeckillProductJob seckillProductJob){LiteJobConfiguration jobConfiguration = ElasticJobUtil.createJobConfiguration(seckillProductJob.getClass(),seckillProductJob.getCron(),//任務類的cron表達式seckillProductJob.getShardingTotalCount(), //分片個數seckillProductJob.getShardingParameters(), //分片參數seckillProductJob.isDataflowType());//不是dataflow類型SpringJobScheduler springJobScheduler = new SpringJobScheduler(seckillProductJob, registryCenter,jobConfiguration );return springJobScheduler;}
}    
4)分布式調度工具類

主要是用于創建LiteJobConfiguration對象,為不同的定時任務定義不同的配置類型

  • 指定定時任務類

  • 任務類的cron表達式

  • 分片個數

  • 分片參數

  • 是否為dataflow類型

public class ElasticJobUtil {public static LiteJobConfiguration createJobConfiguration(final Class<? extends SimpleJob> jobClass,final String cron,final int shardingTotalCount,
final String shardingItemParameters,boolean dataflowType) {// 定義作業核心配置JobCoreConfiguration.Builder jobCoreConfigurationBuilder = JobCoreConfiguration.newBuilder(jobClass.getSimpleName(), cron, shardingTotalCount);if(!StringUtils.isEmpty(shardingItemParameters)){jobCoreConfigurationBuilder.shardingItemParameters(shardingItemParameters);}JobTypeConfiguration jobConfig = null;if(dataflowType){jobConfig = new DataflowJobConfiguration(jobCoreConfigurationBuilder.build(),jobClass.getCanonicalName(),true);}else {// 定義SIMPLE類型配置jobConfig = new SimpleJobConfiguration(jobCoreConfigurationBuilder.build(), jobClass.getCanonicalName());}// 定義Lite作業根配置LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(jobConfig).overwrite(true).build();return simpleJobRootConfig;}public static LiteJobConfiguration createDefaultSimpleJobConfiguration(final Class<? extends SimpleJob> jobClass, final String cron) {// 創建默認的SIMPLE類型作業配置return createJobConfiguration(jobClass,cron,1,null,false);}public static LiteJobConfiguration createDefaultDataFlowJobConfiguration(final Class<? extends SimpleJob> jobClass, final String cron) {// 創建默認的DataFlow類型作業配置return createJobConfiguration(jobClass,cron,1,null,true);}
}
5)任務分片參數配置
  1. 刪除之前的數據

  2. 查詢當天的數據同步Redis,定時任務每天執行一次

  3. 給定時任務分片處理,分三片

給定時任務做分片處理:0=10,1=12,2=14(第10場秒殺任務,第12場.........)

jobSharding:seckillProduct:shardingParameters: 0=10,1=12,2=14shardingTotalCount: 3dataflowType: false

3、定時任務類

初始化秒殺商品定時任務

@Data
@RefreshScope
@Component
public class SeckillProductJob implements SimpleJob {//表達式@Value("${elasticjob.jobCron.seckillProduct}")private String cron;//分片參數@Value("${jobSharding.seckillProduct.shardingParameters}")private String shardingParameters;//分片個數@Value("${jobSharding.seckillProduct.shardingTotalCount}")private int shardingTotalCount;@Value("${jobSharding.seckillProduct.dataflowType}")private boolean dataflowType;@Resourceprivate SeckillProductFeignApi seckillProductFeignApi;@Autowiredprivate StringRedisTemplate redisTemplate;@Overridepublic void execute(ShardingContext shardingContext) {String time = shardingContext.getShardingParameter();//遠程調用商品服務獲取秒殺列表集合Result<List<SeckillProductVo>> result = seckillProductFeignApi.queryByTime(Integer.valueOf(time));if (result==null||result.hasError()) {//通知管理員return;}List<SeckillProductVo> seckillProductVoList = result.getData();//獲取秒殺商品key-seckillProductHash:10String key = JobRedisKey.SECKILL_PRODUCT_HASH.getRealKey(time);//刪除之前的緩存redisTemplate.delete(key);HashMap<String, String> seckillProductMap = new HashMap<>();//存儲集合數據到Redis中for (SeckillProductVo vo : seckillProductVoList) {seckillProductMap.put(vo.getId().toString(), JSON.toJSONString(vo));}redisTemplate.opsForHash().putAll(key, seckillProductMap);System.out.println("分布式商品秒殺任務執行...............");}
}

秒殺列表緩存成功

4、任務分片處理邏輯

分片參數設置為 0=10,1=12,2=14,表示分片0處理時間參數為10的任務,分片1處理時間參數為12的任務,分片2處理時間參數為14的任務。ElasticJob 會根據分片參數將任務分片,并將每個分片分配給不同的任務實例執行。

  • 分片總數(ShardingTotalCount):表示任務的總分片數。比如你有3場秒殺活動,可以將分片總數設置為3,每個分片處理一場秒殺活動。

  • 分片參數(ShardingParameters):可以為每個分片指定參數,比如分片0處理第一場秒殺,分片1處理第二場秒殺,分片2處理第三場秒殺。

ElasticJob 通過 Zookeeper 協調,將分片分配給不同的任務實例。每個任務實例啟動時,會從 Zookeeper 獲取分配給自己的分片信息(分片編號和分片參數)。

今天的分享結束,感興趣的兄弟請點贊、收藏,關注我不迷路!下期再見!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73955.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73955.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73955.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微分方程求解及推導過程

微分方程求解及推導過程 本文將系統地推導微分方程&#xff1a; d z ( t ) d t A z ( t ) B u ( t ) \frac{\mathrm{d}\boldsymbol{z}(t)}{\mathrm{d}t} \boldsymbol{A}z(t) \boldsymbol{B}u(t) dtdz(t)?Az(t)Bu(t) 的通解過程&#xff0c;并分析其物理意義。 1. 初始條…

SQL 中 WHERE 與 HAVING 子句的使用

在編寫 SQL 查詢時&#xff0c;數據過濾是常見需求。WHERE 和 HAVING 子句雖然都用于篩選數據&#xff0c;但實際用法大不相同。本文通過具體示例對比兩者的核心區別&#xff0c;并結合實際場景演示聯合使用技巧&#xff0c;助力快速掌握這兩個關鍵工具的正確用法。 一、數據表…

Sampling – Model Context Protocol Specification

網頁鏈接 https://spec.modelcontextprotocol.io/specification/draft/client/sampling/ 主要內容概述 該網頁詳細介紹了Model Context Protocol (MCP) 中的“Sampling”功能。Sampling允許服務器通過客戶端請求語言模型&#xff08;LLM&#xff09;生成文本、音頻或圖像內容…

STM32-匯編2、外設

1.異常處理 reserved保留 &#xff1b;將所有異常都初始化成一個函數 2.nop 空指令&#xff0c;什么不干&#xf…

匯能感知高品質的多光譜相機VSC02UA

VSC02UA概要 VSC02UA是一款高品質的200萬像素的光譜相機&#xff0c;適用于工業檢測、農業、醫療等領域。VSC02UA 包含 1600 行1200 列有源像素陣列、片上 10 位 ADC 和圖像信號處理器。它帶有 USB2.0 接口&#xff0c;配合專門的電腦上位機軟件使用&#xff0c;可進行圖像采集…

在C語言基礎上學Java【Java】【一】

眾所周知&#xff0c;Java是C風格的語言&#xff0c;對于學過C語言的人學Java可以快速適應。 廢話不多說&#xff0c;直接邊看代碼邊學。 數據類型&#xff0c;輸入和輸出 import java.util.Scanner;//為了使用Scanner public class a1 {//a1是類名&#xff0c;就是文件名&am…

Spring組件初始化擴展點:BeanPostProcessor

目錄 一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessBeforeInitialization2、postProcessAfterInitialization 四、實戰案例案例1&#xff1a;實現簡單的屬性打印案例2&#xff1a;動態代理增強&#xff08;模擬AOP&#xff09; 五、常見應用場景六、注意…

多模態RAG框架(二)OmniSearch (Self-adaptive Planning Agent) and Dynamic VQA Dataset

OmniSearch&#xff1a;Benchmarking Multimodal RAG with Dynamic VQA Dataset and Self-adaptive Planning Agent 文章鏈接&#xff1a;2411.02937 Github鏈接&#xff1a;Alibaba-NLP/OmniSearch: Repo for Benchmarking Multimodal Retrieval Augmented Generation with …

Multisim學習-04 示波器的使用

我們選擇一個信號源來說明示波器的使用。 模擬電路中平常一般用ac&#xff0c;am&#xff0c;fm&#xff0c;clock就可以演示了。 截圖說明&#xff1a; 1&#xff09;波的周期時長&#xff0c;首先應該調整這個參數&#xff0c;它的倒數就是頻率。這個參數如果不適合&#xf…

2025年03月16日Github流行趨勢

項目名稱&#xff1a;glance 項目地址url&#xff1a;https://github.com/glanceapp/glance項目語言&#xff1a;Go歷史star數&#xff1a;13768今日star數&#xff1a;889項目維護者&#xff1a;svilenmarkov, c0smicdev, wfg, DVDAndroid, jonasknobloch項目簡介&#xff1a;…

aws訓練快速入門教程

AWS 相關核心概念 簡潔地介紹一下AWS訓練云服務的核心關聯概念: AWS核心服務層: 基礎設施層: EC2(計算), S3(存儲), RDS(數據庫)等人工智能層: SageMaker(訓練平臺), AI服務等 機器學習服務分級: 高層: 預構建AI服務(開箱即用)中層: SageMaker(主要訓練平臺)底層: 框架和基…

對接股票金融數據源API

StockTV 股票市場API StockTV 提供全面的實時和歷史股市數據 API&#xff0c;涵蓋全球股票、外匯、期貨及市場新聞數據&#xff0c;助力投資者精準把握市場動態。 主要功能 實時和歷史股市數據 API 獲取全球股票市場的實時行情、歷史數據及深度分析&#xff0c;支持多語言查詢…

HTML圖像標簽的詳細介紹

1. 常用圖像格式 格式特點適用場景JPEG有損壓縮&#xff0c;文件小&#xff0c;不支持透明適合照片、復雜圖像PNG無損壓縮&#xff0c;支持透明&#xff08;Alpha通道&#xff09;適合圖標、需要透明背景的圖片GIF支持動畫&#xff0c;最多256色簡單動畫、低色彩圖標WebP谷歌開…

Bilve 搭建手冊

從零搭建 Bilive 需要提前安裝docker bilive 第一步 docker cli to docker compose # https://www.mklab.cn/utils/docker sudo docker run \-itd \--name bilive_docker \-p 22333:2233 \ghcr.io/timerring/bilive:0.2.10version: 3.1 services:bilive_docker:image: ghcr…

內存高級話題

面試涼經&#xff0c;代碼最近寫的太少了&#xff0c;被面試官屠殺。 痛定思痛&#xff0c;對C新經典中的內存話題進行復現。 new A 與 new A() 的差別 &#xff08;1&#xff09;如果是一個空類&#xff0c;這兩行代碼沒什么區別。當然現實中也沒有程序員會寫一個空類。 &am…

2025最全Xshell配置手冊:從零開始下載安裝搭建遠程連接環境

&#x1f308; 軟件介紹 Xshell 7 是由韓國 NetSarang 公司開發的一款功能強大的終端模擬器。它專為 Windows 操作系統設計&#xff0c;廣泛應用于遠程連接管理和服務器管理。 &#x1f4e5; 軟件下載與準備 1. 官方下載渠道&#xff08;直接下載&#xff0c;安全無捆綁&…

算法模型從入門到起飛系列——廣度優先遍歷(BFS)

文章目錄 前言一、廣度優先遍歷&#xff08;BFS&#xff09;簡介1.1 廣度優先遍歷&#xff08;BFS&#xff09;的特點1.2 廣度優先遍歷&#xff08;BFS&#xff09;的要素 二、廣度優先遍歷&#xff08;BFS&#xff09;& 深度優先遍歷&#xff08;DFS&#xff09;2.1 廣度優…

CPP從入門到入土之類和對象Ⅱ

一、六大默認成員函數 默認成員函數是用戶沒有顯式實現&#xff0c;編譯器自動生成的成員函數。 一個類&#xff0c;我們在不寫的情況下&#xff0c;編譯器會默認生成六個默認成員函數 本文詳細介紹構造函數和析構函數 二、構造函數 構造函數雖名為構造函數&#xff0c;但是…

【華三】路由器交換機忘記登入密碼或super密碼的重啟操作

【華三】路由器交換機忘記登入密碼或super密碼的重啟操作 背景步驟跳過認證設備&#xff1a;路由器重啟設備翻譯說明具體操作 跳過當前系統配置重啟設備具體操作 背景 當console口的密碼忘記&#xff0c;或者說本地用戶的密碼忘記&#xff0c;其實這時候是登入不了路由器的&am…

視圖窗口的客戶區

書籍&#xff1a;《Visual C 2017從入門到精通》的2.4.2 MFC應用程序類型 環境&#xff1a;visual studio 2022 內容&#xff1a;【例2.38】視圖窗口的客戶區 說明&#xff1a;以下內容大部分來自騰訊元寶。 1.創建一個單文檔程序 一個簡單的單文檔程序-CSDN博客https://bl…