大數(shù)據(jù)開發(fā)中定時器有哪些

這篇文章給大家分享的是有關大數(shù)據(jù)開發(fā)中定時器有哪些的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于網(wǎng)站設計制作、成都網(wǎng)站建設、資源網(wǎng)絡推廣、微信平臺小程序開發(fā)、資源網(wǎng)絡營銷、資源企業(yè)策劃、資源品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)建站為所有大學生創(chuàng)業(yè)者提供資源建站搭建服務,24小時服務熱線:028-86922220,官方網(wǎng)址:muchs.cn

前言

何為定時器,說白了就是指定一個延遲時間,到期執(zhí)行,就像我們早上定的鬧鈴一樣,每天定點提醒我們起床;當然在我們各個系統(tǒng)中也是無處不在,比如定時備份數(shù)據(jù),定時拉取文件,定時刷新數(shù)據(jù)等等;定時器工具也是層出不窮比如Timer,ScheduledExecutorService,Spring Scheduler,HashedWheelTimer(時間輪),Quartz,Xxl-job/Elastic-job等;本文將對這些定時器工具做個簡單介紹和對比,都在哪些場景下使用。

Timer

Timer可以說是JDK提供最早的一個定時器了,使用簡單,功能也相對來說比較簡單;可以指定固定時間后觸發(fā),固定時間點觸發(fā),固定頻率觸發(fā);

Timer timer = new Timer();
timer.schedule(new TimerTask() {@Overridepublic void run() {
        System.out.println(System.currentTimeMillis() + "  === task1");
    }
}, 1000, 1000);

時間默認為毫秒,表示延遲一秒后執(zhí)行任務,并且頻率為1秒執(zhí)行任務;Timer內部使用TaskQueue存放任務,使用TimerThread單線程用來執(zhí)行任務:

private final TaskQueue queue = new TaskQueue();private final TimerThread thread = new TimerThread(queue);

TimerThread內部是一個while(true)循環(huán),不停的從TaskQueue中獲取任務執(zhí)行;當然每次添加到TaskQueue中的任務會進行排序,通過nextExecutionTime來進行排序,這樣TimerThread每次都可以獲取到最近執(zhí)行的任務;
Timer有兩大缺點:

  • TimerTask中出現(xiàn)未捕獲的異常,影響Timer;

  • 因為是單線程執(zhí)行某個任務執(zhí)行時間過長會影響其他認為的精確度;

正因為Timer存在的一些缺點,JDK1.5出現(xiàn)了新的定時器ScheduledExecutorService;

ScheduledExecutorService

JDK1.5提供了線程池的功能,ScheduledExecutorService是一個接口類,具體實現(xiàn)類是ScheduledThreadPoolExecutor繼承于ThreadPoolExecutor;

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {
        System.out.println(Thread.currentThread() + " === " + System.currentTimeMillis() + " === task1");
    }
}, 1000, 1000, TimeUnit.MILLISECONDS);

比起Timer可以配置多個線程去執(zhí)行定時任務,同時異常任務并不會中斷ScheduledExecutorService,線程池的幾個核心配置:

  • corePoolSize:核心線程數(shù)量,如果線程池中的線程少于此數(shù)目,則在執(zhí)行任務時創(chuàng)建,核心線程不會被回收;

  • maximumPoolSize:允許的最大線程數(shù),當線程數(shù)量達到corePoolSize且workQueue隊列滿了,會創(chuàng)建線程;

  • keepAliveTime:超過corePoolSize空閑時間;

  • unit:keepAliveTime的單位;

  • workQueue:當線程超過corePoolSize,新的任務會被加入到隊列中等待;

  • threadFactory:創(chuàng)建線程的工廠類;

  • handler:線程池拒絕策略,包括:AbortPolicy,DiscardPolicy,DiscardOldestPolicy,CallerRunsPolicy策略,當然也可以自己擴展;

ScheduledExecutorService中添加的任務會被包裝成一個ScheduledFutureTask類,同時將任務放入DelayedWorkQueue隊列中是一個BlockingQueue;類似Timer也會根據(jù)加入任務觸發(fā)時間的先后進行排序,然后線程池中的Worker會到Queue中獲取任務執(zhí)行;

Spring Scheduler

Spring提供了xml和注解方式來配置調度任務,如下面xml配置:

<!-- 創(chuàng)建一個調度器 --><task:scheduler id="scheduler" /><!-- 配置任務類的bean --><bean id="helloTask" class="com.spring.task.HelloTask"></bean><task:scheduled-tasks scheduler="scheduler"><!-- 每2秒執(zhí)行一次 --><task:scheduled ref="helloTask" method="say" cron="0/2 * * * * ?" /></task:scheduled-tasks>

Spring提供了cron表達式的支持,并且可以直接配置執(zhí)行指定類中的指定方法,對使用者來說更加方便和簡單;但是其內部還是使用的ScheduledThreadPoolExecutor線程池;

HashedWheelTimer

Netty提供的一個定時器,用于定時發(fā)送心跳,使用的是時間輪算法;HashedWheelTimer是一個環(huán)形結構,可以類比成一個時鐘,整個環(huán)形結構由一個個小格組成,每個小格可以存放很多任務,隨著時間的流逝,指針轉動,然后執(zhí)行當前指定格子中的任務;任務通過取模的方式?jīng)Q定其應該放在哪個格子,有點類似hashmap;

