日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

elastic-job的原理简介和使用

發(fā)布時間:2025/4/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 elastic-job的原理简介和使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

elastic-job是當當開源的一款非常好用的作業(yè)框架,在這之前,我們開發(fā)定時任務(wù)一般都是使用quartz或者spring-task(ScheduledExecutorService),無論是使用quartz還是spring-task,我們都會至少遇到兩個痛點:
1.不敢輕易跟著應用服務(wù)多節(jié)點部署,可能會重復多次執(zhí)行而引發(fā)系統(tǒng)邏輯的錯誤。
2.quartz的集群僅僅只是用來HA,節(jié)點數(shù)量的增加并不能給我們的每次執(zhí)行效率帶來提升,即不能實現(xiàn)水平擴展。
本篇博文將會自頂向下地介紹elastic-job,讓大家認識了解并且快速搭建起環(huán)境。

elastic-job產(chǎn)品線說明
elastic-job在2.x之后,出了兩個產(chǎn)品線:Elastic-Job-Lite和Elastic-Job-Cloud。我們一般使用Elastic-Job-Lite就能夠滿足需求,本文也是以Elastic-Job-Lite為主。1.x系列對應的就只有Elastic-Job-Lite,并且在2.x里修改了一些核心類名,差別雖大,原理類似,建議使用2.x系列。寫此博文,最新release版本為2.0.5。

?


elastic-job-lite原理
舉個典型的job場景,比如余額寶里的昨日收益,系統(tǒng)需要job在每天某個時間點開始,給所有余額寶用戶計算收益。如果用戶數(shù)量不多,我們可以輕易使用quartz來完成,我們讓計息job在某個時間點開始執(zhí)行,循環(huán)遍歷所有用戶計算利息,這沒問題。可是,如果用戶體量特別大,我們可能會面臨著在第二天之前處理不完這么多用戶。另外,我們部署job的時候也得注意,我們可能會把job直接放在我們的webapp里,webapp通常是多節(jié)點部署的,這樣,我們的job也就是多節(jié)點,多個job同時執(zhí)行,很容易造成重復執(zhí)行,比如用戶重復計息,為了避免這種情況,我們可能會對job的執(zhí)行加鎖,保證始終只有一個節(jié)點能執(zhí)行,或者干脆讓job從webapp里剝離出來,獨自部署一個節(jié)點。
elastic-job就可以幫助我們解決上面的問題,elastic底層的任務(wù)調(diào)度還是使用的quartz,通過zookeeper來動態(tài)給job節(jié)點分片。
我們來看:
很大體量的用戶需要在特定的時間段內(nèi)計息完成
我們肯定是希望我們的任務(wù)可以通過集群達到水平擴展,集群里的每個節(jié)點都處理部分用戶,不管用戶數(shù)量有多龐大,我們只要增加機器就可以了,比如單臺機器特定時間能處理n個用戶,2臺機器處理2n個用戶,3臺3n,4臺4n...,再多的用戶也不怕了。
使用elastic-job開發(fā)的作業(yè)都是zookeeper的客戶端,比如我希望3臺機器跑job,我們將任務(wù)分成3片,框架通過zk的協(xié)調(diào),最終會讓3臺機器分別分配到0,1,2的任務(wù)片,比如server0-->0,server1-->1,server2-->2,當server0執(zhí)行時,可以只查詢id%3==0的用戶,server1執(zhí)行時,只查詢id%3==1的用戶,server2執(zhí)行時,只查詢id%3==2的用戶。
任務(wù)部署多節(jié)點引發(fā)重復執(zhí)行
在上面的基礎(chǔ)上,我們再增加server3,此時,server3分不到任務(wù)分片,因為只有3片,已經(jīng)分完了。沒有分到任務(wù)分片的作業(yè)程序?qū)⒉粓?zhí)行。
如果此時server2掛了,那么server2的分片項會分配給server3,server3有了分片,就會替代server2執(zhí)行。
如果此時server3也掛了,只剩下server0和server1了,框架也會自動把server3的分片隨機分配給server0或者server1,可能會這樣,server0-->0,server1-->1,2。
這種特性稱之為彈性擴容,即elastic-job名稱的由來。
代碼演示
我們搭建環(huán)境通過示例代碼來演示上面的例子,elastic-job是不支持單機多實例的,通過zk的協(xié)調(diào)分片是以ip為單元的。很多同學上來可能就是通過單機多實例來學習,結(jié)果導致分片和預期不一致。這里沒辦法,只能通過多機器或者虛擬機,我們這里使用虛擬機,另外,由于資源有限,我們這里僅僅只模擬兩臺機器。

