面试题
- 为什么要使用消息队列?
- 消息队列有什么优缺点?
- Kafka、ActiveMQ、RabbitMQ、RocketMQ都有什么区别,以及适合哪些场景?
面试官心理分析
其实面试官主要是想看看:
- 第一:你们为什么要用这个技术?
很多的面试者对于为什么使用这项技术缺乏思考,仅仅是为了用而用,并没有自己的独立思考,对于架构设计也没有全局的概念。 - 第二:对于这个技术的好处和坏处你们是否清楚?
是否对于技术深层次的思考,了解引入新技术的所带来的利弊。如果没有,只是代码的搬运工具,缺乏独立思考。 - 第三:技术选型的考量因素?
市场上成熟的MQ产品很多,没有一款是绝对的完美,有没有考虑过技术选型的问题。
面试题分析
为什么使用消息队列?
其实就是想知道是因为什么原因引入的MQ技术,为了解决哪些问题。面试官期望的回答就是,当初你们公司有一个什么样的业务场景,这个场景有什么样的技术挑战,不用MQ可能会有麻烦,现在引入MQ带来了哪些好处。
通过MQ的好处是:解耦,异步,削峰。
解耦
这个场景通常是发布订阅模式,比如:系统A要给系统B、C、D发送消息。如果这时候新加入一个系统E,则需要更改系统A的代码才能给系统E发送消息,如果使用MQ,可以将生产者和消费者解耦。
总结:通过一个MQ,实现Pub/Sub发布订阅模式这么一个模型,就实现了系统解耦。
面试技巧:你需要去考虑一下自己的系统中是否有类似的场景,就是一个模块调用了其他多个模块,彼此维护起来很麻烦。但是这个调用其实是不需要同步调用的。如果使用MQ进行异步解耦,也是可以的。在简历中进行体现出来,使用MQ进行解耦。
异步
如果系统A接收到一个请求,自己本地写库需要100ms,同时需要调用系统B耗费200ms,系统C耗费100ms,系统D耗费300ms。总的耗时则为700ms,这在互联网项目中是可以忍受的。使用MQ将调用异步话,这样系统A几乎只需要100ms就可以返回。
削峰
系统平时QPS大概50左右,但是遇到突发情况时,QPS飙升至5000,如果系统的数据请求是直接基于MySQL的,那么MySQL可能会崩溃。一般的MySQL的TPS大概在2K左右。瞬间的高峰,可能会使系统出现雪崩。
如果使用了MQ,在高峰的时候将数据写入到MQ中,消费端根据自己的承受能力去消费即可,不会因为请求压力过大导致崩溃。再到系统空闲时间,去消费掉挤压的数据。
这个短暂的挤压是被允许的,因为当高峰期过去之后,系统会很快的消费掉挤压的数据。
消息队列有什么缺点?
优点已经说过了,在特殊场景下有其对应的好处:解耦、异步、削峰。
缺点主要有以下三个:
- 降低系统可用性:
引入外部依赖越多,可用性就越低。直接调用的话,只要系统没有故障就不会出问题。但是一旦引入了MQ,就需要考虑MQ的可用性问题。 - 提升系统复杂度:
系统中增加了一MQ进来,需要考虑的问题也就变多了,需要考虑如何保证没有重复消费的情况(幂等性),如何处理消息丢失的情况(可靠性),如何保证消息传递的顺序性(顺序性)。 - 一致性问题:
如果A系统处理完直接返回成功,BCD系统中有出现错误的情况,这时就出现了数据不一致的情况,如何进行处理?
所以消息队列是一种非常复杂的架构,引入它会带来一些好处,但是如果由于没有考虑到处,同时也会出现一系列的问题。但是有些场景下,该用还是要用的,如何规避掉风险需要清楚。
Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优缺点?
特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
单机吞吐量 | 万级,比RocketMQ、Kafka低一个数量级 | 同ActiveMQ | 10万级别,支撑高吞吐量 | 10万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景 |
topic数量对吞吐量对影响 | topic可以达到几百/几千级别,吞吐量会有较小幅度的下降,这是RocketMQ的一大优势,在同等机器下,可以支撑大量的topic | topic从几十到几百的时候,吞吐量会大幅度下降,使用Kafka要保证topic不要过多 | ||
时效性 | ms级 | 微秒级,这是RabbitMQ的一大特点,延迟最低 | ms级 | 延迟在ms以内 |
可用性 | 高,基于主从架构 | 同ActiveMQ | 非常高,分布式架构 | 非常高,分布式架构,一个节点宕机不会影响其他节点 |
消息可靠性 | 有小概率丢失 | 基本不丢失 | 可以通过配置做到0丢失 | 同RocketMQ |
功能支持 | MQ领域的功能及其完备 | 基于erlang开发,并发能力很强,性能极好,延时很低 | MQ功能较为完善,还是分布式架构,扩展性好 | 功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用 |
综上,各种对比之后,有如下建议:
中小企业建议使用RabbitMQ,有丰富的管理界面,开箱即用,稳定性好。
有自研能力的企业,可以使用RocketMQ,支撑高吞吐。
有大数据相关业务的,可以直接使用Kafka,毕竟Kafka在大数据领域已经是事实标准。