Skip to main content

Dispatcher(任務調度模組)技術說明

Dispatcher 是 System Controller 的智能任務分派核心模組,負責根據即時資源狀態與策略,將待分派任務自動分配給最合適的 Skald 節點。其設計目標為動態負載平衡、資源最佳化與高可用性,確保分散式任務調度系統能高效運作。


1. 架構定位與角色

Dispatcher 隸屬於 System Controller,與 Monitor、API 服務等模組協同運作。其主要職責如下:

  • 自動分派任務:定期從資料庫(MongoDB)抓取待分派任務,根據策略選擇合適 Skald 節點。
  • 動態負載平衡:根據 Skald 當前負載(任務數量)與狀態,實現最少任務優先、輪詢、隨機等多種分派策略。
  • 事件驅動:分派後,透過 Kafka 發布任務分配事件,驅動 Skald 節點建立 Task Worker。
  • 狀態同步:即時更新任務執行者(executor)與狀態,確保系統狀態一致。

參考架構與模組說明:System Controller 技術說明Skalds 架構介紹


2. 運作流程

Dispatcher 的核心運作流程如下:

  1. 定時輪詢:每隔固定秒數(預設 5 秒),自動執行分派流程。
  2. 篩選待分派任務:從 MongoDB 取得所有狀態為「未分派」的任務(排除 Running、Assigning、Cancelled、Paused、Finished)。
  3. 取得可用 Skald 節點:僅選擇線上且類型為 node 的 Skald,並取得其當前任務數量。
  4. 分派策略選擇:根據設定的策略(如最少任務、輪詢、隨機)決定分派對象。
  5. 更新任務狀態:將任務的 executor 欄位設為選定 Skald ID,狀態改為 Assigning。
  6. 發布分派事件:透過 Kafka 發布 task.assign 事件,通知 Skald 節點建立 Task Worker。
  7. 監控與重試:若分派失敗或 Skald 不可用,會自動重試並記錄日誌。

詳細流程與狀態轉換請參考:任務生命週期


3. 分派策略

Dispatcher 支援多種分派策略,可依據實際需求調整:

  • 最少任務(LEAST_TASKS):優先分派給當前任務數最少的 Skald,實現負載均衡(預設)。
  • 輪詢(ROUND_ROBIN):依序分派,確保任務平均分布。
  • 隨機(RANDOM):隨機選擇可用 Skald,適合任務負載差異不大時。

可於環境變數或設定檔調整策略:

# .env 或部署環境變數
DISPATCHER_STRATEGY=LEAST_TASKS # 可選 LEAST_TASKS|ROUND_ROBIN|RANDOM

策略列舉定義於 skalds/config/_enum.py (GitHub)


4. 主要程式碼結構

Dispatcher 主要實作於 skalds/system_controller/monitor/dispatcher.py (GitHub),其核心類別與方法如下:

  • Dispatcher:單例類別,負責分派主流程與策略選擇。
    • start() / stop():啟動與停止分派執行緒。
    • _dispatch_tasks():分派主邏輯,包含任務篩選、Skald 選擇、狀態更新與事件發布。
    • _calculate_assignments():根據策略計算任務分派對應表。
    • _assign_task_to_skald():執行單一任務的分派與事件發布。
    • set_strategy():動態切換分派策略。
    • get_status():取得當前分派狀態與統計資訊。

詳細程式碼請參考 dispatcher.py (GitHub)


5. 配置與啟動方式

5.1 啟動 Dispatcher 模式

System Controller 可透過環境變數 SYSTEM_CONTROLLER_MODE=DISPATCHER 啟動完整分派功能:

export SYSTEM_CONTROLLER_MODE=DISPATCHER
python -m skalds.system_controller.main

需同時啟動 Redis、MongoDB、Kafka 等服務,詳見部署說明

5.2 主要環境變數


6. 典型應用場景

  • 高併發任務分派:自動將大量任務分配給最合適的 Skald 節點,提升系統吞吐量。
  • 動態負載平衡:根據 Skald 負載即時調整分派,避免單點過載。
  • 多租戶/多節點協同:支援多 Skald 節點協同運作,適合大規模分散式場景。
  • 緊急任務優先處理:可根據任務優先權進行排序,確保高優先任務即時分派。

7. 效能優化與最佳實踐

  • 合理設定分派間隔:根據任務量與系統規模調整 DISPATCHER_INTERVAL,避免過度輪詢或延遲。
  • 策略選擇:根據實際負載選擇最適合的分派策略,動態切換可提升彈性。
  • 監控與日誌:結合 Monitor 與日誌系統,及時發現分派異常與資源瓶頸。
  • 高可用部署:建議搭配多副本、Redis Cluster、Kafka 分區等高可用架構。

8. 常見問題與除錯

  • 無可用 Skald 節點:請確認 Skald node 節點已註冊且線上,並檢查 Redis/MongoDB 連線狀態。
  • 任務未分派:檢查任務狀態是否正確(非 Running/Assigning/Cancelled),並確認分派策略與條件設定。
  • Kafka 發布失敗:確認 Kafka 服務正常運作,並檢查 topic 設定。

10. 參考文件與延伸閱讀


Dispatcher 是 Skalds 分散式任務調度系統的智能分派核心,正確配置與善用可大幅提升系統的彈性、效能與可維護性。