RabbitMQ 高频面试题及详细真实答案(实战向)_第1页
RabbitMQ 高频面试题及详细真实答案(实战向)_第2页
RabbitMQ 高频面试题及详细真实答案(实战向)_第3页
RabbitMQ 高频面试题及详细真实答案(实战向)_第4页
RabbitMQ 高频面试题及详细真实答案(实战向)_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

RabbitMQ高频面试题及详细真实答案(实战向)一、基础认知类面试题1、简单说下什么是RabbitMQ?它的核心作用是什么?RabbitMQ是一款开源的、基于AMQP协议的消息中间件,采用Erlang语言开发,主打高可用、高可靠、低延迟的特性。在项目中核心作用主要有四个:第一是解耦,系统之间通过消息交互,不用直接接口调用,新增、修改服务不会影响原有业务;第二是削峰填谷,应对秒杀、突发流量,把瞬时高并发请求转为消息队列异步处理,避免服务直接被打垮;第三是异步处理,非核心业务异步化,缩短主流程响应时间,提升接口性能;第四是流量分发、任务排队,实现任务的有序消费、负载均衡。2、RabbitMQ的核心组件有哪些?各自的作用是什么?核心组件分为六大核心部分,也是工作的完整链路:生产者(Producer):负责创建消息,将消息发送给交换机,是消息的发送方;消费者(Consumer):监听队列,主动拉取或被动接收消息并处理,是消息的处理方;交换机(Exchange):不存储消息,只负责路由转发。接收生产者消息,根据绑定规则分发到对应队列;队列(Queue):RabbitMQ唯一存储消息的载体,持久化消息、缓存消息,等待消费者消费;绑定(Binding):队列和交换机之间的关联关系,是路由的规则依据;虚拟主机(VirtualHost):类似数据库的库,一个MQ服务可以创建多个vhost,隔离不同项目、不同环境的交换机和队列,互不干扰。3、RabbitMQ有哪几种交换机类型?各自适用场景?常用四种交换机,工作规则完全不同:Direct(直连交换机)默认类型:精准匹配,路由键和队列绑定键完全一致才转发。适用于一对一、精准推送场景,比如订单状态通知、单点任务分发。Topic(主题交换机):模糊匹配,支持通配符*和#。可以实现多队列模糊订阅,适用于发布订阅、日志收集、多服务监听同一类消息的场景。Fanout(扇形交换机):无视路由键,绑定的所有队列都会收到消息。适用于一对多广播场景,比如系统公告、缓存刷新、多节点同步数据。Headers(头交换机):根据消息头部属性匹配路由,性能差、基本不用,日常开发几乎不会用到。二、消息可靠性核心面试题(重中之重)1、RabbitMQ如何保证消息不丢失?完整解决方案是什么?消息丢失分为三个阶段,需要分别做保障,也是生产环境的标准配置:第一:生产者发送阶段(防止消息没发到MQ就丢失)开启生产者确认机制(Confirm确认)。生产者发送消息后,MQ会返回ack确认,代表消息成功入库;如果返回nack或者超时未响应,生产者重试发送,保证消息不丢。第二:MQ服务端存储阶段(防止MQ宕机消息丢失)开启消息持久化和队列持久化。队列持久化是将队列元数据保存到磁盘,消息持久化是将消息主体写入磁盘,重启MQ后消息不会丢失。第三:消费者消费阶段(防止消息处理中丢失)关闭自动ack,开启手动ack机制。消费者成功处理完业务后,手动回复ack,MQ才会删除消息;如果程序异常、宕机,不会回复ack,消息会重新回到队列,等待下次消费。2、什么是消息确认机制?自动ACK和手动ACK的区别?ACK是消费者告知MQ消息是否处理完成的机制。自动ACK:MQ只要把消息推送给消费者,立刻标记消息删除。不管消费者业务是否执行成功、是否报错,消息都会丢失,生产环境基本不用,只适用于日志、统计等非核心业务。手动ACK:消费者处理完正常业务,手动调用ack确认,MQ删除消息;业务异常不ack,消息重回队列。可以保证消息一定被成功处理,核心业务必须使用手动ACK。3、消息重复消费怎么解决?重复消费是MQ的正常现象,不是BUG。网络超时、消费者处理完没来得及发ack、重试机制都会导致重复消费。解决方案主要两种:1、业务幂等性设计(主流方案)每条消息携带唯一消息ID,消费前先查询数据库/Redis是否已处理。如果已处理直接跳过,未处理则执行业务。不管消费多少次,结果一致。2、唯一键约束数据库新增、修改操作利用唯一索引,重复消息插入会报错,不会产生脏数据,适合订单、支付类业务。4、如何处理消息积压问题?消息积压本质是消费者消费速度跟不上生产者生产速度,实战解决步骤:1、临时扩容消费者:增加消费者实例数量,提高消费吞吐量,快速消化积压消息;2、优化消费逻辑:排查消费者代码是否有慢查询、循环阻塞、第三方接口超时等问题,优化单条消息处理速度;3、批量消费:开启批量拉取、批量处理,减少网络IO开销;4、死信兜底:长期处理失败的消息进入死信队列,避免正常队列被卡死;5、紧急场景可以临时分流,新建队列临时承接流量。三、死信队列、延迟队列面试题1、什么是死信队列?消息变成死信的场景有哪些?死信队列就是专门存放异常消息的兜底队列。正常队列中的消息无法被正常消费,会自动转发到绑定的死信交换机,最终进入死信队列,人工排查处理。三种死信产生场景:1、消息TTL过期,设置了过期时间的消息超时未消费;2、消费者主动拒绝消息,且不重回队列;3、队列达到最大长度,新消息无法入队,队首消息转为死信。2、RabbitMQ怎么实现延迟队列?适用场景?RabbitMQ本身没有原生延迟队列,生产标准实现方式:TTL过期+死信队列搭建逻辑:普通队列设置消息过期时间,消息到期未消费,自动转发到死信队列,消费者监听死信队列,实现延迟效果。适用场景:订单30分钟未支付自动取消、超时未评价提醒、定时重试任务、延时通知。补充:如果需要精准延时、多级延时,会使用rabbitmq-delayed-message-exchange插件实现。四、集群与高可用面试题1、RabbitMQ集群模式有哪些?区别是什么?主要两种集群模式:普通集群、镜像集群普通集群:只同步交换机、队列的元数据,消息只存在创建队列的节点上。其他节点访问消息需要转发,某个节点宕机,该节点未消费消息会丢失,可用性差,基本不用于生产。镜像集群(生产常用):队列和消息会同步到集群所有镜像节点。主节点宕机,从节点自动升级为主节点,消息不丢失,实现高可用。缺点是同步数据会消耗少量性能。2、什么是镜像队列?作用是什么?镜像队列是RabbitMQ高可用的核心配置,将一个队列配置为镜像模式后,队列的所有消息、状态会同步到集群中所有节点。作用:解决单节点故障问题,主节点故障,集群自动切换备用节点,服务不中断、消息不丢失,保障生产环境稳定性。五、实战踩坑与进阶面试题1、RabbitMQ消息为什么不建议设置无限重试?如果业务异常一直重试,消息会无限霸占队列,导致正常消息无法消费,造成队列积压、服务阻塞。正确做法:设置重试次数,超过指定次数后,消息投递到死信队列,人工排查问题,避免队列卡死。2、消费者宕机重启后,消息会怎么处理?如果开启手动ACK,消费者宕机时未ACK的消息,MQ会判定消息未消费成功,消息会重新回到队列。服务重启后,会重新消费这些消息,保证消息不丢失。3、RabbitMQ的优缺点?优点:可靠性高,支持持久化、确认机制、高可用集群;路由策略丰富,适配各种业务场景;消息延迟低,稳定性极强,适合金融、订单等核心业务;社区成熟,运维简单。缺点:吞吐量不如Kafka;Erlang语言小众,深度定制难度高;海量消息场景下性能偏弱,适合中高并发业务,不适合超大流量日志采集。4、RabbitMQ和Kafka的核心区别?项目中如何选型?核心区别RabbitMQ:主打可靠性、业务一致性,支持复杂路由、死信、延迟队列,消息不丢、不重复优先级更高,吞吐量中等。Kafka:主打高吞吐量、海量日志,性能极高,适合大数据、日志采集、流式处理,消息可靠性偏弱,业务场景简单。选型原则核心业务、订单、支付、通知、事务消息,必须保证消息可靠,选Rab

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论