《Java工程师面试突击第一季》学习笔记-消息队列04、05

《Java工程师面试突击第一季》学习笔记-消息队列04、05
微信公众号,关注:georgezheng
学习目的:

(1)帮助快速梳理互联网公司的高频Java进阶面试知识点;

(2)帮助快速夯实Java进阶技术栈的知识体系;

(3)学完出去面试,能够hold住一些互联网公司对某个技术点的连环炮问题;

04 体验面试官对消息队列的7个连环炮

(面试官在简历中看到,呦,有个亮点,就是你在项目中使用过MQ,比如说你用过ActiveMQ)

面试官:你在系统里使用过消息队列吗?

面试官:那你说一下你们在项目中是怎么用消息队列的?

举例说明:比如我们系统有个订单系统,订单系统会每次下一个新订单的时候,就会发送一条消息到ActiveMQ里面去,后台有个库存系统负责获取了消息然后更新库存。

面试官:那你说说用消息队列都有什么优点和缺点?

面试官:kafka、activeMQ、rabbitMQ、rocketMQ都有什么优点和缺点啊?

面试官:那你们是如何保证消息队列的高可用啊?

面试官:如何保证消息不被重复消费啊?如何保证消费的时候是幂等的啊?

面试官:如何保证消息的可靠性传输啊?要是消息丢失了怎么办啊?

面试官:那如何保证消息的顺序性?

面试官:如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几个小时,说说怎么解决?

其实上面是一个非常典型的关于消息队列的技术考察过程,好的面试官一定是从你做过的某一个点切入,然后层层展开深入考察,一个接一个问,直到把这个技术点刨根问底,问到底层。

但是如果你把这些问题都掌握了,哪怕是面试官没问到你这么深入,他问你一个消息队列问题,你就自己给他说出自己的一整套见解,那么恭喜你,就是plus加分项了。

05-如何进行消息队列的技术选型?

1.面试题

为什么用消息队列?优点和缺点?kafka、activeMQ、rabbitmq、rocketmq区别和场景?

如果对这些知识概念不清楚不了解,建议马上暂停课程,然后百度这四个是什么?每个东西找博客自己跟着做一遍,保证1个小时之内就可以快速入门这几个东西。

(1)为什么使用消息队列?

为了问问你消息队列常见的使用场景,然后你项目中具体是什么场景,说说你在这个场景里用的消息队列是什么?

解耦、异步、削峰

解耦:举例A系统发送某个数据到BCD系统,接口调用发送,那如果E系统也需要这个数据呢?那如果C系统现在不需要这个数据了呢?现在系统A又要发送第二种数据了呢?A系统负责人要疯…再崩溃的事,A系统要时刻考虑BCDE四个系统如果挂了怎么办?我要不要重发?我要不要把消息存起来?…
在这里插入图片描述
面试技巧:你需要去考虑在自己的项目中,是否有类似场景,就是一个系统或者一个模块,调用了多个系统或者模块,相互之间调用很复杂,维护起来很麻烦。但是其实这个调用是不需要直接同步调用接口的,如果用MQ给他异步化解耦,也是可以的,你就需要去考虑在你的项目中,是不是可以运用这个MQ去进行系统的解耦。
在这里插入图片描述

异步:A系统收到一个请求,需要在本地写库,还需要在BCD三个系统写库,自己本地要3ms,BCD系统分别写库要300ms、450ms、200ms。最终一次请求总延时是3+300+450+200=930ms,接近1s,用户体验觉得慢…
在这里插入图片描述

考虑:想象对于用户,点个按钮发送一个请求,消息被A系统连续发送消息到MQ队列中,总耗时在几ms,之后就直接返回了,客户的等待时长大幅度缩短很爽!网站做的真好,真快!
在这里插入图片描述

