标准答案
- 队列满时应阻塞、拒绝或转入可靠存储,避免内存无限增长。
- worker 监听 ctx.Done 和任务 channel,任务完成后释放资源并报告错误。
- 关闭先停止生产,再等待任务按策略完成或取消,最后关闭结果和错误通道。
- 任务要有 ID、超时、幂等和失败重试边界。
题目解析
worker pool 用有限 worker 和任务 channel 控制执行资源,队列满时要阻塞、拒绝或转可靠存储。它不提供进程崩溃恢复、消息保留或数据库事务。
关闭协议通常先停止生产,再等待任务按策略完成/取消,最后关闭结果和错误通道。worker 必须监听 context,并在所有路径释放连接、锁和执行槽。
pool 大小要按任务是 CPU 还是 I/O、下游连接、任务耗时和 deadline 选择。任务还需要 ID、幂等、重试和失败状态,不能只看 goroutine 是否退出。
常见误区
- 误区:关闭生产 channel 后仍有发送者。改正:由唯一 owner 关闭,先协调所有生产者停止再 close。
- 误区:worker 错误无人接收。改正:错误 channel 要有消费者或使用 errgroup,避免失败路径阻塞。
- 误区:pool 大小只按 CPU 设置。改正:结合 I/O、连接池、下游配额和任务 deadline 建模。