節(jié)點說明:
本地宿主機器
zookeeper、job
192.168.241.1

虛擬機
job
192.168.241.128

環(huán)境說明:
Java
請使用JDK1.7及其以上版本。
Zookeeper
請使用Zookeeper3.4.6及其以上版本
Elastic-Job-Lite
2.0.5(2.x系列即可,最好是2.0.4及其以上,因為2.0.4版本有本人提交的少許代碼,(*^__^*) 嘻嘻……)

需求說明:
通過兩臺機器演示動態(tài)分片

step1. 引入框架的jar包
<!-- 引入elastic-job-lite核心模塊 -->
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>2.0.5</version>
</dependency>
<!-- 使用springframework自定義命名空間時引入 -->
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring</artifactId>
<version>2.0.5</version>
</dependency>
step2. 編寫job
package com.fanfan.sample001;

import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;

import java.util.Date;

/**
* Created by fanfan on 2016/12/20.
*/
public class MySimpleJob implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
System.out.println(String.format("------Thread ID: %s, 任務(wù)總片數(shù): %s, 當前分片項: %s",
Thread.currentThread().getId(), shardingContext.getShardingTotalCount(), shardingContext.getShardingItem()));
/**
* 實際開發(fā)中,有了任務(wù)總片數(shù)和當前分片項,就可以對任務(wù)進行分片執(zhí)行了
* 比如 SELECT * FROM user WHERE status = 0 AND MOD(id, shardingTotalCount) = shardingItem
*/
}
}
Step3. Spring配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:reg="http://www.dangdang.com/schema/ddframe/reg"
xmlns:job="http://www.dangdang.com/schema/ddframe/job"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.dangdang.com/schema/ddframe/reg
http://www.dangdang.com/schema/ddframe/reg/reg.xsd
http://www.dangdang.com/schema/ddframe/job
http://www.dangdang.com/schema/ddframe/job/job.xsd">
<!--配置作業(yè)注冊中心 -->
<reg:zookeeper id="regCenter" server-lists="192.168.241.1:2181" namespace="dd-job"
base-sleep-time-milliseconds="1000" max-sleep-time-milliseconds="3000" max-retries="3" />

<!-- 配置作業(yè)-->
? ? <job:simple id="mySimpleJob" class="com.fanfan.sample001.MySimpleJob" registry-center-ref="regCenter"
? ? ? ? ? ? ? ? sharding-total-count="2" cron="0/2 * * * * ?" overwrite="true" />

</beans>

Case1. 單節(jié)點

Case2. 增加一個節(jié)點

?

?

?

Case3. 斷開一個節(jié)點

?

作業(yè)類型
elastic-job提供了三種類型的作業(yè):Simple類型作業(yè)、Dataflow類型作業(yè)、Script類型作業(yè)。這里主要講解前兩者。Script類型作業(yè)意為腳本類型作業(yè),支持shell,python,perl等所有類型腳本,使用不多,可以參見github文檔。

SimpleJob需要實現(xiàn)SimpleJob接口,意為簡單實現(xiàn),未經(jīng)過任何封裝,與quartz原生接口相似,比如示例代碼中所使用的job。

Dataflow類型用于處理數(shù)據(jù)流,需實現(xiàn)DataflowJob接口。該接口提供2個方法可供覆蓋,分別用于抓取(fetchData)和處理(processData)數(shù)據(jù)。
可通過DataflowJobConfiguration配置是否流式處理。
流式處理數(shù)據(jù)只有fetchData方法的返回值為null或集合長度為空時,作業(yè)才停止抓取,否則作業(yè)將一直運行下去; 非流式處理數(shù)據(jù)則只會在每次作業(yè)執(zhí)行過程中執(zhí)行一次fetchData方法和processData方法,隨即完成本次作業(yè)。
實際開發(fā)中,Dataflow類型的job還是很有好用的。

比如拿余額寶計息來說:

package com.fanfan.sample001;

import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.dataflow.DataflowJob;

import java.util.ArrayList;
import java.util.List;

