MQ面试题

①什么是MQ?为什么要使用MQ?

答:MQ是一个存放消息的先进先出的队列,主要用于消息传递或者通信。MQ的三大特点:

①异步调用,将同步操作转换为异步操作,提高系统的响应速度。例子:像一个用户访问订单业务,如果是同步的话,需要等待系统在数据库中更新完数据再返回结果回来,然后再把成功的结果返回给用户。如果用MQ的话用户访问完订单业务就不需要等待数据库的结果,直接把结果返回给用户,然后通过消息队列异步去操作数据库。

②服务解耦,像订单成功之后,通知物流系统去准备发货,那如果物流系统突然宕机,导致整个业务无法运行下去,使用MQ就可以解决这些服务之间的问题,用MQ去发送通知给物流系统,就算物流系统宕机,消息任存在MQ中,降低了服务之间的耦合度。

③流量削峰,像一个系统如果最多能处理1w条请求,但是在高峰期突然来了2w条请求,系统处理不了的话就会直接宕机,此时就可以通过MQ去把一部分的请求去放进队列中,分散成一段时间去执行,就实现了流量削峰的效果。

②RabbitMQ中的交换机类型?

答:①Fanout Exchange:扇出交换机,将消息以广播形式发送到绑定的队列中。

②Direct Exchange:直连交换机,通过匹配BingdingKey去发送到指定队列中

③Topic Exchange:主题交换机,跟直连交换机类似,也是通过BingdingKey进行匹配分发的,区别在于Topic Exchange一般使用以·分为多个部分,并且可以使用通配符进行分发消息。

④Header Exchange:头部交换机,匹配AMQP消息的header进行消息的分发,跟Direct Exchange完全一致,但是性能太差,现在已经淘汰了。

③RabbitMQ中如何保证消息的可靠性?

答:首先RabbitMQ的消息传递过程中有三种情况下会存在消息丢失的问题。①生产者(Publisher)把消息发送到RabbitMQ Server的过程中消息的丢失。

解决思路:Confirm消息确认机制,发送消息后等待服务器的确认信号,返回的如果是ack即代表成功接收,如果是nack即代表失败,此时生产者会重新发送消息。

②RabbitMQ Server收到消息之后服务器宕机消息丢失。

解决思路:消息持久化到磁盘上,服务器宕机重启也不会丢失消息

③RabbitMQ Server与消费者(Consumer)之间消息丢失。这里就包括了消费者拉取消息过程丢失和拿到之后消费者自身出现了问题导致消息消费失败。

解决思路:ACK事务机制确保消息正常消费。当消费者正确消费消息后,发送确认信号ACK给RabbitMQ服务器,告知消息可以移除。

④RabbitMQ幂等性如何解决?

答:幂等性问题呢也会出现在两种情况下,第一个是生产者发送消息给服务器,服务器也成功接收到消息,但是发送ack的问题出现了问题导致失败,会导致生产者再次发送一条相同的消息给服务器。第二个就是消费者消费完消息后发送的ACK确认信号过程中失败,导致消息会二次甚至多次消费。

第一种方式:数据库唯一键约束

第二种方式:乐观锁,发送消息的时候带上版本号

第三种方式:全局ID,redis的setnx

⑤如何解决消息堆积问题?

答:①出现消息堆积问题一般是生产者生产消息的速度远大于消费者消费消息的速度。此时可以通过优化程序或者说集群消费去处理去加快消费者消费消息的能力。

②如果说是因为消费者拒绝消费或者说消费者出现故障,此时就可以把消息放到死信队列中,不去阻塞主队列的正常运行。

③还有可能是队列的容量不够,这个的解决方式就是去扩容。

⑥讲一讲延迟队列?

第一种方案:死信交换机+TTL

通过一组交换机和队列设置TTL,当消息在队列中时间到了,过期就会变成死信,然后再通过队列绑定的死信交换机去传送到死信队列中,消费者从死信队列中拿到消息就实现了延迟消息。

第二种方案:延迟消息插件

第一步:加delay参数

第二步:发送消息

取消超时订单思路:

①技术选型:首先使用RabbitMQ的插件

②思路选型:如果是直接设置为15分钟后去判断订单有没有支付的话,在高并发情况下会堆积大量的消息,对MQ的压力很大,所以根据实际的场景大部分人可能下单之后很快就完成了支付,如果消息还一直存在MQ中等15分钟后去查一下就没必要了,所以我们可以把15分钟拆分为许多个时间段。可以说先设置几个10秒的,因为这几个十秒内大部分的订单都完成了支付,消息就可以直接被消费掉,然后可能剩下来为数不多的消息就适当增加延迟时间。

相关推荐
来一杯龙舌兰7 小时前
【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结
分布式·rabbitmq·ruby·持久化·ack·消息确认
Allen Bright17 小时前
Spring Boot 整合 RabbitMQ:从入门到实践
spring boot·rabbitmq·java-rabbitmq
bug_null1 天前
RabbitMQ消息可靠性保证机制7--可靠性分析-rabbitmq_tracing插件
分布式·rabbitmq
kingbal1 天前
RabbitMQ:添加virtualHost
分布式·rabbitmq
04Koi.1 天前
Java项目--仿RabbitMQ的消息队列--虚拟主机设计
分布式·rabbitmq
04Koi.2 天前
Java项目--仿RabbitMQ的消息队列--网络通信协议设计
分布式·rabbitmq
大饼酥2 天前
保姆级教程Docker部署RabbitMQ镜像
docker·容器·rabbitmq
Code apprenticeship2 天前
RabbitMQ如何实现延时队列?
分布式·rabbitmq
04Koi.2 天前
Java项目--仿RabbitMQ的消息队列--消息持久化
分布式·rabbitmq
一名技术极客2 天前
RabbitMQ实现网络分区
网络·分布式·rabbitmq