成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

架構師如何選型分布式定時任務

開發(fā) 架構
優(yōu)秀的框架的架構和設計思想是非常有用的,我們能夠把它學過來,并為自己所用也是一種能力的提升,畢竟咱們要先學會模仿,才能夠?qū)W會創(chuàng)新。

當我們的業(yè)務服務需要定時的執(zhí)行業(yè)務接口時,我們就需要考慮引入定時任務,那么問題又來了,我們是選擇“分布式定時任務”呢,還是“本地Job”呢。

好吧,這里就從技術和架構的角度帶著大家一起看一下這個問題。

線程和線程池

熟悉線程和線程池的技術人都應該知道,使用它們是可以實現(xiàn)定時功能的。

RocketMQ中比較常見的定時任務的寫法,就是利用線程來實現(xiàn)的定時任務,也就是Thread類,說的簡單一點就是線程等待。

如下代碼的語義就是按照固定周期waitInterval去執(zhí)行負載均衡。

@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中還有一種比較常見的定時任務的寫法就是用線程池來實現(xiàn)定時任務的,也就是ScheduledExecutorService類。

如下代碼的語義就是周期性的注冊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可以利用線程和線程池來完成定時任務,那么我們的業(yè)務服務也是可以的。

JDK自帶的定時器Timer和TimerTask

定時器Timer和TimerTask本質(zhì)上也是線程實現(xiàn)的定時功能,所以說RocketMQ就直接使用線程和線程池來實現(xiàn)個性化的定時任務,人家那樣做也不是沒有道理。比如在RocketMQ的延遲消息就是使用TimerTask來實現(xiàn)的,當然使用定時器Timer和TimerTask會存在很多缺陷,比如沒有分布式調(diào)度的功能,不能確保分布式環(huán)境下執(zhí)行Job的數(shù)據(jù)一致性等,但是人家RocketMQ不需要考慮這樣的場景,它的分布式問題利用其他的替代方式解決了,比如集群選舉等。

Spring Framework自帶的定時器

熟悉Spring Framework框架的技術人應該知道,可以使用注解@EnableScheduling和@Scheduled就可以開啟一個定時任務,我們可以這樣寫一個定時器。

@Component
@EnableScheduling
public class SimulatingMultithreadedOrder {
@Scheduled(fixedRate = 2000)
public void producerMessage() throws MQClientException {
//定時執(zhí)行的邏輯
}
}

使用Spring Framework框架自帶的本地定時任務非常方便,如果你的基礎框架采用Spring Boot或者更加高級一點Spring Cloud Alibaba,你不需要添加額外的Jar包依賴,因為@EnableScheduling和@Scheduled是Spring Context提供給我們的定時任務注解,只要你是Spring Framework生態(tài)的業(yè)務服務,你就可以使用它,非常的簡單。

Quartz

Quartz可以說是非常古老的定時任務框架,目前最新的版本為2.3.2,項目最近一次更新是2019年,也就是說處于停更狀態(tài),不過這個不影響它的關注度,畢竟它是制定規(guī)范的。

看過Quartz底層源碼的技術人應該都知道,Quartz中大量使用了線程來實現(xiàn)定時任務的功能,比如執(zhí)行任務的線程池和調(diào)度任務的線程池等。

xxl-job

筆者在很多年之前就已經(jīng)接觸過xxl-job了,也是看著它成長起來的,該框架的作者也是非常的厲害,并且這個框架是個人維護到現(xiàn)在,如果我沒記錯的話應該有快10年了。

在Github上搜索xxl-job,目前Fork數(shù)為8.9k,Star 20.9k,這個成績已經(jīng)超過了很多Apache頂級項目的數(shù)據(jù)了,目前它的最新版本為v2.3.0,社區(qū)活躍度還是非常活躍的。

xxl-job給自己的定位是分布式任務調(diào)度平臺,也就是說它不僅是要做定時任務,而是要做調(diào)度,這點就和云原生的理念不謀而合了。

關于xxl-job的原理大家可以參考官方https://github.com/xuxueli/xxl-job,分布式Job的原理其實不難,多實踐一下,看看源碼大致能知道它是如何完成調(diào)度的。

筆者也下載了它的源碼大致看了一下,其實它本質(zhì)上也是用線程來實現(xiàn)的定時Job,只不過加了一些動態(tài)調(diào)度的規(guī)則而已,并且能夠做到非常優(yōu)雅的和動態(tài)的殺死運行Job的線程,并完成線程Job的調(diào)度。

筆者當初關注過xxl-job,主要原因是它在那個版本把ZooKeeper去掉了,自己寫了一套分布式一致性的框架,具體是在哪個版本改進的,這里我大概忘記了。

Elastic-job

Elastic-job是Apache的頂級項目,目前已經(jīng)改名為shardingsphere-elasticjob,具體數(shù)據(jù)如下。

shardingsphere-elasticjob和xxl-job一個最大的不同點在于,前者還是重度依賴ZooKeeper的,畢竟ZooKeeper也是Apache的項目,哈哈,肯定不會去掉的。

