elastic-job使用

項(xiàng)目中用到了elastic-job,自己用的時候也是根據(jù)別人的例子復(fù)制下來县爬,直接模仿用的墙基,一直也沒去理解它的工作原理软族,一知半解的,各個參數(shù)意思也不是很懂残制,然后今天突然想了解下它的工作原理立砸,看了官網(wǎng),以及網(wǎng)上的一些文章初茶,在這里做個記錄颗祝。

elastic-job是什么?

elastic-job是什么呢恼布?下面是摘自官網(wǎng)的話:
Elastic-Job是一個分布式調(diào)度解決方案螺戳,由兩個相互獨(dú)立的子項(xiàng)目Elastic-Job-Lite和Elastic-Job-Cloud組成。Elastic-Job-Lite定位為輕量級無中心化解決方案折汞,使用jar包的形式提供分布式任務(wù)的協(xié)調(diào)服務(wù)倔幼;Job-Cloud采用自研Mesos Framework的解決方案,額外提供資源治理爽待、應(yīng)用分發(fā)以及進(jìn)程隔離等功能(PS:我在這里只說Elastic-Job-Lite损同,因?yàn)镴ob-Cloud我沒去研究)。
簡單的說Elastic-Job-Lite就是一個分布式定時任務(wù)鸟款。

怎么用elastic-job

使用elastic-job很簡單膏燃,在elastic-job官網(wǎng)上也有例子。

  1. 添加maven依賴
        <!-- 引入elastic-job-lite核心模塊 -->
        <dependency>
            <groupId>com.dangdang</groupId>
            <artifactId>elastic-job-lite-core</artifactId>
            <version>${elasticjob.version}</version>
        </dependency>

        <!-- 使用springframework自定義命名空間時引入 -->
        <dependency>
            <groupId>com.dangdang</groupId>
            <artifactId>elastic-job-lite-spring</artifactId>
            <version>${elasticjob.version}</version>
        </dependency>

2.寫定時任務(wù)類

public class TestJob implements SimpleJob {

    @Override
    public void execute(ShardingContext shardingContext) {
        int item = shardingContext.getShardingItem();
//        System.out.println(item);
        switch (item) {
            case 0:
                // do something by sharding item 0
                System.out.println(String.format("-----ThreadId:%s,當(dāng)前分片項(xiàng):%s",Thread.currentThread().getId(),item));
                break;
            case 1:
                // do something by sharding item 1
                System.out.println(String.format("-----ThreadId:%s,當(dāng)前分片項(xiàng):%s",Thread.currentThread().getId(),item));
                break;
            case 2:
                // do something by sharding item 2
                System.out.println(String.format("-----ThreadId:%s,當(dāng)前分片項(xiàng):%s",Thread.currentThread().getId(),item));
                break;
        }
    }
}

job有好幾種作業(yè)類型何什,這里只是簡單的作業(yè)组哩,實(shí)現(xiàn)SimpleJob 即可
3.配置作業(yè)
與spring容器配合作業(yè),把bean依賴注入

<?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="jobRegesterCenter" server-lists="192.168.3.98:2181" namespace="lfp-elastic-job" base-sleep-time-milliseconds="1000" max-sleep-time-milliseconds="3000" max-retries="3" />

    <!-- 配置作業(yè)-->
    <job:simple id="testJob" class="cn.laikyy.lfp.job.TestJob" registry-center-ref="jobRegesterCenter" cron="0 50 23 * * ?"
                disabled="false" overwrite="true" sharding-total-count="3" sharding-item-parameters="0=A,1=B,2=C" description="測試" />
</beans>

OK,配置好后我們在elastic-job-lite-console控制臺去觸發(fā)執(zhí)行,看看輸出結(jié)果伶贰。
輸出結(jié)果:

-----ThreadId:81,當(dāng)前分片項(xiàng):0
-----ThreadId:82,當(dāng)前分片項(xiàng):1
-----ThreadId:83,當(dāng)前分片項(xiàng):2

