标准答案
- 队列满时生产者等待或得到背压,队列空时消费者等待;条件判断应在循环中重新检查。
- 关闭时先禁止新任务,再按策略处理队列中任务,等待消费者退出并释放资源。
- 消费者异常要记录任务、重试或转移到失败队列,不能让工作线程静默退出导致积压。
- 任务应有唯一标识和状态,支持超时、取消和优雅停机。
题目解析
生产者消费者模型要同时定义空、满、关闭和异常四类边界。等待条件必须在循环中重新检查,因为被唤醒时状态可能已被其他执行者改变。
优雅关闭通常先停止接收新任务,再决定是否排空已有任务、转移到持久化队列或取消低价值工作;消费者退出前要释放连接、线程和信号量。
进程内队列只能协调当前进程,不能单独提供崩溃恢复、重复处理和审计。需要可靠执行时,还要保存任务 ID、状态、重试和失败原因。
常见误区
- 误区:先读取 size 再单独取任务。改正:使用队列提供的原子 take/put 操作,不能把检查和消费拆开。
- 误区:关闭时直接丢弃全部队列。改正:根据任务价值选择排空、转存、重试或明确丢弃,并让调用方知道结果。
- 误区:消费者异常没有告警和补偿。改正:记录任务状态和异常,设置重试、死信或人工处理路径,不能让线程静默退出。