1,傳統(tǒng)的定時任務存在哪些缺點?
1,業(yè)務邏輯與定時任務邏輯放入同一個jar包中,如果定時任務邏輯掛了也會影響到業(yè)務邏輯;
2, 如果服務器集群下,可能存在定時任務會重復觸發(fā)執(zhí)行
3,定時惹怒我執(zhí)行非常消耗cpu的資源,可能會影響到業(yè)務線程的執(zhí)行。
2,定時任務集群,如何保證定時任務冪等性問題。
1,將業(yè)務邏輯和定時任務邏輯分開部署,實現(xiàn)解耦,只對業(yè)務邏輯實現(xiàn)集群,不對我們的定時任務邏輯集群;一定時任務單機版本,缺點 無法實現(xiàn)高可用的問題;
2,對我們的jar包加上一個開關(guān),項目啟動時讀取該開關(guān),如果為true的情況下則加載定時任務類,否則情況下不加載定時任務類。 ---缺點: 無法實現(xiàn)高可用的問題。
3, 在數(shù)據(jù)庫加上一個主鍵能夠成功則觸發(fā)定時任務,否則就不觸發(fā)定時任務
4,分布式實現(xiàn),只要jar能夠拿到分布式鎖就能夠執(zhí)行定時任務,否則不執(zhí)行。
以上的方案都是屬于規(guī)模比較小的項目,在微服務架構(gòu)中應該采用分布式任務調(diào)度平臺。
傳統(tǒng)的定時任務的實現(xiàn)方案: 多線程形式,timetask,線城池,springboot 注解 quartz。
3,分布式任務調(diào)度平臺設計原理。
xxl-job-admin ---分布式任務調(diào)度中心平臺
xxl-job-core-----源碼實現(xiàn)部分
xxl-job-executor-samples----執(zhí)行器項目 定時任務模塊
定時任務與業(yè)務邏輯實現(xiàn)解耦。分開部署,定時任務是個單獨的項目
Mayikt-member---會員服務接口
member-job----負責會員服務定時任務
4,XXL-JOB 與ElasticJob 區(qū)別
5,分布式任務調(diào)度平臺如何實現(xiàn)動態(tài)啟停
6, 分布式任務調(diào)度負載均衡策略。
7,分布式任務調(diào)度分片集群策略原理
8,如何保證任務調(diào)度平臺高可用。
分布式任務調(diào)度架構(gòu)設計原理:
xxl-job-admin--分布式任務調(diào)度中心平臺:
xxl-job-core---源碼實現(xiàn)部分
執(zhí)行器模塊: (注冊中心)存放實際執(zhí)行我們定時任務項目模塊IP和端口信息
分布式任務調(diào)度中心: nginx 負責所有執(zhí)行器執(zhí)行定時任務的分配。
原理:
1,執(zhí)行器啟動的時候會將他的ip和端口號注冊到執(zhí)行器上。
2,當我們現(xiàn)在的定時任務模塊中啟動定時任務的時候,定時任務會在admin項目先觸發(fā),會根據(jù)執(zhí)行器的名稱查詢多個不同的執(zhí)行的ip信息,在采用負載均衡算法選擇一個地址,發(fā)送rest請求通知給執(zhí)行器執(zhí)行到定時任務。
XXl-job 定時任務框架實現(xiàn)原理。
建議: 定時任務業(yè)務邏輯與業(yè)務邏輯模塊實現(xiàn)分開部署。也就是實現(xiàn)解耦。
會員服務:--會員業(yè)務邏輯 不允許有定時任務邏輯。
會員定時任務模塊--執(zhí)行定時任務業(yè)務邏輯:
執(zhí)行器“: 定時業(yè)務邏輯模塊的項目:
定時任務調(diào)度中心(nginx),所有定時任務觸發(fā)先到達
定時任務調(diào)度中心,在駕駛分配到執(zhí)行器執(zhí)行。
xxl-job-admin定時任務調(diào)度中心模塊
執(zhí)行器模塊----定時任務模塊----執(zhí)行器注冊中心
原理:
1,當我們的定時任務模塊項目啟動的時候,會將該ip和端口信息注冊到 定時任務注冊中心上發(fā)送rest請求;
http://127.0.0.1:8080/xxl-job-admin/api/registry
2,需要將定時任務創(chuàng)建在任務調(diào)度中心,關(guān)聯(lián)執(zhí)行器 定時任務模塊實際執(zhí)行ip和端口號
3,創(chuàng)建定時任務會再 xxl-job admin 調(diào)度中心 項目先觸發(fā),從執(zhí)行器初測中心查找到執(zhí)行器接口信息,采用路由策略選擇一個執(zhí)行器(定時任務)地址 發(fā)送通知 執(zhí)行定時任務。配置定時任務規(guī)則的時候,建議提前些。
定時任務和業(yè)務邏輯代碼完全分開,定時任務代碼肯定單獨的一個項目;
執(zhí)行器:定時任務業(yè)務邏輯;
任務調(diào)度平臺:
核心:
定時調(diào)度模塊 所有定時任務需要經(jīng)過定時調(diào)度模塊
執(zhí)行器: 業(yè)務邏輯模塊
- 執(zhí)行器定時任務項目,啟動時候會將該定時任務接口地址注冊到定時任務注冊中心中
- 當觸發(fā)定時任務時候,會先到達任務調(diào)度中心,在獲取注冊中心地址 隨機取出一個地址實現(xiàn)rpc遠程調(diào)用。
- 執(zhí)行器接收到請求之后,根據(jù)handlerid +反射機制執(zhí)行方法。
缺點:定時任務可能會延遲。
常用時任務調(diào)度框架:
Xxl-job、elasticjob、SpringAlibaba Cloud SchedulerX
XXL-JOB任務調(diào)度平臺
https://www.xuxueli.com/xxl-job/
XXL-job-Admin 平臺搭建 任務調(diào)度中心
1,官方下載XXL-JobAdmin 的源代碼
2,導入xxl-job需要依賴的sql
3,3. 在xxl-job jdb鏈接配置加上&serverTimezone=UTC 否則報錯
4,啟動項目
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、配置文件,或者容器啟動變量
* spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
*
* 3、獲取IP
* String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
*/
}
測試任務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;
}
}