MQ消息队列常见面试题

Posted 爪哇干货君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MQ消息队列常见面试题相关的知识,希望对你有一定的参考价值。

现在的互联网公司中,都面临着一个高流量冲击的问题,面对这里高流量需要个技术来进行削峰减压,否则系统或者数据库分分钟崩溃。这个时候mq消息队列就隆重登场了,mq作为中间件有极高的吞吐量处理能力和高效率的读写能力。可以说mq是面试中必考的内容了,下面我们看下针对mq会有哪些常见的问题。

为什么要使用mq队列,有什么用?

mq队列有哪些?它们的区别是什么?

mq如何保证数据不丢失?

mq如何保证幂等性?

mq如何实现高可用?

mq队列的作用

面试官一般会问,你使用mq的作用是什么?不用mq行不行?其实这里就是在考察mq的作用。mq的作用有哪些?很简单记住三点就行。解耦、异步、削峰

解耦是指系统之间不用直接依赖调用,而是中间插入了一个mq,用mq解除系统之间的耦合。

异步是指信息的处理是异步的,生产者提供消息给mq,消费者不是马上消费的,而按顺序异步消费的。

削峰是指面临大量的请求的时候,系统可能会支撑不住,这个时候就可以将数据放到mq中,让消费者在自己消费能力内消费这些数据,保持系统的健壮性。

常见mq队列及区别

常见的mq队列有ActiveMQ、RabbitMQ、RocketMQ、Kafka。区别可见图。

各mq产品对比图

保证mq数据不丢失

mq基本结构图


1.生产者和mq队列之前传输要使用确认机制,生产者发送消息给mq丢列后,mq要进行接口回调告诉生产者这个数据我已经收到了。如果发送失败生产者要有重试机制进行重新发送。

2.mq队列要进行数据的持久化,保证mq挂掉后数据不会丢失。或者保持mq队列的高可用性,防止mq宕机造成数据丢失

3.消费者和mq队列之间也要加入确认机制,待消费者处理完具体的业务后,注意是处理完业务逻辑后,再回调mq,告诉mq我已经处理完了。

保证mq幂等性

保证幂等性的意思就是保证数据不被消费者重复消费在数据库中插入重复的数据,要解决这个问题就要在消费者端入手。

1.进行数据库操作,可以先查下这个数据是否已经存在了,如果存在了进行更新操作,不存在就进行插入操作

2.写入redis,这个比较简单,直接利用redis的set数据类型就可以保证数据不会重复了。

3.如果不是数据库业务情景的话,如直接根据得到的数据进行发送邮件或者短信。这种情况的话可以加一个redis的set数据类型进行消重处理,或者用数据库做一个发送的日志记录,用1的方式去处理。

实现mq高可用

每种mq都有实现高可用性的方式,activeMQ和rabbitMQ是通过主从集群的方式实现高可用性的,但是存在一个致命问题就是,当mq队列爆满的时候,主从架构不能横向扩容,因为每个queue保持的数据都是一样的。下面主要介绍下分布式架构的kafka。

kafka分布式架构


1.kafka的一个topic的数据分布在分区(partition)中,而每个partition都分布在不同的broker中,这样就保证了同一个topic的数据分布在不同的机器中。

2.kafka每个partition都有一个leader和多个follower,当leader挂了,follower会自动选举出来一个leader,这样就保证了mq的健壮性。

3.生产者和消费者的读写只能通过leader进行,不能读写follower,同时只有当leader的数据同步给follower之后才认为是写成功了,保证数据不丢失。

可以看到,相比主从架构,分布式架构具有更高的可扩展性,可用横向增加partition进行扩容。


以上是关于MQ消息队列常见面试题的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ简单介绍及常见面试题

RabbitMQ常见面试题

rabbitmq常见面试题

kafka常见面试题

Day287.其他活性故障活锁&饥饿死锁常见面试题 -Juc

java基础-常见面试题