一、簡介
項目中使用了springboot的@schedule注解來執行定時任務。不過該注解不做特殊設定時是存在隐患的。該注解内部預設的是采用的一個線程的線程池來串行執行任務的。
這樣就會出現隐患,一是 定義了倆個任務,A任務淩晨3點執行, B任務淩晨4點執行, 此時如果A任務執行時間為一個半小時,則B任務會一直阻塞到點半才會開始執行,而非定義的4點執行,這就造成了B任務沒有定時執行的假象。還有一個隐患是 如果A任務執行過程中假死,則B任務和其它任務則會一直阻塞不執行,這就玩大發了。
二、解決方法
可以通過自定義定時執行任務的線程個數将串行改為并行即可,springboot可以通過添加如下配置類來解決:
@Configuration
@EnableAsync
public class AsyncConfig {
/*
此處成員變量應該使用@Value從配置中讀取
*/
private int corePoolSize = 10;
private int maxPoolSize = 200;
private int queueCapacity = 10;
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.initialize();
return executor;
}
}
三、分布式任務排程架構(TODO)
3.1 引入原因
如果少量伺服器還好說,但是當大規模叢集的時候,僅僅使用@schedule注解就不行了,這樣無法看到任務是否執行完成,成功或失敗,任務數量,任務分布,鍊路追蹤等等等等。這時就需要引入分布式任務排程架構了。
3.2 分布式架構對比
3.2.1 對比圖
- 對比圖 https://pan.baidu.com/s/1CZAjTFqIhinzlVLnrrMUKQ(注:該圖出自部落客路燈下的女孩)
3.3 Elastic-job
3.3.1 簡介
- 當當出品,github位址: https://github.com/elasticjob/elastic-job-lite
- 個人系列文章 Elastic-job系列(一)-------- 搭建Esjob控制台
3.4 XXL-job
3.4.1 簡介
- 大衆點評出品,文檔豐富齊全,github位址: https://github.com/xuxueli/xxl-job