写点什么

为 Go 开发者量身打造的分布式任务,异步任务变得如此简单

作者:vison
  • 2025-07-31
    广东
  • 本文字数:1590 字

    阅读完需:约 5 分钟

Go 后台任务的“坑”,你踩过几个?

在 Go 应用开发中,总有一些任务不适合现场完成,比如:


  • 发邮件/发短信:用户点击按钮后,还要干等?体验太糟糕!

  • 大计算量任务:生成报表、数据分析,CPU 一直被占,其他请求全卡住?

  • 定时任务:凌晨跑统计、每小时同步数据,难道要写个死循环 time.Sleep


所以,聪明的我们会把这些任务扔进异步任务队列,让后台“工人”(Worker)慢慢处理。


听起来很美好,但一上手,你可能会遇到这些坑:


  • Goroutine 爆炸:任务一多,疯狂 go func(),成千上万 Goroutine 难以管理,调度压力山大。

  • 任务失败怎么办:网络抖动、服务挂了,任务就这么丢了?必须要有重试机制

  • 任务优先级混乱:支付通知和日志记录能一个待遇?当然不能!

  • 代码越来越乱:定义任务、序列化、注册处理器……业务逻辑和队列代码搅在一起,维护起来想哭。


如果你有以上任何一个痛点,恭喜,sasynq 就是为你准备的“解药”!


<br>

sasynq 是啥?为什么它能救你?

sasynq 是基于 asynq超级易用封装,asynq 是一个稳定、高效、基于 Redis 的分布式任务队列,而 sasynq 则把它变得更简单、更丝滑。


它的优势在哪里?


开箱即用:支持 Redis Cluster 和 Sentinel,告别单点故障。✅ 功能全面:优先级队列、延迟任务、去重、取消、定时任务统统支持。✅ 安全可靠:重试、超时、截止时间(Deadline),任务再也不怕丢。✅ API 超简洁:相比原生 asynq,写起来更优雅、更清晰。


一句话,它把复杂的事,变得非常简单


<br>

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

① 定义任务

sasynq 让任务定义变得非常轻松。


// example/common/task.goconst 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)
复制代码


一句代码取消任务。


<br>

总结:为什么选 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

用户头像

vison

关注

还未添加个人签名 2019-06-29 加入

还未添加个人简介

评论

发布
暂无评论
为 Go 开发者量身打造的分布式任务,异步任务变得如此简单_Go_vison_InfoQ写作社区