Stories

Detail Return Return

三步搞定 Go 分佈式任務!sasynq 庫讓異步任務變得如此簡單 - Stories Detail

Go 後台任務的“坑”,你踩過幾個?

在 Go 應用開發中,總有一些任務不適合現場完成,比如:

  • 發郵件/發短信:用户點擊按鈕後,還要乾等?體驗太糟糕!
  • 大計算量任務:生成報表、數據分析,CPU 一直被佔,其他請求全卡住?
  • 定時任務:凌晨跑統計、每小時同步數據,難道要寫個死循環 time.Sleep

所以,聰明的我們會把這些任務扔進異步任務隊列,讓後台“工人”(Worker)慢慢處理。

聽起來很美好,但一上手,你可能會遇到這些坑:

  • Goroutine 爆炸:任務一多,瘋狂 go func(),成千上萬 Goroutine 難以管理,調度壓力山大。
  • 任務失敗怎麼辦:網絡抖動、服務掛了,任務就這麼丟了?必須要有重試機制
  • 任務優先級混亂:支付通知和日誌記錄能一個待遇?當然不能!
  • 代碼越來越亂:定義任務、序列化、註冊處理器……業務邏輯和隊列代碼攪在一起,維護起來想哭。

如果你有以上任何一個痛點,恭喜,sasynq 就是為你準備的“解藥”!


sasynq 是啥?為什麼它能救你?

sasynq 是基於 asynq 的超級易用封裝,asynq 是一個穩定、高效、基於 Redis 的分佈式任務隊列,而 sasynq 則把它變得更簡單、更絲滑。

它的優勢在哪裏?

開箱即用:支持 Redis Cluster 和 Sentinel,告別單點故障。
功能全面:優先級隊列、延遲任務、去重、取消、定時任務統統支持。
安全可靠:重試、超時、截止時間(Deadline),任務再也不怕丟。
API 超簡潔:相比原生 asynq,寫起來更優雅、更清晰。

一句話,它把複雜的事,變得非常簡單


sasynq 有多好用?直接上代碼!

① 定義任務

sasynq 讓任務定義變得非常輕鬆。

// example/common/task.go
const TypeEmailSend = "email:send"

// 任務數據
type EmailPayload struct {
    UserID  int    `json:"user_id"`
    Message string `json:"message"`
}

// 任務處理器
func HandleEmailTask(ctx context.Context, p *EmailPayload) error {
    fmt.Printf("[Email] 用户 %d 郵件發送成功!\n", p.UserID)
    return nil
}

是不是很乾淨?直接定義 Payload 和處理器,再也不用手寫 json.Unmarshal

② 生產任務:簡單到極致

  1. 一次性任務生產者
payload := &common.EmailPayload{UserID: 101, Message: "重要任務!"}
_, _, err := client.EnqueueNow(common.TypeEmailSend, payload,
    sasynq.WithQueue("critical"),
    sasynq.WithRetry(3),
)

EnqueueNowEnqueueInEnqueueAt 一看就懂!通過 sasynq.WithXXX 鏈式調用配置隊列、重試、Deadline,直觀又優雅。

  1. 週期性任務生產者
payload := &common.EmailPayload{UserID: 102, Message: "週期性任務!"}
scheduler.RegisterTask("@every 1m", "request:url", &payload)

一句代碼,搞定定時任務。

③ 消費任務:一行註冊處理器,搞定!

srv := sasynq.NewServer(redisCfg, sasynq.DefaultServerConfig())

sasynq.RegisterTaskHandler(srv.Mux(), common.TypeEmailSend, sasynq.HandleFunc(common.HandleEmailTask))

srv.Run()

沒有多餘代碼,註冊 → 運行 → Done

取消任務

對於一次性未執行的任務

inspector.CancelTask(queue, taskID)

對於週期性任務

scheduler.Unregister(entryID)

一句代碼取消任務。


總結:為什麼選 sasynq

  • 更簡潔:API 設計極簡,代碼結構清晰。
  • 更強大:支持重試、去重、延遲、定時、優先級,場景全覆蓋。
  • 更安全:Deadline、超時、重試策略,任務處理更可控。

如果你在 Go 項目中想要一個簡單、高效、功能全面的異步任務解決方案,sasynq 就是最佳選擇。


sasynq 地址:github.com/go-dev-frame/sponge/pkg/sasynq

sasynq 是 Sponge 框架的一個子組件,Sponge 是一個強大且易用的 Go 開發框架,其核心理念是 定義即代碼 (Definition is Code),幫助開發者以"低代碼"方式輕鬆構建穩定可靠的高性能後端服務(包括 RESTful API、gRPC、HTTP+gRPC、gRPC Gateway 等)。

👉 Sponge 項目地址
https://github.com/go-dev-frame/sponge

user avatar chengxuyuanlaoliu2024 Avatar crossoverjie Avatar jiarenxia Avatar yejianfeixue Avatar libubai Avatar hnclou Avatar jinshideshizi Avatar codechen8848 Avatar hunterxiong Avatar
Favorites 9 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.