好現(xiàn)在我們來分析一下輸出結(jié)果:
首先對于testJob我們配了sharding-total-count="3"蛛砰,意思是分3片,但是我們現(xiàn)在只有一臺機(jī)器執(zhí)行幕袱,所以輸出結(jié)果是當(dāng)前機(jī)器用了三個線程去跑這個定時任務(wù)暴备,每個線程對應(yīng)一個分片。
好们豌,那么如果我們用兩臺機(jī)器去執(zhí)行那么會怎么樣呢涯捻?由于elastic-job實(shí)例是根據(jù)ip來的,所以我這邊需要通過虛擬機(jī)或另一臺來執(zhí)行望迎,那么結(jié)果會怎么樣呢障癌?
實(shí)例1:

-----ThreadId:81,當(dāng)前分片項(xiàng):0

實(shí)例2:

-----ThreadId:92,當(dāng)前分片項(xiàng):1
-----ThreadId:93,當(dāng)前分片項(xiàng):2

我們可以看到,3片分到兩臺機(jī)器辩尊,有一臺執(zhí)行了兩個分片項(xiàng)涛浙,一臺執(zhí)行一個分片項(xiàng);當(dāng)然如果三臺實(shí)例去執(zhí)行摄欲,那么結(jié)果會是每臺執(zhí)行一個分片項(xiàng)轿亮;如果四臺機(jī)器去分3個任務(wù),那么最終執(zhí)行也是3臺胸墙,每臺執(zhí)行一個分片項(xiàng)我注,還有一臺空閑。
當(dāng)然當(dāng)某一臺掛了迟隅,那么調(diào)度中心就會自動把掛了的那臺的任務(wù)分給空閑的實(shí)例但骨。如果沒有空閑的實(shí)例那么就會把掛了的那臺的任務(wù)分給其他的一臺上去。

現(xiàn)實(shí)場景怎么用智袭?

好奔缠,我們大致了解了如何使用elastic-job,那如何應(yīng)用到我們實(shí)際的項(xiàng)目里呢吼野?比方說余額寶每天定時給用戶計算收益校哎。如果兩臺機(jī)器,我們可以把用戶id是奇數(shù)的給一臺機(jī)器去執(zhí)行瞳步,偶數(shù)的給另一臺執(zhí)行闷哆。像這樣

    @Override
    public void execute(ShardingContext shardingContext) {
        int item = shardingContext.getShardingItem();
        switch (item) {
            case 0:
                //1 查詢用戶id是奇數(shù)的用戶
                //2 計算的收益
               
                break;
            case 1:
               //1 查詢用戶id是偶數(shù)的用戶
                //2 計算的收益
                break;
    }

sql查詢:

SELECT * FROM lfp_user WHERE mod(id,2)=0; //查詢id為偶數(shù)的用戶

SELECT * FROM lfp_user WHERE mod(id,2)=1; //查詢id為奇數(shù)的用戶

這樣的話,就把壓力平均分?jǐn)偟絻膳_服務(wù)器上去了谚攒,而且也能更快執(zhí)行完成阳准。
但是如果發(fā)現(xiàn)這段時間多了很多人氛堕,以前只要兩臺機(jī)器在1個小時就能跑完的馏臭,現(xiàn)在5個小時也跑不完,怎么辦呢?加機(jī)器括儒?加機(jī)器肯定是必須的绕沈,但是我們發(fā)現(xiàn)代碼里寫死了,分2片帮寻,我們總不能去改成3乍狐、4、5固逗,萬一以后還有更多呢浅蚪,所以我們可以
對sql進(jìn)一步優(yōu)化。我們把分片數(shù)和當(dāng)前分片項(xiàng)傳到sql烫罩,這樣sql可以動態(tài)去查詢對應(yīng)分片后的用戶了
改進(jìn)后sql:

