diff --git a/05-system-design/mq/RabbitMQ.md b/05-system-design/mq/RabbitMQ.md index 29d79763..2e191a8c 100644 --- a/05-system-design/mq/RabbitMQ.md +++ b/05-system-design/mq/RabbitMQ.md @@ -90,6 +90,33 @@ Spring Boot配置 spring.rabbitmq.password=admin +## 面试补充:RabbitMQ 可靠性治理 + +RabbitMQ 面试题建议按“交换机路由、消息确认、失败重试、死信隔离”来回答。 + +### 交换机选择 + +- Direct:按 routing key 精确匹配,适合点对点路由。 +- Topic:按通配符匹配 routing key,适合按业务主题分发。 +- Fanout:广播到绑定的所有队列,适合通知类场景。 +- Headers:按消息头匹配,使用较少,规则更灵活但维护成本更高。 + +### 生产端可靠性 + +生产端要关注消息是否成功到达 Broker 和交换机。常见做法是开启 publisher confirm,发送失败时记录日志并重试;如果路由不到队列,还要配合 return callback 或 mandatory 参数发现不可路由消息。 + +### 消费端确认 + +消费端建议业务处理成功后再 ack。处理失败时可以 nack/reject,并决定是否重新入队。对于永久失败的消息,不应无限重试阻塞主队列,而应进入死信队列。 + +### 死信队列 + +死信队列用于隔离多次重试失败、过期、被拒绝或队列长度超限的消息。它的价值是保留问题现场,避免毒消息反复阻塞主链路,并支持人工修复后补偿重放。 + +### 重试策略 + +重试要区分临时错误和永久错误。网络抖动、下游短暂不可用可以延迟重试;参数错误、格式错误、业务状态非法应快速进入死信。所有消费逻辑都必须幂等,避免重试造成重复扣减、重复发券或重复通知。 + ---