1.普通http同步请求、基于线程池的异步请求、基于消息队列的请求三者的比较

多线程当然是速度最优的方式,不过它比较依赖服务器的配置,由于都是在系统内部进行,也存在这请求丢失的风险;队列消息是性价比最优的方式,不吃配置,请求不会因系统的问题而丢失,而且队列消息所在的服务器一般都比较稳定(毕竟没有什么业务操作),不过它无法提升访问速度;其实呢,每种方式都有利有弊,最重要的还是要看你面对的业务逻辑和实际情况

2.为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么优点和缺点?

其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队
列是什么?
面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务场景有个什么技术挑战,
如果不用 MQ 可能会很麻烦,但是你现在用了 MQ 之后带给了你很多的好处。
先说一下消息队列常见的使用场景吧,其实场景有很多,但是比较核心的有 3 个:解耦异步削峰

解耦
看这么个场景。A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如
果 C 系统现在不需要了呢?A 系统负责人几乎崩溃……
image.png
在这个场景中,A 系统跟其它各种乱七八糟的系统严重耦合,A 系统产生一条比较关键的数据,很多系统都
需要 A 系统将这个数据发送过来。A 系统要时时刻刻考虑 BCDE 四个系统如果挂了该咋办?要不要重发,
要不要把消息存起来?头发都白了啊!
如果使用 MQ,A 系统产生一条数据,发送到 MQ 里面去,哪个系统需要数据自己去 MQ 里面消费。如果新
系统需要数据,直接从 MQ 里消费即可;如果某个系统不需要这条数据了,就取消对 MQ 消息的消费即可。
这样下来,A 系统压根儿不需要去考虑要给谁发送数据,不需要维护这个代码,也不需要考虑人家是否调用
成功、失败超时等情况
image.png
总结:通过一个 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 功能在大数据领域的
实时计算以及日志采集被大
规模使用