MQ面试题

MQ面试题

1、MQ有哪些使用场景?(高频)

异步处理:用户注册后,发送注册邮件和注册短信。用户注册完成后,提交任务到 MQ,发送模块并行获取 MQ 中的任务。

系统解耦:比如用注册完成,再加一个发送微信通知。只需要新增发送微信消息模块,从 MQ 中读取任务,发送消息即可。无需改动注册模块的代码,这样注册模块与发送模块通过 MQ 解耦。

流量削峰:秒杀和抢购等场景经常使用 MQ 进行流量削峰。活动开始时流量暴增,用户的请求写入MQ,超过 MQ 最大长度丢弃请求,业务系统接收 MQ 中的消息进行处理,达到流量削峰、保证系统可用性的目的。

日志处理:日志采集方收集日志写入 kafka 的消息队列中,处理方订阅并消费 kafka 队列中的日志数据。

消息通讯:点对点或者订阅发布模式,通过消息进行通讯。如微信的消息发送与接收、聊天室等。

2、简单介绍一些Rabbitmq的架构?(高频)

架构如下所示:

在这里插入图片描述

消息的发送消息流程:

1、生产者和Rabbitmq服务端建立连接,然后获取通道

2、生产者发送消息发送给指定的虚拟机中的交换机

3、交换机根据消息的routingKey将消息转发给指定的队列

消费者消费消息流程:

1、消费者和Rabbitmq服务端建立连接,然后获取通道

2、消费者监听指定的队列

3、一旦队列有消息了此时就会把消息推送给指定的消费者

3、Rabbitmq中交换机的类型有哪些?(高频)

主要有以下4种:

fanout: 把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。

direct:把消息路由到BindingKey和RoutingKey完全匹配的队列中。

topic: 匹配规则:

​ RoutingKey 为一个 点号’.': 分隔的字符串。比如: java.xiaoka.show

​ BindingKey和RoutingKey一样也是点号“.“分隔的字符串。

​ BindingKey可使用 * 和 # 用于做模糊匹配,*匹配一个单词,#匹配多个或者0个

headers:不依赖路由键匹配规则路由消息。是根据发送消息内容中的headers属性进行匹配。性能差,基本用不到。

4、如何保证消息不被重复消费?(高频)

消息重复消费的原因:

1、生产者发送消息的时候,在指定的时间只能没有得到服务端的反馈,此时触发了重试机制,在Rabbitmq服务端就会出现重复消费,那么消费者在进行消费的时候就出现了重复消费。

2、消费者消费完毕以后,消费方给MQ确认已消费的反馈,MQ 没有成功接受。该消息就不会从Rabbitmq删除掉,那么消费者再一次获取到了消息进行消费。

MQ是无法保证消息不被重复消费的,只能业务系统层面考虑。不被重复消费的问题,就被转化为消息消费的幂等性的问题。幂等性就是指一次和多次请求的结果一致,多次请求不会产生副作用。

保证消息消费的幂等性可以考虑下面的方式:

① 给消息生成全局 id,结合Redis进行实现

② 给数据库的某一个字段设置一个唯一的索引

5、如何保证消息不丢失?(高频)

消息丢失的发送的时机:

1、生产者发送消息的时候,由于网络抖动导致消息没有发送成功

2、消息发送到Rabbitmq的以后,Rabbitmq宕机了

3、消费者获取到MQ中的消息以后,还没有及时处理,此时消费者宕机了

解决方案:

1、生产者发送消息:主流的MQ都有确认机制或事务机制,可以保证生产者将消息送达到 MQ。如 RabbitMQ 就有事务模式和 confirm模式。

2、MQ 丢失消息:开启 MQ 的持久化配置(消息、队列都需要进行持久化),并且构建集群。

3、消费者丢失消息:改为手动确认模式,消费者成功消费消息再确认。

6、如何保证消息的顺序性?(高频)

Rabbtimq:

1、将多个消息发送到一个队列中,队列本身就是先进先出的结构

2、避免多消费者并发消费同一个 queue 中的消息。

Kafka:

1、将多个消息发送到一个分区中,kafka可以保证一个分区中的消息的有序性

2、避免多消费者并发消费同一个分区中的消息。

7、消息大量积压怎么解决?(高频)

解决方案:

1、针对Rabbitmq可以使用惰性队列,让消息直接存储到磁盘中

2、增加消费者的数量,提升消费者的消费能力

8、导致的死信的几种原因?(高频)

1、消息被拒(Basic.Reject /Basic.Nack) 且 requeue = false。

2、消息TTL过期。

3、队列满了,无法再添加。

9、什么是延迟队列以及具体的应用场景?(高频)

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

应用场景:订单超时未支付,文章的延迟发送

列满了,无法再添加。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,下面是MQ(消息队列)面试中经常会遇到的6个经典问题: 1. 什么是消息队列(MQ)? 消息队列是一种常用的中间件技术,用于在不同的应用程序之间传递消息。它将消息发送到队列中,然后接收者从队列中接收消息,实现了应用程序之间的解耦。 2. MQ的优点是什么? MQ具有以下几个优点: - 异步通信:发送方发送消息后即可继续处理其他任务,接收方可以在合适的时候处理消息。 - 解耦合:发送方和接收方之间通过消息队列进行通信,彼此不需要直接知道对方的存在,实现了解耦合。 - 削峰填谷:可以通过消息队列平滑处理系统的峰值流量,保证系统的稳定性。 - 可靠性:消息队列通常具备高可靠性和持久化特性,可以确保消息不丢失。 3. RabbitMQ和Kafka有什么区别? RabbitMQ和Kafka是两种常见的消息队列系统,它们有以下区别: - RabbitMQ是一个传统的消息队列系统,采用AMQP协议,支持多种消息模式。适用于实时性要求较高、强一致性的场景。 - Kafka是一个高吞吐量、分布式的日志处理平台,采用发布-订阅模式。适用于大数据量、高并发的场景。 4. 如何保证MQ的高可用性? 保证MQ高可用性的方法主要有以下几种: - 集群部署:通过在多个节点上部署MQ实例,实现故障转移和负载均衡。 - 数据复制:将数据进行复制到多个节点上,确保数据的备份和容灾能力。 - 心跳机制:定期发送心跳检测消息,检测MQ节点的可用性。 - 监控和报警:监控MQ集群的运行状态,及时发现并解决问题。 5. 如何确保MQ的消息不丢失? 确保MQ消息不丢失的方法主要有以下几种: - 持久化:将消息存储到磁盘上,即使MQ节点宕机也能够恢复。 - ACK机制:发送方在发送消息后等待接收方的确认消息(ACK),确保消息被正确接收。 - 消息重试:当发送方发送消息失败时,可以进行重试操作,直到成功为止。 6. 如何保证MQ的顺序性? 保证MQ消息顺序性的方法主要有以下几种: - 单一消费者:每个队列只有一个消费者,确保消息按照顺序被处理。 - 分区顺序:将消息按照某个字段进行分区,同一分区内的消息按顺序处理。 - 消费者缓存:消费者接收到消息后缓存起来,按照顺序处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值