最近在重构老项目的异步任务模块,做了个简单的压测对比,来抛砖引玉聊聊选型。
业务场景主要是日均千万级的数据清洗和消息推送,带重试和延时需求。拿公司闲置的 8C16G 虚机做了个极限吞吐压测:
- Asynq (Redis 7.0): 消费端单节点跑满差不多 2.6w ops/s,Redis CPU 就直接干到 90%+ 了,大 payload 堆积时内存涨得肉眼可见地快。
- 自建 Worker Pool (ants 改造 + channel) + Kafka: 吞吐轻松拉到 9w+ ops/s,pprof 抓出来几乎全在系统调用和网络 I/O 上,goroutine 数量锁死在设定阈值,内存稳如老狗。
个人直给观点:
- 业务日活不高、需要复杂的定时/延时重试,且团队不想维护重型组件的,Asynq 确实爽,自带 Web UI,两小时就能上线搞定。
- 但凡数据量要上亿、吞吐要求高、或者 payload 偏大的场景,老老实实上 MQ + 自建 Worker Pool,别把 Redis 当真正的消息中间件硬造,后期运维和集群扩容成本全得吐出来。(至于 Machinery……个人感觉目前维护状态有点一言难尽)
大家生产环境怎么选的?一般业务量膨胀到什么规模(QPS / 数据量),你们才会决定从 Asynq 这类方案切到 MQ?