Java面试题-RabbitMQ消息队列

发布于:2025-02-12 ⋅ 阅读:(54) ⋅ 点赞:(0)

1.RabbitMQ的五种消费模式

分别是,简单,工作队列,发布/订阅,路由,主题模式。

1.简单模式

消息发送到一个队列,然后这个队列绑定了一个消费者进行处理。

CleanShot 2025-02-07 at 12.42.26@2x

2.工作队列模式

消息发送到一个队列,然后这个队列绑定了多个消费者进行并发的处理。

CleanShot 2025-02-07 at 12.48.52@2x

3.发布/订阅模式

消息发送到交换机,由交换机广播到多个队列。

CleanShot 2025-02-07 at 12.52.17@2x

4.路由模式

消息发送到交换机,由交换机路由到具体的队列。

CleanShot 2025-02-07 at 12.53.41@2x

5.主题模式

就是一种更加灵活的路由模式,支持通配符。

CleanShot 2025-02-07 at 12.54.21@2x

2.延迟消息怎么实现?

1.死信交换机

首先给队列绑定一个死信交换机和死信队列,然后发送一个带过期时间的消息,一旦过期就会成为死信,然后交给死信队列的消费者去消费。

消息成为死信的常见原因:

  1. 消息过期了
  2. 消费者达到最大重试次数
  3. 队列已满
2.延迟消息插件

CleanShot 2024-07-31 at 12.38.05@2x

CleanShot 2024-07-31 at 12.38.57@2x

3.使用场景是什么?

CleanShot 2025-02-07 at 13.36.48@2x

3.RabbitMQ如何保证消息可靠性?

先说一下消息可能丢失的四个场景:

  1. 消息没有发送到交换机
  2. 交换机没有正确路由到队列
  3. 队列中的消息丢失
  4. 消费者消费失败

一个个来解决

对于消息没有发送到交换机的问题,可以配置一个Confirm Callback,失败了就重试两次。

对于交换机没有正确路由到队列的问题,可以配置一个Return Callback,不过一般没必要,因为一般路由失败都是业务问题。

对于队列中的消息丢失,可以使用消息持久化机制,使用lazyQueue即可,数据会持久化到磁盘,队列中只会保留最近的2048条消息,其实还有另一种持久化方式,不过因为在3.12版本之后默认使用的就是lazyQueue了,所以就没必要了。

对于消费者消费失败的问题,可以使用消费者重试机制,设置最大重试次数,一旦超过了,消息成为死信,可以配置一个死信队列去兜底。

4.如何防止RabbitMQ被重复消费

每条消息中可以携带一个唯一的消息ID,消费者在处理的时候可以使用一个SETNX命令去判断是否处理过,如果处理过就忽略。

5.RabbitMQ的事务机制有了解过吗?

了解过,事务是通过在通道上启用的,与事务相关的有三个方法:

CleanShot 2025-02-07 at 13.43.17@2x

我们可以先开启事务,然后就可以发送消息给MQ了,如果事务提交成功了,就说明消息一定到了MQ,如果出现了异常,就可以捕获异常,进行事务的回滚。