【消息队列】RabbitMQ 面试篇

🎗️ 主页:小夜时雨
🎗️专栏:消息队列
🎗️如何活着,是我找寻的方向

优雅

1. RabbitMQ 有哪些工作模式?

  1. work 工作模式(任务模型)
    区别于收发消息的简单模式,工作模式支持多个消费者绑定到一个队列中,共同去消费队列中的消息,处理消息的速度就会提高。

  2. 广播模式(Fanout 交换机)
    区别于work 模式, 多了一个交换机:只负责转发消息,不具有存储消息的能力。需要将队列与交换机进行绑定,将消息发送给所有绑定到交换机的队列

  3. 路由模式(direct 交换机)
    有的场景不需要发送给所有绑定的交换机,需要将不同的消息发送给不同的队列,路由模式就是绑定时候指定一个路由key,利用 key 将交换机和特定的队列进行绑定,那么发送方在发送消息到队列时也需要指定 key, 那么笑嘻就只会发送给特定 key的队列。

  4. 主题模式(topic 交换机)
    和路由模式一样,也需要指定一个路由key,只不过是多了通配符的支持。也就是路由 key 中可以有通配符,可以将消息发送给多个符合路由key通配符的队列

2. 如何保证消息不丢失(可靠性)

消息发送和接受涉及到三个角色:生产者,消费者和RabbitMQ 本身。

  1. 生产者:开启生产者确认机制,确保生产者的消息能到达队列,如果报错可以先记录到日志中,再去修复数据
  2. RabbitMQ 本身:开启持久化功能,确保消息未消费前在队列中不会丢失,其中的交换机、队列、和消息都要做持久化
  3. 消费者:开启消费者确认机制为auto,由spring确认消息处理成功后完成ack,当然也需要设置一定的重试次数,我们当时设置了3次,如果重试3次还没有收到消息,就将失败后的消息投递到异常交换机,交由人工处理。

3. 什么是死信队列,如何导致的?

当一个消息变成死信之后,就会被丢到一个特定的交换机中,这个交换机就是死信交换机,与死信交换机绑定的队列就是死信队列。

导致死信的原因:

  • 消息是一个过期消息,无人消费
  • 要投递的队列满了,无法投递,这个消息也会变成死信
  • 消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue参数设置为false

4. 什么是延迟队列,RabbitMQ 如何实现延迟队列的

延迟队列指的是存储对应的延迟消息,消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费

RabbitMQ 本身是没有延迟队列的,要实现延迟消息,一般有两种方式:

  1. 利用死信交换机和TTL(消息存活时间) 实现的。
    • 我们给发送消息的交换机绑定一个队列,但是不绑定消费者去消费消息,那么消息超时未消费就会变成死信。在RabbitMQ中如果消息成为死信。
    • 这个队列可以绑定一个死信交换机,在死信交换机上可以绑定其他队列,在我们发消息的时候可以按照需求指定TTL的时间,其他队列绑定好消费者去消费就可以了,这样就实现了延迟队列的功能了。(见下图更好理解)
      在这里插入图片描述
  2. 在RabbitMQ中安装一个死信插件,这样更方便一些,只需要在声明交互机的时候,指定这个就是死信交换机,然后在发送消息的时候直接指定超时时间就行了,相对于死信交换机+TTL要省略了一些步骤

后续我们会继续介绍一些 RabbitMQ 的常见问题。

🎗️🎗️🎗️ 好啦,有关 RabbitMQ 部分面试题的分享就到这里了,如果感觉做的还不错的话可以点个赞,关注一下,你的支持就是我继续下去的动力,我们下期再见,拜了个拜~ ☆*: .。. o(≧▽≦)o .。.:*☆

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值