核心概念
優先級排序、等待時間晉升、逾時推算、重試與原子佇列狀態機。
優先級
數值愈小愈先執行。Heap 先比 priority,再比較早的 startAt。
| 常數 | 值 | 說明 |
|---|---|---|
PriorityImmediate |
0 | 最高,立刻執行 |
PriorityHigh |
1 | 高優先 |
PriorityRetry |
2 | 失敗後重新入隊的重試任務 |
PriorityNormal |
3 | 一般(依 preset 查表語意) |
PriorityLow |
4 | 最低;等待後可晉升 |
已定義 preset 項目若未設定 PresetConfig.Priority,Go 零值為 PriorityImmediate(iota 0)。
優先級晉升
每次 Pop 時,pending 會掃描 heap,可能提升久等的任務:
| 來源 | 等待時間 | 目標 |
|---|---|---|
| Low | clamp(Timeout, 30s, 120s) |
Normal |
| Normal | clamp(Timeout*2, 30s, 120s) |
High |
晉升只會往更高優先(較小數值)。Immediate、High、Retry 不在此自動晉升規則內。
逾時推算
基準為 Config.Timeout(預設 30s);preset 的 Timeout > 0 時可覆寫。再依優先級調整,並限制在 15s–120s:
| Priority | 計算 |
|---|---|
| Immediate | timeout / 4 |
| High / Retry | timeout / 2 |
| Normal | timeout |
| Low | timeout * 2 |
單次入隊的 WithTimeout 會覆寫該任務的推算結果。
執行、panic 與重試
每個 worker 在子 goroutine 中以 context.WithTimeout 執行 action:
- 成功 — 記錄完成;可選
callback(id)非同步執行。 - 逾時/取消/錯誤 — 若啟用
WithRetry且retryTimes < retryMax,以PriorityRetry重新入隊並重設startAt。 - Panic — 在 action goroutine 內 recover,視為錯誤(
panic: ...)。 - 重試耗盡 — 記錄
task.exhausted,不再入隊。
呼叫 WithRetry() 且未帶參數時,預設 retryMax 為 3。
狀態機
| 狀態 | 意義 |
|---|---|
| Created | New 之後;尚未 Start 前 worker 迴圈未啟動 |
| Running | Worker 運作中 |
| Closed | 不再接受 Push;排空後結束 |
狀態轉換使用 atomic.Uint32 CAS,公開狀態欄位無 mutex。佇列已關閉或已滿時 Enqueue 失敗。從任何非 Closed 狀態呼叫 Shutdown 皆安全且冪等。