/**
* Created by fanfan on 2016/12/23.
*/
public class MyDataFlowJob implements DataflowJob<User> {

/*
status
0:待處理
1:已處理
*/

@Override
public List<User> fetchData(ShardingContext shardingContext) {
List<User> users = null;
/**
* users = SELECT * FROM user WHERE status = 0 AND MOD(id, shardingTotalCount) = shardingItem Limit 0, 30
*/
return users;
}

@Override
public void processData(ShardingContext shardingContext, List<User> data) {
for (User user: data) {
System.out.println(String.format("用戶 %s 開始計息", user.getUserId()));
user.setStatus(1);
/**
* update user
*/
}
}
}

<job:dataflow id="myDataFlowJob" class="com.fanfan.sample001.MyDataFlowJob" registry-center-ref="regCenter"
sharding-total-count="2" cron="0 0 02 * * ?" streaming-process="true" overwrite="true" />
其它功能
上述介紹的是最精簡常用的功能。elastic-job的功能集還不止這些,比如像作業(yè)事件追蹤、任務(wù)監(jiān)聽等,另外,elastic-job-lite-console作為一個獨立的運維平臺還提供了用來查詢和操作任務(wù)的web頁面。
這些增強的功能讀者可以在github/elastic-job上自行學習,相信有了本篇博文的基礎(chǔ),再閱讀那些文檔就特別簡單了。

轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/articles/10346099.html

總結(jié)

以上是生活随笔為你收集整理的elastic-job的原理简介和使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品无码AV无码国产 | 苏晴忘穿内裤坐公交车被揉到视频 | 性做久久久久久久 | 一区精品视频在线观看 | 日韩不卡一二三 | 日批视频免费观看 | 亚洲熟妇毛茸茸 | 亚洲国产mv| 熟妇毛片| 伊人久久艹 | 久久久久久久久免费 | 麻豆av一区 | www视频在线免费观看 | www.成人av| 日韩一区二区三区在线观看视频 | 中文字幕一区二区三区波野结 | 神马午夜在线观看 | 女人舌吻男人茎视频 | 欧美又大粗又爽又黄大片视频 | 亚洲无人区码一码二码三码 | 一色桃子juy758在线播放 | 国产日韩欧美不卡 | 男女男精品视频站 | 久久久久99精品成人片毛片 | 97色综合| 夜夜欢视频 | 黄色免费国产 | 久青草国产在线 | 夜夜久久久 | 嫩草av久久伊人妇女超级a | 三上悠亚在线观看一区二区 | 国产真实偷伦视频 | 日韩欧美字幕 | 精品人伦一区二区三区蜜桃免费 | 黄网在线播放 | 美女天天操 | 就要操就要射 | 亚洲黄色网络 | 日韩操 | 狠狠涩| 亚洲经典在线 | 亚洲自拍偷拍一区二区 | 国产精品揄拍一区二区 | av片免费在线播放 | 中文字幕av久久爽一区 | 亚洲一区二区三区中文字幕 | 99热一区二区三区 | 免费视频一区 | 中文字幕一区二区三区手机版 | 国产一区二区三区小说 | 国产成人77亚洲精品www | 91色视频在线 | 成人区精品一区二区婷婷 | 一吻定情2013日剧 | 超碰成人在线观看 | 强辱丰满人妻hd中文字幕 | 日韩美女视频在线 | 激情五月婷婷丁香 | 色天堂在线视频 | 超碰免费在线 | 亚洲理论视频 | 日本国产在线播放 | 日本人妻不卡一区二区三区中文字幕 | 无码人妻一区二区三区在线 | 欧美日韩精品国产 | 一区二区三区在线免费观看 | 国产操人 | 一区二区成人在线 | 中文字幕在线观看一区 | 天堂网www在线 | 欧洲成人午夜精品无码区久久 | 黄色大片中文字幕 | 欧美精品第二页 | 日韩精品无码一区二区三区久久久 | 最近的中文字幕在线看视频 | 精品日韩在线 | 国产精品毛片一区二区在线看舒淇 | 欧美私人情侣网站 | 亚洲精品国产精品国自产观看 | 国产日韩在线播放 | 色婷婷激情五月 | 一区二区三区四区免费 | 丰满人妻一区二区三区无码av | 国产小视频91 | 夜夜操免费视频 | 黑帮大佬和我的365日第二部 | 国产一级视频在线观看 | av成人亚洲| 理伦毛片 | 少妇人妻丰满做爰xxx | 中文字幕亚洲色图 | 黄色免费看片 | 黄色小视频在线免费观看 | 4438x全国最大成人网 | a级黄色小视频 | 亚洲一二三四视频 | 男人喷出精子视频 | 性网爆门事件集合av | 中文字幕在线播放一区二区 |