1.普通http同步请求、基于线程池的异步请求、基于消息队列的请求三者的比较
多线程当然是速度最优的方式,不过它比较依赖服务器的配置,由于都是在系统内部进行,也存在这请求丢失的风险;队列消息是性价比最优的方式,不吃配置,请求不会因系统的问题而丢失,而且队列消息所在的服务器一般都比较稳定(毕竟没有什么业务操作),不过它无法提升访问速度;其实呢,每种方式都有利有弊,最重要的还是要看你面对的业务逻辑和实际情况
2.为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么优点和缺点?
其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队
列是什么?
面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务场景有个什么技术挑战,
如果不用 MQ 可能会很麻烦,但是你现在用了 MQ 之后带给了你很多的好处。
先说一下消息队列常见的使用场景吧,其实场景有很多,但是比较核心的有 3 个:解耦、异步、削峰。
解耦
看这么个场景。A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如
果 C 系统现在不需要了呢?A 系统负责人几乎崩溃……
在这个场景中,A 系统跟其它各种乱七八糟的系统严重耦合,A 系统产生一条比较关键的数据,很多系统都
需要 A 系统将这个数据发送过来。A 系统要时时刻刻考虑 BCDE 四个系统如果挂了该咋办?要不要重发,
要不要把消息存起来?头发都白了啊!
如果使用 MQ,A 系统产生一条数据,发送到 MQ 里面去,哪个系统需要数据自己去 MQ 里面消费。如果新
系统需要数据,直接从 MQ 里消费即可;如果某个系统不需要这条数据了,就取消对 MQ 消息的消费即可。
这样下来,A 系统压根儿不需要去考虑要给谁发送数据,不需要维护这个代码,也不需要考虑人家是否调用
成功、失败超时等情况
总结:通过一个 MQ,Pub/Sub 发布订阅消息这么一个模型,A 系统就跟其它系统彻底解耦了。
面试技巧:你需要去考虑一下你负责的系统中是否有类似的场景,就是一个系统或者一个模块,调用了多个
系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要直接同步调用接口的,
如果用 MQ 给它异步化解耦,也是可以的,你就需要去考虑在你的项目里,是不是可以运用这个 MQ 去进行
系统的解耦。在简历中体现出来这块东西,用 MQ 作解耦。
异步
削峰
消息队列有什么优缺点
优点上面已经说了,就是在特殊场景下有其对应的好处,解耦、异步、削峰。
缺点有以下几个:
系统可用性降低
系统引入的外部依赖越多,越容易挂掉。本来你就是 A 系统调用 BCD 三个系统的接口就好了,人 ABCD 四
个系统好好的,没啥问题,你偏加个 MQ 进来,万一 MQ 挂了咋整,MQ 一挂,整套系统崩溃的,你不就完
了?如何保证消息队列的高可用,可以点击这里查看。
系统复杂度提高
硬生生加个 MQ 进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺
序性?头大头大,问题一大堆,痛苦不已。
一致性问题
A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,
BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。
所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的
技术方案和架构来规避掉,做好之后,你会发现,妈呀,系统复杂度提升了一个数量级,也许是复杂了 10 倍。
但是关键时刻,用,还是得用的。
Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?
特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
单机吞吐量 | 万级,比 RocketMQ、 Kafka 低一 个数量级 | 同ActiveMQ | 10 万级,支撑高吞 吐 | 10 万级,高吞吐,一般配合 大数据类的系统来进行实时 数据计算、日志采集等场景 |
时效性 | ms级别 | 微妙级别RabbitMQ 的一大特 点,延迟 最低 | ms级别 | 延迟在 ms 级以内 |
可用性 | 高,基于主 从架构实现 高可用 | 同ActiveMQ | 非常高,分布式架构 | 非常高,分布式,一个数据多 个副本,少数机器宕机,不会 丢失数据,不会导致不可用 |
消息可靠性 | MQ 领域的功能极其完备 | 基于 erlang 开发,并 发能力很 强,性能 极好,延 时很低 | MQ 功能较为完善, 还是分布式的,扩展性好 |
功能较为简单,主要支持简单 的 MQ 功能在大数据领域的 实时计算以及日志采集被大 规模使用 |