1,傳統(tǒng)的定時(shí)任務(wù)存在哪些缺點(diǎn)?
1,業(yè)務(wù)邏輯與定時(shí)任務(wù)邏輯放入同一個(gè)jar包中,如果定時(shí)任務(wù)邏輯掛了也會(huì)影響到業(yè)務(wù)邏輯;
2, 如果服務(wù)器集群下,可能存在定時(shí)任務(wù)會(huì)重復(fù)觸發(fā)執(zhí)行
3,定時(shí)惹怒我執(zhí)行非常消耗cpu的資源,可能會(huì)影響到業(yè)務(wù)線程的執(zhí)行。
2,定時(shí)任務(wù)集群,如何保證定時(shí)任務(wù)冪等性問題。
1,將業(yè)務(wù)邏輯和定時(shí)任務(wù)邏輯分開部署,實(shí)現(xiàn)解耦,只對業(yè)務(wù)邏輯實(shí)現(xiàn)集群,不對我們的定時(shí)任務(wù)邏輯集群;一定時(shí)任務(wù)單機(jī)版本,缺點(diǎn) 無法實(shí)現(xiàn)高可用的問題;
2,對我們的jar包加上一個(gè)開關(guān),項(xiàng)目啟動(dòng)時(shí)讀取該開關(guān),如果為true的情況下則加載定時(shí)任務(wù)類,否則情況下不加載定時(shí)任務(wù)類。 ---缺點(diǎn): 無法實(shí)現(xiàn)高可用的問題。
3, 在數(shù)據(jù)庫加上一個(gè)主鍵能夠成功則觸發(fā)定時(shí)任務(wù),否則就不觸發(fā)定時(shí)任務(wù)
4,分布式實(shí)現(xiàn),只要jar能夠拿到分布式鎖就能夠執(zhí)行定時(shí)任務(wù),否則不執(zhí)行。
以上的方案都是屬于規(guī)模比較小的項(xiàng)目,在微服務(wù)架構(gòu)中應(yīng)該采用分布式任務(wù)調(diào)度平臺。
傳統(tǒng)的定時(shí)任務(wù)的實(shí)現(xiàn)方案: 多線程形式,timetask,線城池,springboot 注解 quartz。
3,分布式任務(wù)調(diào)度平臺設(shè)計(jì)原理。
xxl-job-admin ---分布式任務(wù)調(diào)度中心平臺
xxl-job-core-----源碼實(shí)現(xiàn)部分
xxl-job-executor-samples----執(zhí)行器項(xiàng)目 定時(shí)任務(wù)模塊
定時(shí)任務(wù)與業(yè)務(wù)邏輯實(shí)現(xiàn)解耦。分開部署,定時(shí)任務(wù)是個(gè)單獨(dú)的項(xiàng)目
Mayikt-member---會(huì)員服務(wù)接口
member-job----負(fù)責(zé)會(huì)員服務(wù)定時(shí)任務(wù)
4,XXL-JOB 與ElasticJob 區(qū)別
5,分布式任務(wù)調(diào)度平臺如何實(shí)現(xiàn)動(dòng)態(tài)啟停
6, 分布式任務(wù)調(diào)度負(fù)載均衡策略。
7,分布式任務(wù)調(diào)度分片集群策略原理
8,如何保證任務(wù)調(diào)度平臺高可用。
分布式任務(wù)調(diào)度架構(gòu)設(shè)計(jì)原理:
xxl-job-admin--分布式任務(wù)調(diào)度中心平臺:
xxl-job-core---源碼實(shí)現(xiàn)部分
執(zhí)行器模塊: (注冊中心)存放實(shí)際執(zhí)行我們定時(shí)任務(wù)項(xiàng)目模塊IP和端口信息
分布式任務(wù)調(diào)度中心: nginx 負(fù)責(zé)所有執(zhí)行器執(zhí)行定時(shí)任務(wù)的分配。
原理:
1,執(zhí)行器啟動(dòng)的時(shí)候會(huì)將他的ip和端口號注冊到執(zhí)行器上。
2,當(dāng)我們現(xiàn)在的定時(shí)任務(wù)模塊中啟動(dòng)定時(shí)任務(wù)的時(shí)候,定時(shí)任務(wù)會(huì)在admin項(xiàng)目先觸發(fā),會(huì)根據(jù)執(zhí)行器的名稱查詢多個(gè)不同的執(zhí)行的ip信息,在采用負(fù)載均衡算法選擇一個(gè)地址,發(fā)送rest請求通知給執(zhí)行器執(zhí)行到定時(shí)任務(wù)。
XXl-job 定時(shí)任務(wù)框架實(shí)現(xiàn)原理。
建議: 定時(shí)任務(wù)業(yè)務(wù)邏輯與業(yè)務(wù)邏輯模塊實(shí)現(xiàn)分開部署。也就是實(shí)現(xiàn)解耦。
會(huì)員服務(wù):--會(huì)員業(yè)務(wù)邏輯 不允許有定時(shí)任務(wù)邏輯。
會(huì)員定時(shí)任務(wù)模塊--執(zhí)行定時(shí)任務(wù)業(yè)務(wù)邏輯:
執(zhí)行器“: 定時(shí)業(yè)務(wù)邏輯模塊的項(xiàng)目:
定時(shí)任務(wù)調(diào)度中心(nginx),所有定時(shí)任務(wù)觸發(fā)先到達(dá)
定時(shí)任務(wù)調(diào)度中心,在駕駛分配到執(zhí)行器執(zhí)行。
xxl-job-admin定時(shí)任務(wù)調(diào)度中心模塊
執(zhí)行器模塊----定時(shí)任務(wù)模塊----執(zhí)行器注冊中心
原理:
1,當(dāng)我們的定時(shí)任務(wù)模塊項(xiàng)目啟動(dòng)的時(shí)候,會(huì)將該ip和端口信息注冊到 定時(shí)任務(wù)注冊中心上發(fā)送rest請求;
http://127.0.0.1:8080/xxl-job-admin/api/registry
2,需要將定時(shí)任務(wù)創(chuàng)建在任務(wù)調(diào)度中心,關(guān)聯(lián)執(zhí)行器 定時(shí)任務(wù)模塊實(shí)際執(zhí)行ip和端口號
3,創(chuàng)建定時(shí)任務(wù)會(huì)再 xxl-job admin 調(diào)度中心 項(xiàng)目先觸發(fā),從執(zhí)行器初測中心查找到執(zhí)行器接口信息,采用路由策略選擇一個(gè)執(zhí)行器(定時(shí)任務(wù))地址 發(fā)送通知 執(zhí)行定時(shí)任務(wù)。配置定時(shí)任務(wù)規(guī)則的時(shí)候,建議提前些。
定時(shí)任務(wù)和業(yè)務(wù)邏輯代碼完全分開,定時(shí)任務(wù)代碼肯定單獨(dú)的一個(gè)項(xiàng)目;
執(zhí)行器:定時(shí)任務(wù)業(yè)務(wù)邏輯;
任務(wù)調(diào)度平臺:
核心:
定時(shí)調(diào)度模塊 所有定時(shí)任務(wù)需要經(jīng)過定時(shí)調(diào)度模塊
執(zhí)行器: 業(yè)務(wù)邏輯模塊
- 執(zhí)行器定時(shí)任務(wù)項(xiàng)目,啟動(dòng)時(shí)候會(huì)將該定時(shí)任務(wù)接口地址注冊到定時(shí)任務(wù)注冊中心中
- 當(dāng)觸發(fā)定時(shí)任務(wù)時(shí)候,會(huì)先到達(dá)任務(wù)調(diào)度中心,在獲取注冊中心地址 隨機(jī)取出一個(gè)地址實(shí)現(xiàn)rpc遠(yuǎn)程調(diào)用。
- 執(zhí)行器接收到請求之后,根據(jù)handlerid +反射機(jī)制執(zhí)行方法。
缺點(diǎn):定時(shí)任務(wù)可能會(huì)延遲。
常用時(shí)任務(wù)調(diào)度框架:
Xxl-job、elasticjob、SpringAlibaba Cloud SchedulerX
XXL-JOB任務(wù)調(diào)度平臺
https://www.xuxueli.com/xxl-job/
XXL-job-Admin 平臺搭建 任務(wù)調(diào)度中心
1,官方下載XXL-JobAdmin 的源代碼
2,導(dǎo)入xxl-job需要依賴的sql
3,3. 在xxl-job jdb鏈接配置加上&serverTimezone=UTC 否則報(bào)錯(cuò)
4,啟動(dòng)項(xiàng)目
SpringBoot整合XXL-JOB
Maven依賴配置
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.11.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.1.2</version>
</dependency>
</dependencies>
Xxl config
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appName;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppName(appName);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
/**
* 針對多網(wǎng)卡、容器內(nèi)部署等情況,可借助 "spring-cloud-commons" 提供的 "InetUtils" 組件靈活定制注冊IP;
*
* 1、引入依賴:
* <dependency>
* <groupId>org.springframework.cloud</groupId>
* <artifactId>spring-cloud-commons</artifactId>
* <version>${version}</version>
* </dependency>
*
* 2、配置文件,或者容器啟動(dòng)變量
* spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
*
* 3、獲取IP
* String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
*/
}
測試任務(wù)Demo
@Component
public class MyJobExecutor {
@Value("${xxl.job.executor.port}")
private String executorPort;
@XxlJob("myJobHandler")
public ReturnT<String> myJobHandler(String param) {
System.out.println(">>>myJobHandler觸發(fā)<<<param:" + param + ",executorPort:" + executorPort);
return ReturnT.SUCCESS;
}
}