- Github地址
- Task Pool 是一個易於使用且高度可配置的 golang類庫,專門用於任務的管理&執行,支援自定義次數的重發。
功能特點
- 執行緒安全 - task pool 內所有的方法以及暴露的介面都是執行緒安全的
- 非同步傳送 - 呼叫 PushTask 方法後回立即返回,任務將會被傳遞到io執行緒中非同步傳送,不阻塞使用者操作。
- 失敗重試 - 使用者可以通過設定初始化的引數來指定任務執行失敗的次數,超過重試次數將被投遞到失敗佇列。
- 優雅關閉 - 使用者呼叫關閉方法進行關閉時,task pool 會將所有其快取的資料進行傳送,防止任務丟失。
- 結果可控 - 使用者可以自己實現 Task 介面,裡面包含任務執行成功和失敗後呼叫的方法,以及任務具體執行的操作。
安裝
go get github.com/overtalk/task
使用步驟
1.配置Config
- Config 是提供給使用者的配置類,用於配製任務執行策略,您可以根據不同的需求設定不同的值,具體的引數含義如文章尾的配置詳解所示。
啟動 taskPool 程式
c := task.GetDefaultConfig()
taskPool, err := task.NewTaskPool(c)
if err != nil {
log.Fatal(err)
}
taskPool.Start() // 啟動 task pool 例項
3.呼叫 PushTask 方法加入任務
任務需要自定義,實現一下介面即可
type Task interface { Execute() error Success(result *Result) Fail(result *Result) }
task pool 中提供了 PushTask 方法供使用者將任務加入到任務池中
// 執行任務 for i := 0; i < 10; i++ { t := &myTask{ name: fmt.Sprintf("task - %d", i), times: 0, } taskPool.PushTask(t) }
4.關閉 taskPool
- taskPool 提供安全關閉的方式,會等待 taskPool 中快取的所有的任務全部傳送完成以後在關閉 taskPool
taskPool.SafeClose()
5.獲取任務執行結果
taskPool 中的任務執行是非同步的,所以需要使用者實現 Task 介面,去獲得每次執行的結果。
實現 Task 介面需要實現其中的Success()方法和Fail()方法,兩個方法分別會在任務執行成功或失敗的時候去呼叫,兩個方法會都會接收一個Result 例項,使用者可以根據Result例項在CallBack回撥方法中去獲得每次任務執行的結果。下面寫了一個簡單的使用樣例。
type myTask struct { name string times int }
func (myTask myTask) Execute() error {
fmt.Printf(“Execute* [%s], times = [%d]\n”, myTask.name, myTask.times)
if myTask.times == 0 {
myTask.times++
return errors.New("fail")
}
return nil
}
func (myTask myTask) Success(result *task.Result) {
fmt.Printf(“success* [%s]! times = [%d]\n”, myTask.name, myTask.times)
}
func (myTask myTask) Fail(result *task.Result) {
fmt.Printf(“fail* [%s]! times = [%d]\n”, myTask.name, myTask.times)
}
```
- 使用者可以根據自己的需求呼叫Result例項提供的方法來獲取任務執行結果資訊,任務每次嘗試被執行都會生成attempt資訊,預設會保留11次,這個數字可以根據配置引數MaxReservedAttempts進行修改。
taskPool 配置詳解
引數 | 型別 | 描述 |
---|---|---|
MaxTaskNum | Int | 單個 taskPool 例項能快取的任務數量上限,預設為 1000。 |
MaxBlockSec | Int | 如果 taskPool 任務數量已達數量上限,呼叫者在 PushTask 方法上的最大阻塞時間,預設為 60 秒。 如果超過這個時間後任務數量沒有空餘,PushTask 方法會丟擲TimeoutException。如果將該值設為0,當任務數量無法得到滿足時,PushTask 方法會立即丟擲 TimeoutException。如果您希望 PushTask 方法一直阻塞直到任務數量得到滿足,可將該值設為負數。 |
MaxIoWorkerNum | Int64 | 單個 taskPool 能併發的最多groutine的數量,預設為50,該引數使用者可以根據自己實際伺服器的效能去配置。 |
MaxRetryTimes | Int | 如果某個 task 首次執行失敗,能夠對其重試的次數,預設為 10 次。 如果 retries 小於等於 0,該 ProducerBatch 首次傳送失敗後將直接進入失敗佇列。 |
MaxReservedAttempts | Int | 每個 task 每次被嘗試執行都對應著一個 Attemp,此引數用來控制返回給使用者的 attempt 個數,預設只保留最近的 11 次 attempt 資訊。 該引數越大能讓您追溯更多的資訊,但同時也會消耗更多的記憶體。 |
BaseRetryBackOffMs | Int64 | 首次重試的退避時間,預設為 100 毫秒。 taskPool 取樣指數退避演算法,第 N 次重試的計劃等待時間為 baseRetryBackOffMs * 2^(N-1)。 |
MaxRetryBackOffMs | Int64 | 重試的最大退避時間,預設為 50 秒。 |
問題反饋
如果您在使用過程中遇到了問題,可以建立 GitHub Issue。
本作品採用《CC 協議》,轉載必須註明作者和本文連結