标准答案

  1. 生产者、队列和消费者之间应定义最大在途数量、队列容量或令牌,超过容量时阻塞、降级或拒绝。
  2. 背压可以通过有界队列、流式读取、窗口确认、限流和消费者反馈实现。
  3. 对过期数据或低价值任务可丢弃或合并,但核心任务应转入可靠持久化而不是静默丢失。
  4. 监控队列长度、最老任务年龄、内存、生产速率和消费速率,确认背压确实传回了入口。

题目解析

背压的目的不是让生产者永远等待,而是让入口感知消费者的实际处理能力。没有背压时,生产者速度和消费者速度的差额会持续转化为内存、连接和任务年龄。

背压点可以是有界队列、并发信号量、流式窗口、消息确认或入口限流。每个点都要定义满载行为,避免一层阻塞后另一层继续无界缓存。

核心任务和低价值任务的处理方式不同。低价值数据可以合并、丢弃或返回旧值,核心任务要转入可靠存储并保留可恢复状态,不能把两者都叫“削峰”。

常见误区

  • 误区:用内存队列吸收所有流量。改正:设置有界容量,必要时把需要恢复的任务转入持久化队列。
  • 误区:只增加消费者,不观察下游瓶颈。改正:消费者增加可能把压力推给数据库或远端服务,应先确认最窄瓶颈和总并发预算。
  • 误区:把拒绝和丢弃混为一谈。改正:拒绝要反馈给调用方,丢弃只能用于明确允许丢失且有业务规则的低价值工作。

作者信息