概述
预取是控制消费者吞吐与内存的主要旋钮。让它与工作线程数挂钩,要求手动确认,并依据实测延迟而非直觉来调优。
关键步骤
- 以并发工作数乘以一个小系数作为预取的起点。
- 使用手动确认,确保处理完成前不确认。
- 测量端到端延迟与积压后小步调整预取。
- 为单条消息设置处理超时以发现卡住的处理函数。
验证
- 在途消息数保持在预取上限附近。
- 杀掉工作进程会重新投递未确认消息。
- 吞吐随预取上升至平台后不再增长。
- 卡住的处理函数被超时发现。
注意事项
- 预取以延迟换吞吐,实时路径应取更小值。
- 它只管理客户端缓冲,代理侧流控仍需单独调优。
适用范围
本条目围绕「调优消费者预取以兼顾吞吐与公平」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
建议在正式环境落地前先在预发或隔离环境演练一遍,把关键观测指标与负责人一并记录,确保出现异常时能快速定位并恢复。
channel.prefetch(workers * 2);
await channel.consume(queue, async (msg) => {
try { await handle(msg); channel.ack(msg); }
catch { channel.nack(msg, false, false); }
}, { noAck: false });