HashedWheelTimer hashedWheelTimer = new HashedWheelTimer(1000, TimeUnit.MILLISECONDS, 16);
hashedWheelTimer.newTimeout(new TimerTask() {@Overridepublic void run(Timeout timeout) throws Exception {
        System.out.println(System.currentTimeMillis() + "  === executed");
    }
}, 1, TimeUnit.SECONDS);

其中初始化的三個參數(shù)分別是:

  • tickDuration:每一格的時長;

  • unit:tickDuration的單位;

  • ticksPerWheel:時間輪總共有多少格;

如上面實例配置的參數(shù),每一格時長1秒,時間輪總共16格,如果延遲1秒執(zhí)行,那就放到編號1的格子中,從0開始;如果延遲18秒,那么會放到編號為2的格子中,同時指定remainingRounds=1,表示第幾輪被調用,每轉一輪remainingRounds-1,知道remainingRounds=0才會被執(zhí)行;

Quartz

以上介紹的幾種定時器都是進程內的調度,而Quartz提供了分布式調度,所有被調度的任務都可以存放到數(shù)據(jù)庫中,每個業(yè)務節(jié)點通過搶占式的方式去獲取需要執(zhí)行的任務,其中一個節(jié)點出現(xiàn)問題并不影響任務的調度;

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"><property name="driverClass" value="com.MySQL.jdbc.Driver" /><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/quartz" /><property name="user" value="root" /><property name="password" value="root" /></bean><bean id="scheduler"class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="schedulerName" value="myScheduler"></property><property name="dataSource" ref="dataSource" /><property name="configLocation" value="classpath:quartz.properties" /><property name="triggers"><list><ref bean="firstCronTrigger" /></list></property></bean>

更多關于Quartz的介紹可以參考本人之前的文章:

  • Spring整合Quartz分布式調度

  • Quartz數(shù)據(jù)庫表分析

  • Quartz調度源碼分析

  • 基于Netty+Zookeeper+Quartz調度分析

當然Quartz本身也有不足的地方:底層調度依賴數(shù)據(jù)庫的悲觀鎖,誰先搶到誰調度,這樣會導致節(jié)點負載不均衡;還有調度和執(zhí)行耦合在一起,導致調度器會受到業(yè)務的影響;

Xxl-job/Elastic-job

正因為Quartz存在著很多不足的地方,基于Quartz實現(xiàn)的分布式調度解決方案出現(xiàn)了包括Xxl-job/Elastic-job等;
整體思路:調度器和執(zhí)行器拆成不同的進程,調度器還是依賴Quartz本身的調度方式,但是調度的并不是具體業(yè)務的QuartzJobBean,而是統(tǒng)一的一個RemoteQuartzJobBean,在此Bean中通過遠程調用執(zhí)行器去執(zhí)行具體業(yè)務Bean;具體的執(zhí)行器在啟動時注冊到注冊中心(如Zookeeper)中,調度器可以在注冊中心(如Zookeeper)獲取執(zhí)行器信息,并通過相關的負載算法指定具體的執(zhí)行器去執(zhí)行;
還提供了運維管理界面,可以管理任務,比如像xxl-job:
大數(shù)據(jù)開發(fā)中定時器有哪些

當然還有更多其他的功能,此處就不在介紹了,可以直接去查看官網(wǎng);

選擇合適的定時器

其實整體可以分為兩大類:進程內定時器包括和分布式調度器;
進程內定時器:Timer,ScheduledExecutorService,Spring Scheduler,HashedWheelTimer(時間輪);
分布式調度器:Quartz,Xxl-job/Elastic-job;
所以首先根據(jù)需要僅僅只需要進程內的定時器,還是需要分布式調度;
其次在進程內Timer基本可以被淘汰了,完全可以使用ScheduledExecutorService來代替,如果系統(tǒng)使用了Spring那當然應該使用Spring Scheduler;
下面重點看看ScheduledExecutorService和HashedWheelTimer,ScheduledExecutorService內部使用的是DelayedWorkQueue,任務的新增、刪除會導致性能下降;而HashedWheelTimer并不受任務數(shù)量限制,所以如果任務很多并且任務執(zhí)行時間很短比如心跳,那么HashedWheelTimer是最好的選擇;HashedWheelTimer是單線程的,如果任務不多并且執(zhí)行時間過長,影響精確度,而ScheduledExecutorService可以使用多線程這時候選擇ScheduledExecutorService更好;
最后分布式調度器里面Quartz和Xxl-job/Elastic-job,對分布式調度要求不高的情況下才會選擇Quartz,不然都應該選擇Xxl-job/Elastic-job

感謝各位的閱讀!關于“大數(shù)據(jù)開發(fā)中定時器有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

網(wǎng)站欄目:大數(shù)據(jù)開發(fā)中定時器有哪些
分享路徑:http://muchs.cn/article34/ihccpe.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作、移動網(wǎng)站建設、定制網(wǎng)站、標簽優(yōu)化外貿網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站