v1.2.1

架構

最後更新


本頁以單張概覽圖說明 go-scheduler 的元件分層與跨元件原則。

系統概覽


graph TB
    App[呼叫端] --> Cron[cron 排程器]
    Cron --> Parser[表達式解析器]
    Cron --> Heap[任務最小堆]
    Heap --> Loop[事件迴圈 goroutine]
    Loop -->|無依賴| Direct[goroutine 直接執行]
    Loop -->|有依賴| Queue[Wait 佇列]
    Queue --> Workers[依賴 Worker 池]
    Workers --> Manager[dependManager]
    Direct --> State[任務狀態]
    Manager --> State
  1. graph TB
  2. App[呼叫端] --> Cron[cron 排程器]
  3. Cron --> Parser[表達式解析器]
  4. Cron --> Heap[任務最小堆]
  5. Heap --> Loop[事件迴圈 goroutine]
  6. Loop -->|無依賴| Direct[goroutine 直接執行]
  7. Loop -->|有依賴| Queue[Wait 佇列]
  8. Queue --> Workers[依賴 Worker 池]
  9. Workers --> Manager[dependManager]
  10. Direct --> State[任務狀態]
  11. Manager --> State

分層


層元件檔案職責
公開介面croncore/instance.go、core/add.go、core/remove.go、core/task.goNew/Start/Stop/Add/Remove/RemoveAll/List
解析parsercore/schedule.go將 spec 轉為 scheduleResult(Cron、描述符)或 delayScheduleResult(@every)
排程taskHeapcore/task.go依 next 排序的最小堆,事件迴圈只等待堆頂
執行cron.runAftercore/instance.go無依賴任務:goroutine 執行、超時、panic recover
依賴depend、dependManagercore/depend.go、core/dependManager.go佇列(容量 1024)、Worker 池、前置狀態輪詢與結果更新

跨元件原則


原則實作
單一事件迴圈擁有最小堆Start 後的新增、移除、清空都經由 add/remove/removeAll channel 送入迴圈;Start 前直接改寫最小堆
狀態以任務層級鎖保護每個 task 持有 sync.RWMutex,依賴檢查以讀鎖讀取前置任務 state
依賴任務與一般任務分流cron.run 依 after 是否為空決定直接執行或進入 Worker 佇列
Worker 數量有上限runtime.NumCPU() 大於 2 時取 CPU 數,否則為 2
關閉不強制中斷 actionStop 等待 WaitGroup 與 Worker 結束,action 本身不接收 context

延伸閱讀


EN