为什么要使用消息队列?

面试题

  • 为什么要使用消息队列?
  • 消息队列有什么优缺点?
  • 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在大数据领域已经是事实标准。

发布了6 篇原创文章 · 获赞 0 · 访问量 28

猜你喜欢

转载自blog.csdn.net/qq_26375325/article/details/105081172
今日推荐