RabbitMQ必问面试题

本文详细探讨了RabbitMQ如何确保数据可靠传输、其优缺点、实现高可用性的方法、避免重复消费的策略、保障消息顺序的技术手段,以及解决延时、过期失效和积压消息的方法,并提出了自建消息队列的设计思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


参考大佬的博客,点此跳转

1.RabbitMQ怎么保证数据可靠性传输?

开启comfirm,生产端发送消息到消息队列后,如果mq成功收到,返回ack确认信息,生产端收到确认信息就认为发送成功,否则就会再次尝试发送。
mq收到消息后,将消息持久化到磁盘。
mq发送消息到消费端后,如果消费端成功收到也会返回确认信息(这里应该关掉自动ack,改用程序员手动ack确保消费成功后再发送确认消息)。这样保证了数据的可靠性传输。
为了避免mq在持久化前出现数据丢失,将mq收到信息后的确认信息放在成功持久化后发送给生产端,当持久化前数据丢失时,生产端会再次发送。

2.RabbitMQ的优点和缺点是什么?

优点很明显,解耦,异步,削峰。
缺点:
复杂化系统。原本客户端和服务端直接一一对应结构也相当简单,但是现在加了一个消息队列的话,增加了系统的复杂度。
增加系统的风险。如果消息队列挂了的话,那么整个系统直接崩溃。
一致性问题。没有在消费端写成功。

3.怎么保证消息队列的高可用性?

RabbitMQ的镜像集群模式可以体现消息队列的高可用性。每次创建队列的时候,他都会创建多个实例,就算一台机器宕机,数据也不会丢失。

4.怎么避免重复消费的情况?

如果直接写数据库的话需要查询确认下,是否数据已经在数据库中。如果写redis的话,不会出现重复消费的情况,因为redis天然幂等。

5.怎么保证消息的顺序?

将队列拆分,每个消费者对应一个队列。

6.如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?

积压消息:检查消费者是否故障,修复消费速度,队列扩容,增加消费者。
延时过期失效导致数据丢失:修复消费者的消费速度,并将丢失的数据手动批量导入。
队列满了怎么办:修复消费速度。设置过期失效,如果造成数据丢失,那么批量导入丢失的数据。

7.如果让你自己写一个消息队列,你怎么设计架构?

具有吞吐量伸缩性。在必要时可以方便的扩容,每个partition放在一台机器上,当需要扩容时增加机器。(参考了kafka,broker->topic->partition)
高可用性。采用分布式多副本,当leader宕机,通过选举重新产生leader对外服务。
数据可靠性。队列消息要落地磁盘持久化。队列同时创建多副本,保证数据0丢失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值