RabbitMQ常见面试题

 1.我看你项目中使用了RabbitMQ,说一说它的核心组件和工作原理?

RabbitMQ可以分为三大部分,生产者和消费者以及中间的消息服务器,生产者和消费者都与服务器建立TCP长连接进行通讯,通过虚拟通道channel进行消息传递,消息服务器又可以创建多个虚拟主机,每个虚拟机里面又有很多交换机,生产者的消息都是直接发送到交换机的,然后交换机再跟队列进行绑定,通过不同的RoutingKey进行消息分发,然后再由消费者进行消费。每个交换机可以绑定多个队列,每个消费者也可以监听多个队列。

交换机也分为以下几种:

1.Fanout Exchange(扇出交换机) 投递到所有绑定的队列,不需要规则,不需要匹配,相当于广播、群发;

2.Direct Exchange(直接交换机) 根据路由键精确匹配进行路由消息队列;

3.Topic Exchange(主题交换机) 通配符匹配,相当于模糊匹配;

#匹配多个单词,*匹配一个单词,用.隔开的为一个单词:

4.Headers Exchange(头部交换机) 基于消息内容中的headers属性进行匹配;

2.我看你项目中使用了RabbitMQ,你项目中是如何保证消息可靠投递不丢失的? 

需要保证一下4点:

① 代表消息从生产者发送到Exchange;

② 代表消息从Exchange路由到Queue;

③ 代表消息在Queue中存储;

④ 代表消费者监听Queue并消费消息;


① 代表消息从生产者发送到Exchange;

方案:开启Confirm确认模式; 消息未投递成功,采取补偿措施,或是记录日志,或是发送通知让负责人知道;不管是否成功都会调用覆盖的confirm方法

② 代表消息从Exchange路由到Queue;

方案:开启Return返回模式; 消息未投递成功,采取补偿措施,或是记录日志,或是发送通知让负责人知道;只有失败才触发

③ 代表消息在Queue中存储;

方案: 1、交换机持久化(默认开启) 2、队列持久化(默认开启) 3、消息持久化 4、集群高可用部署(rabbitmq镜像模式)

④ 代表消费者监听Queue并消费消息;

方案: 手动确认消息  业务执行完,可以手动确认,失败可以重试几次,然后计入日志或者放入私信队列,也可以拒绝消息,放入死信队列

3.RabbitMQ如何保证消息的幂等性?

幂等性:多次操作,重复操作,对系统不会造成影响; 比如:消息重复发送两次或多次,消息重复消费两次或多次;

保证MQ的幂等性,只要保证消费者不会重复消费相同的消息即可;

方案: 生产者发送消息时,为每条消息设置一个全局唯一的id; 消费者消费消息时,使用redis的setnx命令:SET id 1 NX,若返回OK,说明该消息之前没有消费过,正常消费;若返回nil,说明该消息之前已消费过,那就不用处理; 

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

 死信队列即DLX,全称为Dead-Letter-Exchange,翻译为:死信交换机。当一个消息在队列中变成死信 (dead message) 之后,它能被重新发送到另外一个交换机中,这个交换机就是DLX,绑定到DLX的队列就称为死信队列;

死信队列本身也是一个普通的消息队列,可以通过设置一些参数将其设置为死信队列;

死信队列是一个用于存放无法被消费的消息的队列,这些消息被称为死信,死信队列可以避免消息一直被消费却无法消费成功的情况;

RabbitMQ导致死信的几种原因:

1、消息被拒 Basic.Nack(拒绝确认) 且 requeue = false (不重新入队)Basic.Reject(拒绝接收) 且 requeue = false

2、消息 TTL 过期;(发送消息的时候设置或者给队列统一设置)

3、队列达到最大长度,即队列满了;(老消息进入死信交换机,新消息继续入队)

5.什么是延迟队列?RabbitMQ 如何实现延迟队列? 

延迟队列是用来存放“延迟消息”的队列; 所谓“延迟消息”是指消息被发送到队列以后,并不想让消费者立刻拿到消息,而是等待指定的时间后,消费者才能拿到这个消息; 

RabbitMQ 本身是没有直接可以使用的延迟队列; 要实现延迟队列,一般有两种方式:

①使用TTL消息过期 + DLX死信队列来实现;

②使用使用 rabbitmq-delayed-message-exchange 延迟插件来实现;

6.RabbitMQ的高可用机制有了解嘛?

RabbitMQ有三种模式:

1)单机模式

2)普通集群模式

搭建三个节点,两两相互复制,只会复制消息内容的元数据即消息在哪个位置,不会复制消息内容,缺点就是一台宕机,会导致消息丢失,不是高可用的,优点是性能好

3)镜像集群模式 (高可用) 

搭建三个节点,两两相互全部复制,一台宕机,也不会导致消息丢失,优点高可用,安全

缺点,性能比较差

7.如果有百万消息堆积在MQ中,如何解决? 

原因:生产和消费失衡;

解决:

1、提前预防;

流量预估,预估每秒产生的消息数量;

做好压测,压测系统的消费能力;

做好预案,准备好可能发生的超出预估的突发情况;

2、应急处理;

①消费端 临时增加消费者数量:增加更多的消费者实例、增加消费者线程数量; 临时增加消费者把消息写入其他设备,后续处理;

②生产端 可以适当限流,降低消息发送速度;

3、事后优化; 

优化消费端业务处理逻辑,提升业务执行效率,减少io操作,减少数据库操作,减少网络连接,业务异步处理等;

8.如何解决RabbitMQ中因为消息堆积而导致的消息过期失效的问题? 

消息堆积,导致消息大量存储在消息队列中得不到消费,而消息又设置了TTL过期时间,当到达过期时间时,消息被过期丢弃;

解决:

1、让消息不要被堆积;

2、不设置TTL过期时间或者增加过期时间时长;

3、设置死信队列

4、编写临时程序补发消息; 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青山猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值