RabbitMQ 面试
...大约 2 分钟
RabbitMQ 面试
【中等】RabbitMQ 怎么实现延迟队列?🌟
RabbitMQ 实现延迟队列主要有两种方式:
死信交换机(DLX)方案
- 原理:让消息先进入一个有过期时间(TTL) 的队列,消息过期后自动被转发到死信交换机,再路由到最终消费队列。
- 优点:稳定可靠,无需额外插件。
- 缺点:不灵活,需为不同延迟时间创建多个队列;定时不精确。
官方延迟插件方案(推荐)
- 原理:安装
rabbitmq_delayed_message_exchange
插件,使用一种特殊的交换机。发送消息时通过x-delay
参数为每条消息单独设置延迟时间。 - 优点:极其灵活,使用简单,延迟精度更高。
- 缺点:需安装插件;海量延迟消息可能对性能有压力。
选择建议
- 只需少数固定延迟时间 → 死信交换机方案。
- 需要灵活指定每条消息的延迟 → 官方延迟插件方案(首选)。
【中等】RabbitMQ 中无法路由的消息会去到哪里?🌟
在 RabbitMQ 中,无法路由的消息去向由生产者发送时的 mandatory
参数决定:
mandatory = false
(默认值):消息被 Broker 直接丢弃。mandatory = true
:消息通过ReturnCallback
机制返回给生产者进行处理。
重要提示:无法路由的消息不会自动进入死信队列(DLQ),因为死信队列用于处理已成功入队但后被拒绝或过期的消息。
【中等】RabbitMQ 中消息什么时候会进入死信交换机?🌟
RabbitMQ 中,消息会在以下三种情况下进入死信交换机(DLX):
- 被拒绝 (Rejected):消费者拒绝消息(
basic.reject
或basic.nack
)且不重新入队(requeue=false
)。 - 已过期 (Expired):消息的存活时间(TTL)到期。
- 队列满 (Overflowed):队列达到最大长度限制,最老的消息会被挤出。
核心前提:必须在声明原始队列时通过 x-dead-letter-exchange
参数预先配置好死信交换机。
参考资料
Powered by Waline v2.15.7