Asynq:基于 Redis 的 Go 分布式任务队列

Asynq 是一个 Go 语言编写的分布式任务队列库,基于 Redis 实现任务的异步投递与消费。项目在 GitHub 上获得 13,470 个 Star,由 Ken Hibino 维护,采用 MIT 协议开源。

正文顶部截图

它的设计目标是在保持简洁的同时提供可靠的任务调度能力。开发者可以用它把耗时操作从主请求路径中剥离,交由后台 worker 异步处理,从而提升应用的响应速度,并降低请求超时的风险。

Asynq 的核心机制比较直接。客户端通过 Client 将任务推入 Redis 队列,服务端从队列中拉取任务并启动 goroutine 执行。多个 worker 可以并发处理任务,多个服务端实例也可以共同消费同一个队列,实现水平扩展。这种模型让任务队列成为跨机器分发工作的天然机制。

README区域截图

在特性层面,Asynq 支持任务至少一次执行、延迟调度、失败重试、任务去重、超时与截止期限、任务聚合。队列方面提供加权优先级队列和严格优先级队列两种模式。当 worker 崩溃时,未确认的任务会自动恢复并重新调度,避免任务丢失。它还支持 Redis Sentinel 自动故障转移,并内置 Prometheus 指标采集。

使用 Asynq 时,通常先定义任务类型和负载结构,再分别实现创建任务和处理任务的函数。客户端调用 Enqueue 将任务入队,可以附加 ProcessIn、ProcessAt、MaxRetry、Timeout、Unique 等选项。服务端通过 NewServer 创建,注册对应的 Handler,配置并发数和队列优先级后即可启动。ServeMux 的用法与 net/http 类似,便于按任务类型路由。

除了代码库本身,Asynq 还提供了 Asynqmon Web UI 和 asynq CLI 两个运维工具。Web UI 可以查看队列状态、任务列表和指标数据,CLI 则支持命令行方式检查和控制队列。

这个项目适合需要异步任务调度的 Go 后端服务,例如邮件发送、图片处理、数据导入、定时任务等场景。如果你的应用已经在使用 Redis,集成 Asynq 不需要额外引入消息中间件,部署成本较低。当前主版本号为 0.x,API 仍可能调整,正式使用前建议阅读官方文档并评估版本风险。

使用前建议阅读官方文档并评估版本风险。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