01
Worker Pool 任务队列
- 业务例子
- HTTP 请求进入后台任务系统后,把图片处理、批量计算、消息发送等任务写入 jobs channel,由固定数量的 worker goroutine 消费。
- 为什么适合
- 有缓冲 Channel 可以暂存短时间突发任务,同时 worker 数量限制了真实并发度,天然形成一个有限队列。
- 注意
- 缓冲区不能无限放大。长期生产速度大于消费速度时,应该限流、拒绝、降级或扩容消费者,而不是只加大 cap。
Channel 不是为了替代所有共享内存,而是用来表达 goroutine 之间的数据交接、任务排队和完成信号。面试时要能说出:什么场景需要无缓冲,什么场景更适合有缓冲。
例如我做一个批处理 Worker Pool,会创建有缓冲 jobs Channel 做有限任务队列,用固定数量 goroutine 消费;如果是必须确认接收方已经接手的同步信号,我会选无缓冲 Channel。Channel 的选择本质看是否需要同步交接,以及是否允许生产者和消费者存在短暂速度差。