如果你使用过消息队列,那么面试官一定会问一些消息队列的问题,而且面试官的问题都是循序渐进的,那么来感受下面试官的连环炮吧。
1、为什么使用消息队列啊?
面试官心理剖析:
看你平时有没有思考,是不是为了用而用?面试官主要想知道你们是什么业务使用了 MQ,没用的时候有什么问题?用了之后给你们带来了哪些好处?
回答:
使用的场景很多,但是把核心的场景说出来就可以了,核心场景有:解耦、异步、削峰;
(1)、解耦:
场景分析:
有 A、B、C 系统,现在 A 系统调用 B、C 系统的接口。又来一个 E 系统也需要 A 调用,可能过段时间 B 系统不需要 A 调用了。每次变更对 A 系统的维护人都是很痛苦的。A 系统还要考虑如果其他系统挂了怎么办?是否需要重试?这样系统严重的耦合在一起。
问题解决:
(2)、异步:
场景分析:
A 系统调用 B、C 系统,因为是同步调用,用户发起请求到得到响应要花费 2s,用户是不能忍受的。
问题解决:
使用 MQ,B、C 系统的处理时间是异步的,只有 A 系统的处理时间,在加上调用 MQ 的时间,那么用户那边可以快速得到响应,使用异步的前提是 B、C 的结果在 A 系统中不会使用到。
(3)、削峰:
场景分析:
在高峰期的时候,系统每秒的请求量达到 5000,那么调用 mysql 的请求也是 5000,一般情况下 mysql 的请求大概在 2000 左右,那么在高峰期的时候,数据库就被打垮了,那系统就不可用了。
问题解决:
在系统 A 前面加个 MQ,用户请求先到 MQ,系统 A 从 MQ 中每秒消费 2000 条数据,这样就把本来 5000 的请求变为 mysql 可以接受的请求数量了,可以保证系统不挂掉,可以继续提供服务。MQ 里的数据可以慢慢的把它消费掉。
2、消息队列有什么缺点啊?
面试官心理剖析:
主要是想了解你知不知道 MQ 的缺点,如果不知道缺点就引入这个框架,那就是挖坑。
回答:
(1)、系统可用性降低:因为引入了 MQ,如果 MQ 挂了,那 MQ 下流的系统就不可用。
(2)、系统复杂性提高:怎么保证消息不会被重复消费?消息丢失了怎么办?如何保证消息的顺序性?(你可以根据自己遇到的问题都说一下,尽量说一下你熟悉的,因为面试官会根据你说的问题继续提问)
(3)、一致性问题:如果 MQ 消费端其中一个系统挂了,怎么办?
注意:这里回答的时候尽量选择自己熟悉的场景。面试官肯定会问你那你们是怎么解决的?如果你说不上来那不是给自己挖坑嘛。
3、kafka、activemq、rabbitmq、rocketmq 都有什么区别以及适合哪些场景?
面试官心理剖析:
看你选型的时候,是否会比较相同框架的区别,是否满足业务场景,主要是看你是不是埋坑的人?
回答:
特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
单机吞吐量 | 万级 | 万级 | 10 万级 | 10 万级 |
topic 数量对吞吐量的影响 | - | - | topic 可以达到几百,几千个的级别,吞吐量会有较小幅度的下降 | topic 从几十个到几百个的时候,吞吐量会大幅度下降 |
时效性 | ms 级 | 微秒级 | ms 级 | ms 级 |
可用性 | 高 | 高 | 非常高,分布式架构 | 非常高,分布式架构 |
消息可靠性 | 有较低的概率丢失数据 | - | 经过参数优化配置,可以做到 0 丢失 | 经过参数优化配置,消息可以做到 0 丢失 |
功能支持 | 完善 | 并发能力很强,性能极其好,延时很低 | MQ 功能较为完善,还是分布式的,扩展性好 | 功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准 |
优劣势总结 | 非常成熟,功能强大;偶尔会有较低概率丢失消息;社区不活跃了, | 性能极其好,延时很低;功能完善;提供管理界面;社区比较活跃;吞吐量较低;使用 erlang 开发源码阅读不方便; | 接口简单易用;吞吐量高;分布式扩展方便;社区还算活跃;经过双 11 的考验; | MQ 功能比较少;吞吐量高;分布式架构;可能存在消息重复消费问题;主要适用大数据实时计算以及日志收集; |
个人总结:
中小型公司,技术一般,可以考虑用 RabbitMQ;
大型公司,基础架构研发实力较强,用 RocketMQ 是很好的选择
实时计算、日志采集:使用 kafka;
注意:可以挑几个重要的点说,不然会觉得你在背博客;
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于