XXL-job調度策略的研究報告
- 阻塞策略研究
XXL-job一共有如下三種任務阻塞策略:單機串行、丟棄後續調度、覆蓋之前調度(如下圖)
不同阻塞策略的研究:
實驗結果如下表:
不同阻塞策略下不同執行器的執行結果 |
||
|
執行器1 |
執行器2 |
單機串行 |
接受到兩次,執行兩次,按順序執行 |
接受到兩次,執行兩次,按順序執行 |
丟棄後續調度 |
對重複的任務只接受一次(接受到一次) |
對重複的任務只接受一次(接受到一次) |
覆蓋之前調度 |
在執行過程中如果收到了同一個任務會立馬停掉當前任務去執行最新進來的任務(接受到兩次) |
在執行過程中如果收到了同一個任務會立馬停掉當前任務去執行最新進來的任務(接受到兩次) |
- 路由策略的研究
1.第一個:當有任務待執行器執行時,調度中心會將任務下發到權重較高(路由路徑最短的)的執行器,比如當我們將執行器與調度器同時部署在同一臺服務器上,那麼此執行器的權重最高,它爲第一個,如果它掛了那麼,90s以後會重新設置第一個。在執行過程中掛了,那麼此任務執行失敗,在未來的90s內有新的任務進來也將會失敗。
2.最後一個:原理同上
3.隨機:當有任務待執行器執行時,調度中心會將任務隨機下發某個執行器上,在執行過程中掛了,那麼此任務執行失敗,在未來的90s內有新的任務進來也將會失敗。
4.輪詢:原理同上
5.一致性HASH:原理同上
6.最不經常使用:原理同上
7.最近最久未使用:原理同上
8.故障轉移:當有任務待執行器執行時,調度中心會將任務隨機下發某個執行器上,在執行過程中掛了,那麼此任務執行失敗,下一次任務進來時立馬分派到新的存活的服務器上,不必等待90s
9.忙碌轉移:原理同上
10.分片廣播:原理同上
總結:阻塞策略是用來設置任務該如何執行,路由策略是用來分發任務,兩者是完全不同的概念。
問題1:如何設置讓調度器更快將不可用的執行器移除?
答:參看源碼:設置RegistryConfig.DEAD_TIMEOUT的時間即可。
//來自於包:
package com.xxl.job.admin.core.thread;
// remove dead address (admin/executor)
List<Integer> ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date());
//設置具體時間:
public class RegistryConfig {
public static final int BEAT_TIMEOUT = 30;
public static final int DEAD_TIMEOUT = BEAT_TIMEOUT * 3;
public enum RegistType{ EXECUTOR, ADMIN }
}
問題2:假設我有如下情況他的執行結果是怎樣的?
阻塞策略使用覆蓋之前的之前調度,同時路由策略採用故障轉移,這個任務執行所需花費的時間是30s,在30s內我發送了兩次執行該任務的請求,那麼他的執行結果是怎樣的?
答:因爲我們採用的是故障轉移的路由策略,所以我們要搞清楚我們的兩次執行該任務的請求是在發生故障之前發的還是在發生故障以後發的,比如第一個請求發送過去,然後緊接着發送第二個,在兩個請求都發送出去時才掛掉,那麼此次任務執行失敗,反之,如果第一次請求發送過去執行了10s,然後執行器掛了,然後發起了第二次請求,那麼此時第二次任務請求被轉移到新的執行器上,第二次請求執行成功。