//動態(tài)查詢該分片下要執(zhí)行的用戶
SELECT * FROM lfp_user WHERE mod(id,#{shardingTotalCount})=#{shardingItem}; 

改進(jìn)后代碼:

public class TestJob implements SimpleJob {
    @Override
    public void execute(ShardingContext shardingContext) {
        int shardingTotalCount = shardingContext.getShardingTotalCount();
        int shardingItem = shardingContext.getShardingItem();
        //1 查詢改分片下要執(zhí)行的用戶惜傲,帶參數(shù)shardingTotalCount和shardingItem 

        //2 計算這些用戶收益
        
    }
}

改進(jìn)后我們的代碼也簡潔了,當(dāng)shardingTotalCount 有5片贝攒,并且5臺機(jī)器
機(jī)器0:查詢用戶id能整除5的盗誊,如:5、10隘弊、15哈踱、20、梨熙、开镣、、
機(jī)器1:查詢用戶id除以5余1的串结,如:1哑子、6、11肌割、16卧蜓、、把敞、弥奸、
機(jī)器2:查詢用戶id除以5余2的,如:2奋早、7盛霎、12、17耽装、愤炸、、掉奄、
機(jī)器3:查詢用戶id除以5于余3的规个,如:3、8、13诞仓、18缤苫、、墅拭、活玲、
機(jī)器4:查詢用戶id除以5余4的,如:4谍婉、9舒憾、14、19穗熬、珍剑、、死陆、

同理招拙,當(dāng)6臺、7臺等措译,這樣我們就可以把服務(wù)器壓力分?jǐn)偟矫恳慌_上去了别凤,如果臨時壓力增大,我們還可以繼續(xù)加機(jī)器來緩解领虹,當(dāng)不需要這么多時我們可以減少機(jī)器實(shí)現(xiàn)分布式部署规哪。

這里只是記錄一下自己使用elastic-job,具體的實(shí)現(xiàn)與原理我也還沒有深入去了解,這段時間我也要深入了解下它的實(shí)現(xiàn)塌衰,這篇文章就寫到這诉稍。祝大家周末愉快。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末最疆,一起剝皮案震驚了整個濱河市杯巨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌努酸,老刑警劉巖服爷,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異获诈,居然都是意外死亡仍源,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門舔涎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笼踩,“玉大人,你說我怎么就攤上這事亡嫌『坑冢” “怎么了桶至?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匾旭。 經(jīng)常有香客問我,道長圃郊,這世上最難降的妖魔是什么价涝? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮持舆,結(jié)果婚禮上色瘩,老公的妹妹穿的比我還像新娘。我一直安慰自己逸寓,他們只是感情好居兆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著竹伸,像睡著了一般泥栖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勋篓,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天吧享,我揣著相機(jī)與錄音,去河邊找鬼譬嚣。 笑死钢颂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拜银。 我是一名探鬼主播殊鞭,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尼桶!你這毒婦竟也來了帽馋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挺益,失蹤者是張志新(化名)和其女友劉穎地来,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幌蚊,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谤碳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了溢豆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜒简。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖漩仙,靈堂內(nèi)的尸體忽然破棺而出搓茬,到底是詐尸還是另有隱情犹赖,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布卷仑,位于F島的核電站峻村,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锡凝。R本人自食惡果不足惜粘昨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窜锯。 院中可真熱鬧张肾,春花似錦、人聲如沸锚扎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驾孔。三九已至芍秆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翠勉,已是汗流浹背浪听。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眉菱,地道東北人迹栓。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像俭缓,于是被迫代替她去往敵國和親克伊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 作業(yè)的必要性以及存在的問題 1. 為什么需要作業(yè)华坦? 作業(yè)即定時任務(wù)愿吹。一般來說,系統(tǒng)可使用消息傳遞代替部分使用作業(yè)的...
    Sununy閱讀 6,828評論 3 25
  • Elastic-job使用javacode方式實(shí)現(xiàn) 1.導(dǎo)入依賴 2.開發(fā)job 3.測試類 碰到的坑 知道zoo...
    cjxz閱讀 872評論 0 2
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,931評論 2 89
  • 分布式定時任務(wù)——elastic-job 一惜姐、前言 在我們的項(xiàng)目當(dāng)中犁跪,使用定時任務(wù)是避免不了的,我們在部署定時任務(wù)...
    牛初九閱讀 1,436評論 0 6
  • 前幾天就收到老師微信說是今天要開學(xué)了枫耳。以至于昨晚我都沒睡好。興奮的像個孩子似的緊張孟抗! 一大早就被老公鬧鐘鬧醒迁杨,看著...
    叁寶閱讀 234評論 0 2