還有一個比較大的不同點就是shardingsphere-elasticjob的定時任務規(guī)范是依賴Quartz的二次開發(fā)的產(chǎn)品,而xxl-job是完全自己寫的。

目前shardingsphere-elasticjob最新的版本為3.0.1,社區(qū)活躍度是非常高的,如果大家對源碼感興趣可以下載相關源碼,https://github.com/apache/shardingsphere-elasticjob。

shardingsphere-elasticjob包含兩個部分:

  • E lastic-Job-Lite 定位 為輕量級無中心化解決方案,使用 jar 包的形式提供分布式任務 的協(xié)調(diào)服務;
  • Ela stic-Job-Cloud 使用 Mesos + Docker(TBD) 的解決方案,額外提供資源治理、應用分發(fā)以及進程隔離等服務。

Saturn

Saturn是唯品會在github開源的一款分布式任務調(diào)度產(chǎn)品。它是基于當當elastic-job 1.0版本來開發(fā)的,其上完善了一些功能和添加了一些新的feature。

Saturn目前最新的版本為v3.5.1,社區(qū)活躍度不是很高。

antares

Antares是一個完全自研的個人維護的定時任務框架。

Antares目前最新的版本為1.4.0,最近一次更新是2017年,幾乎處于停止維護狀態(tài)。

Spring Cloud Alibaba Cloud SchedulerX

SchedulerX(分布式任務調(diào)度) 是隸屬于阿里云EDAS產(chǎn)品的組件, Spring Cloud AliCloud SchedulerX 提供了在Spring Cloud的配置規(guī)范下,分布式任務調(diào)度的功能支持。SchedulerX可提供秒級、精準、高可靠、高可用的定時任務調(diào)度服務,并支持多種類型的任務調(diào)度,如簡單單機任務、簡單多機任務、腳本任務以及網(wǎng)格任務。

阿里巴巴并沒有開放Spring Cloud Alibaba Cloud SchedulerX的源碼,這個是一個硬傷,咱們只能使用阿里云的商業(yè)版本。

總之,不論是哪一種分布式定時Job,都會有它適用的業(yè)務場景,并沒有誰是絕對的好和絕對的不好,就像是RPC框架一樣,合適才是最重要的。優(yōu)秀的框架的架構和設計思想是非常有用的,我們能夠把它學過來,并為自己所用也是一種能力的提升,畢竟咱們要先學會模仿,才能夠?qū)W會創(chuàng)新。

責任編輯:張燕妮 來源: 35歲程序員那些事
相關推薦

2024-02-19 00:00:00

分布式定時任務框架

2022-08-09 08:40:37

框架分布式定時任務

2022-03-14 10:12:22

架構網(wǎng)關技術

2022-03-28 07:51:25

分布式定時任務

2023-01-04 09:23:58

2022-03-07 11:20:01

分布式代碼微服務

2022-03-23 11:45:39

Quartz數(shù)據(jù)庫節(jié)點

2019-11-12 09:32:39

分布式elastic-job分片

2019-07-19 15:51:11

框架選型分布式

2023-05-29 14:07:00

Zuul網(wǎng)關系統(tǒng)

2018-10-11 10:55:44

分布式文件系統(tǒng)HDFS

2020-09-15 09:55:13

架構師架構選型

2024-03-25 08:35:07

分布式系統(tǒng)設計

2019-10-10 09:16:34

Zookeeper架構分布式

2024-11-04 16:01:01

2020-09-29 19:20:05

鴻蒙

2023-06-26 00:14:28

Openjob分布式任務

2021-02-10 09:54:15

分布式NacosApollo

2018-11-26 15:12:45

存儲選型架構

2018-08-07 10:04:11

數(shù)據(jù)庫分布式緩存Redis
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲免费av一区 | 成人性生交大免费 | 91色在线 | 国产亚洲久 | 自拍 亚洲 欧美 老师 丝袜 | 国产一级在线 | 成年人网站在线观看视频 | 亚洲精品九九 | 欧美xxxx性xxxxx高清 | 成人在线一级片 | 天天操天天天干 | 一区二区亚洲 | 四虎在线视频 | 伊人色综合久久天天五月婷 | 精品国产精品三级精品av网址 | 日本精品一区二区三区视频 | 亚洲成人自拍 | 亚洲免费在线观看 | 久久久久久久91 | 天天操天天射天天舔 | 欧美日韩一区二区三区四区 | 91视视频在线观看入口直接观看 | 精品综合网 | 高清国产一区二区 | 成人国产精品久久 | 91社区在线观看高清 | 红色av社区 | 国产精品亚洲成在人线 | 日韩视频在线免费观看 | 久久一二区 | 国产精彩视频 | 国产一级久久久久 | 午夜视频一区二区三区 | 国产在线精品一区二区三区 | 欧美片网站免费 | 国产999精品久久久久久 | 国产午夜三级一区二区三 | 蜜桃视频在线观看免费视频网站www | 一区二区三区四区在线 | 男人影音 | 老外黄色一级片 |