設定
佇列容量、worker 數量、逾時與具名 preset。
Config
將 *Config 傳入 New。nil 時使用全部預設值。
type Config struct {
Workers int // default = CPU * 2
Size int // default = Workers * 64
Timeout time.Duration // default = 30 * seconds
Preset map[string]PresetConfig // default = empty
}
| 欄位 | 型別 | 預設 | 說明 |
|---|---|---|---|
Workers |
int |
runtime.NumCPU() * 2 |
Worker goroutine 數量 |
Size |
int |
Workers * 64 |
pending heap 最大容量 |
Timeout |
time.Duration |
30 * time.Second |
逾時推算與晉升的基準 |
Preset |
map[string]PresetConfig |
空 map | 具名優先級與逾時設定 |
Workers、Size、Timeout 為零值時回退預設。非 nil 的 Preset 會 deep-copy 進佇列設定。
PresetConfig
type PresetConfig struct {
Priority Priority
Timeout time.Duration
}
| 欄位 | 說明 |
|---|---|
Priority |
Enqueue 使用此 preset 名稱時的任務優先級 |
Timeout |
> 0 時在優先級縮放前覆寫基準 Config.Timeout;0 則使用基準逾時 |
範例
q := goQueue.New(&goQueue.Config{
Workers: 4,
Size: 256,
Timeout: 30 * time.Second,
Preset: map[string]goQueue.PresetConfig{
"urgent": {Priority: goQueue.PriorityImmediate},
"batch": {Priority: goQueue.PriorityLow, Timeout: 60 * time.Second},
},
})
逾時推算
每次入隊解析逾時的順序(在 WithTimeout 覆寫之前):
- 從
Config.Timeout開始。 - 若 preset 名稱存在且
PresetConfig.Timeout > 0,改用該值。 - 依 preset 的
Priority縮放。 - 限制在 15s–120s。
| Priority | 計算 |
|---|---|
| Immediate | timeout / 4 |
| High | timeout / 2 |
| Retry | timeout / 2 |
| Normal | timeout |
| Low | timeout * 2 |
WithTimeout(d) 會完全取代該次入隊的推算結果。
優先級晉升門檻
晉升等待時間在 New 時依 Config.Timeout 推導一次:
| 來源 | 等待 | 目標 |
|---|---|---|
| Low | clamp(Timeout, 30s, 120s) |
Normal |
| Normal | clamp(Timeout*2, 30s, 120s) |
High |
New 之後再改 Timeout 無效——晉升 map 在建構時固定。
入隊選項
入隊時的單次任務覆寫:
| 選項 | 效果 |
|---|---|
WithTaskID(id) |
設定 task ID;空/省略 → 自動 UUID |
WithTimeout(d) |
覆寫推算逾時 |
WithCallback(fn) |
成功後在新 goroutine 執行 fn(id) |
WithRetry(max...) |
啟用重試;可選上限(預設 3) |
預設摘要
| 設定 | 預設 |
|---|---|
| Workers | runtime.NumCPU() * 2 |
| Size | Workers * 64 |
| Timeout | 30s |
| 推算逾時下限 | 15s |
| 推算逾時上限 | 120s |
| 重試上限(啟用且無參數) | 3 |
| 空 preset 名稱優先級 | PriorityImmediate(未設定 map 項目的零值) |