go 任務池

qinhan發表於2020-02-21
  • 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 協議》,轉載必須註明作者和本文連結

相關文章