削峰:每天0点到11点,A系统风平浪静,每秒并发请求数量也就100个,结果每次一到11点~1点,每秒并发请求数突然剧增到1万条。但是系统最大处理能力也只有每秒处理1000个请求,系统会被打死…
在这里插入图片描述
如果使用 MQ,每秒 5k 个请求写入 MQ,A 系统每秒钟最多处理 2k 个请求,因为 MySQL 每秒钟最多处理 2k 个。A 系统从 MQ 中慢慢拉取请求,每秒钟就拉取 2k 个请求,不要超过自己每秒能处理的最大请求数量就 ok,这样下来,哪怕是高峰期的时候,A 系统也绝对不会挂掉。而 MQ 每秒钟 5k 个请求进来,就 2k 个请求出去,结果就导致在中午高峰期(1 个小时),可能有几十万甚至几百万的请求积压在 MQ 中。
在这里插入图片描述
这个短暂的高峰期积压是 ok 的,因为高峰期过了之后,每秒钟就 50 个请求进 MQ,但是 A 系统依然会按照每秒 2k 个请求的速度在处理。所以说,只要高峰期一过,A 系统就会快速将积压的消息给解决掉。

(2)消息队列有什么优点和缺点?

优点上面已经说了,就是在特殊的场景下有其对应的好处:解耦、异步、削峰;

缺点也显而易见:

1.系统的可用性降低:系统引入的外部依赖越多,越容易挂掉,本来你A系统调用BCD系统接口就好了,人ABCD四个系统好好的没啥问题,中间偏加一个MQ进来,万一MQ挂了咋整?MQ挂了整套系统就崩溃了,你不就完了么。

2.系统的复杂性提高:硬生生加入MQ,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息的顺序性?问题一大堆…

3.一致性问题:A系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,如果消息被BCD三个消费时,BC两个系统写库成功了,结果D系统写库失败了,咋整?你这数据就不一致了…

所以消息列队实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对他带来的坏处做各种额外的技术方案和架构来规避,最后你会发现系统复杂度提升了一个数量级,但是关键时刻,用,还是得用…

(3)kafka、activemq、rabbitmq、rocketmq都有什么优点和缺点?

表格:

Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?

特性ActiveMQRabbitMQRocketMQKafka
单机吞吐量万级,比 RocketMQ、Kafka 低一个数量级同 ActiveMQ10 万级,支撑高吞吐10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景
topic 数量对吞吐量的影响topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是 RocketMQ 的一大优势,在同等机器下,可以支撑大量的 topictopic 从几十到几百个时候,吞吐量会大幅度下降,在同等机器下,Kafka 尽量保证 topic 数量不要过多,如果要支撑大规模的 topic,需要增加更多的机器资源
时效性ms 级微秒级,这是 RabbitMQ 的一大特点,延迟最低ms 级延迟在 ms 级以内
可用性高,基于主从架构实现高可用同 ActiveMQ非常高,分布式架构非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
消息可靠性有较低的概率丢失数据基本不丢经过参数优化配置,可以做到 0 丢失同 RocketMQ
功能支持MQ 领域的功能极其完备基于 erlang 开发,并发能力很强,性能极好,延时很低MQ 功能较为完善,还是分布式的,扩展性好功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用

综上,各种对比之后,有如下建议:

一般的业务系统要引入 MQ,最早大家都用 ActiveMQ,但是现在确实大家用的不多了,没经过大规模吞吐量场景的验证,社区也不是很活跃,所以大家还是算了吧,我个人不推荐用这个了;

后来大家开始用 RabbitMQ,但是确实 erlang 语言阻止了大量的 Java 工程师去深入研究和掌控它,对公司而言,几乎处于不可控的状态,但是确实人家是开源的,比较稳定的支持,活跃度也高;

不过现在确实越来越多的公司会去用 RocketMQ,确实很不错,毕竟是阿里出品,但社区可能有突然黄掉的风险(目前 RocketMQ 已捐给 Apache,但 GitHub 上的活跃度其实不算高)对自己公司技术实力有绝对自信的,推荐用 RocketMQ,否则回去老老实实用 RabbitMQ 吧,人家有活跃的开源社区,绝对不会黄。

所以中小型公司,技术实力较为一般,技术挑战不是特别高,用 RabbitMQ 是不错的选择;大型公司,基础架构研发实力较强,用 RocketMQ 是很好的选择。

如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

George_Z3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值