新聞中心
好吧,這里就從技術(shù)和架構(gòu)的角度帶著大家一起看一下這個(gè)問(wèn)題。

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供澤庫(kù)企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為澤庫(kù)眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
線程和線程池
熟悉線程和線程池的技術(shù)人都應(yīng)該知道,使用它們是可以實(shí)現(xiàn)定時(shí)功能的。
RocketMQ中比較常見(jiàn)的定時(shí)任務(wù)的寫法,就是利用線程來(lái)實(shí)現(xiàn)的定時(shí)任務(wù),也就是Thread類,說(shuō)的簡(jiǎn)單一點(diǎn)就是線程等待。
如下代碼的語(yǔ)義就是按照固定周期waitInterval去執(zhí)行負(fù)載均衡。
@Override
public void run() {
log.info(this.getServiceName() + " service started");
while (!this.isStopped()) {
this.waitForRunning(waitInterval);
this.mqClientFactory.doRebalance();
}
log.info(this.getServiceName() + " service end");
}
RocketMQ中還有一種比較常見(jiàn)的定時(shí)任務(wù)的寫法就是用線程池來(lái)實(shí)現(xiàn)定時(shí)任務(wù)的,也就是ScheduledExecutorService類。
如下代碼的語(yǔ)義就是周期性的注冊(cè)Broker Server。
this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
BrokerController.this.registerBrokerAll(true, false,
brokerConfig.isForceRegister());
} catch (Throwable e) {
log.error("registerBrokerAll Exception", e);
}
}
}, 1000 * 10, Math.max(10000, Math.min(brokerConfig.
getRegisterNameServerPeriod(), 60000)), TimeUnit.MILLISECONDS);好吧,既然RocketMQ可以利用線程和線程池來(lái)完成定時(shí)任務(wù),那么我們的業(yè)務(wù)服務(wù)也是可以的。
JDK自帶的定時(shí)器Timer和TimerTask
定時(shí)器Timer和TimerTask本質(zhì)上也是線程實(shí)現(xiàn)的定時(shí)功能,所以說(shuō)RocketMQ就直接使用線程和線程池來(lái)實(shí)現(xiàn)個(gè)性化的定時(shí)任務(wù),人家那樣做也不是沒(méi)有道理。比如在RocketMQ的延遲消息就是使用TimerTask來(lái)實(shí)現(xiàn)的,當(dāng)然使用定時(shí)器Timer和TimerTask會(huì)存在很多缺陷,比如沒(méi)有分布式調(diào)度的功能,不能確保分布式環(huán)境下執(zhí)行Job的數(shù)據(jù)一致性等,但是人家RocketMQ不需要考慮這樣的場(chǎng)景,它的分布式問(wèn)題利用其他的替代方式解決了,比如集群選舉等。
Spring Framework自帶的定時(shí)器
熟悉Spring Framework框架的技術(shù)人應(yīng)該知道,可以使用注解@EnableScheduling和@Scheduled就可以開(kāi)啟一個(gè)定時(shí)任務(wù),我們可以這樣寫一個(gè)定時(shí)器。
@Component
@EnableScheduling
public class SimulatingMultithreadedOrder {
@Scheduled(fixedRate = 2000)
public void producerMessage() throws MQClientException {
//定時(shí)執(zhí)行的邏輯
}
}
使用Spring Framework框架自帶的本地定時(shí)任務(wù)非常方便,如果你的基礎(chǔ)框架采用Spring Boot或者更加高級(jí)一點(diǎn)Spring Cloud Alibaba,你不需要添加額外的Jar包依賴,因?yàn)锧EnableScheduling和@Scheduled是Spring Context提供給我們的定時(shí)任務(wù)注解,只要你是Spring Framework生態(tài)的業(yè)務(wù)服務(wù),你就可以使用它,非常的簡(jiǎn)單。
Quartz
Quartz可以說(shuō)是非常古老的定時(shí)任務(wù)框架,目前最新的版本為2.3.2,項(xiàng)目最近一次更新是2019年,也就是說(shuō)處于停更狀態(tài),不過(guò)這個(gè)不影響它的關(guān)注度,畢竟它是制定規(guī)范的。
看過(guò)Quartz底層源碼的技術(shù)人應(yīng)該都知道,Quartz中大量使用了線程來(lái)實(shí)現(xiàn)定時(shí)任務(wù)的功能,比如執(zhí)行任務(wù)的線程池和調(diào)度任務(wù)的線程池等。
xxl-job
筆者在很多年之前就已經(jīng)接觸過(guò)xxl-job了,也是看著它成長(zhǎng)起來(lái)的,該框架的作者也是非常的厲害,并且這個(gè)框架是個(gè)人維護(hù)到現(xiàn)在,如果我沒(méi)記錯(cuò)的話應(yīng)該有快10年了。
在Github上搜索xxl-job,目前Fork數(shù)為8.9k,Star 20.9k,這個(gè)成績(jī)已經(jīng)超過(guò)了很多Apache頂級(jí)項(xiàng)目的數(shù)據(jù)了,目前它的最新版本為v2.3.0,社區(qū)活躍度還是非常活躍的。
xxl-job給自己的定位是分布式任務(wù)調(diào)度平臺(tái),也就是說(shuō)它不僅是要做定時(shí)任務(wù),而是要做調(diào)度,這點(diǎn)就和云原生的理念不謀而合了。
關(guān)于xxl-job的原理大家可以參考官方https://github.com/xuxueli/xxl-job,分布式Job的原理其實(shí)不難,多實(shí)踐一下,看看源碼大致能知道它是如何完成調(diào)度的。
筆者也下載了它的源碼大致看了一下,其實(shí)它本質(zhì)上也是用線程來(lái)實(shí)現(xiàn)的定時(shí)Job,只不過(guò)加了一些動(dòng)態(tài)調(diào)度的規(guī)則而已,并且能夠做到非常優(yōu)雅的和動(dòng)態(tài)的殺死運(yùn)行Job的線程,并完成線程Job的調(diào)度。
筆者當(dāng)初關(guān)注過(guò)xxl-job,主要原因是它在那個(gè)版本把ZooKeeper去掉了,自己寫了一套分布式一致性的框架,具體是在哪個(gè)版本改進(jìn)的,這里我大概忘記了。
Elastic-job
Elastic-job是Apache的頂級(jí)項(xiàng)目,目前已經(jīng)改名為shardingsphere-elasticjob,具體數(shù)據(jù)如下。
shardingsphere-elasticjob和xxl-job一個(gè)最大的不同點(diǎn)在于,前者還是重度依賴ZooKeeper的,畢竟ZooKeeper也是Apache的項(xiàng)目,哈哈,肯定不會(huì)去掉的。
還有一個(gè)比較大的不同點(diǎn)就是shardingsphere-elasticjob的定時(shí)任務(wù)規(guī)范是依賴Quartz的二次開(kāi)發(fā)的產(chǎn)品,而xxl-job是完全自己寫的。
目前shardingsphere-elasticjob最新的版本為3.0.1,社區(qū)活躍度是非常高的,如果大家對(duì)源碼感興趣可以下載相關(guān)源碼,https://github.com/apache/shardingsphere-elasticjob。
shardingsphere-elasticjob包含兩個(gè)部分:
- E lastic-Job-Lite 定位 為輕量級(jí)無(wú)中心化解決方案,使用 jar 包的形式提供分布式任務(wù) 的協(xié)調(diào)服務(wù);
- Ela stic-Job-Cloud 使用 Mesos + Docker(TBD) 的解決方案,額外提供資源治理、應(yīng)用分發(fā)以及進(jìn)程隔離等服務(wù)。
Saturn
Saturn是唯品會(huì)在github開(kāi)源的一款分布式任務(wù)調(diào)度產(chǎn)品。它是基于當(dāng)當(dāng)elastic-job 1.0版本來(lái)開(kāi)發(fā)的,其上完善了一些功能和添加了一些新的feature。
Saturn目前最新的版本為v3.5.1,社區(qū)活躍度不是很高。
antares
Antares是一個(gè)完全自研的個(gè)人維護(hù)的定時(shí)任務(wù)框架。
Antares目前最新的版本為1.4.0,最近一次更新是2017年,幾乎處于停止維護(hù)狀態(tài)。
Spring Cloud Alibaba Cloud SchedulerX
SchedulerX(分布式任務(wù)調(diào)度) 是隸屬于阿里云EDAS產(chǎn)品的組件, Spring Cloud AliCloud SchedulerX 提供了在Spring Cloud的配置規(guī)范下,分布式任務(wù)調(diào)度的功能支持。SchedulerX可提供秒級(jí)、精準(zhǔn)、高可靠、高可用的定時(shí)任務(wù)調(diào)度服務(wù),并支持多種類型的任務(wù)調(diào)度,如簡(jiǎn)單單機(jī)任務(wù)、簡(jiǎn)單多機(jī)任務(wù)、腳本任務(wù)以及網(wǎng)格任務(wù)。
阿里巴巴并沒(méi)有開(kāi)放Spring Cloud Alibaba Cloud SchedulerX的源碼,這個(gè)是一個(gè)硬傷,咱們只能使用阿里云的商業(yè)版本。
總之,不論是哪一種分布式定時(shí)Job,都會(huì)有它適用的業(yè)務(wù)場(chǎng)景,并沒(méi)有誰(shuí)是絕對(duì)的好和絕對(duì)的不好,就像是RPC框架一樣,合適才是最重要的。優(yōu)秀的框架的架構(gòu)和設(shè)計(jì)思想是非常有用的,我們能夠把它學(xué)過(guò)來(lái),并為自己所用也是一種能力的提升,畢竟咱們要先學(xué)會(huì)模仿,才能夠?qū)W會(huì)創(chuàng)新。
當(dāng)前文章:架構(gòu)師如何選型分布式定時(shí)任務(wù)
當(dāng)前鏈接:http://www.fisionsoft.com.cn/article/cdhjjeo.html


咨詢
建站咨詢
