玩转消息队列之面试-----踩坑系列

在这里插入图片描述

三连问

为什么要用消息队列?
消息队列的优点和缺点?
kafka,ActiveMQ,RabbnitMQ,RockerMQ都有什么区别?
  • 第一系统里面为什么要用消息队列这个东西?
    平时我们说用过redis,MQ,但是其实很多人并不知道自己为什么用这个东西,就是为了用而用,或者是被人设计的架构,自己从头到尾没有想过。
  • 第二,既然用了消息队列这个东西,好处和坏处是什么要知道
    要是没有考虑过这个,盲目弄个mq进系统里面,后面出了问题你自己是不是溜了给公司留坑?
  • 第三,既然用了MQ,可能是某一种mq,当时你自己有没有做过调研
    切记不要看自己个人喜好,就瞎用一个MQ,比如kafka,甚至都从没研究过业界流行的MQ到底有哪几种,每一个MQ的优点和缺点是什么,一定要结合自己公司项目的场景,并做好充分的调研,才是合理的。
    为什么用消息队列
    其实就是问问你消息队列都有哪些使用场景,然后你的项目具体是什么场景,说说你在这个场景里面用消息队列是什么?
    先说一下消息对垒的使用场景吧,通常情况瞎有三个:解耦,异步,削峰
解耦

有这么个场景。A系统发送数据到BCD三个系统,通过接口调用发送。如果E系统也要用这个数据呢?
那如果C系统现在不需要了呢?A系统负责人几乎奔溃。。。。。

在这里插入图片描述

在这个场景中,A系统与其他各种乱七八糟的系统严重耦合,A系统产生一条比较关键的数据,很多系统需要A系统发送过来,A系统要时时刻刻关注BCDE系统如果挂掉了怎么办?要不要重发,要不要消息存起来?头发都白了。。。。

如果使用MQ,A系统产生一条数据,发送到MQ里面去,哪个系统需要数据自己去MQ里面消费,如果系统需要更新数据,直接从MQ里消费即可,如果某个系统不要这条数据了,就取消对MQ消息的消费即可。这样下来,A系统压根不需要去考虑给谁发送消息,不要要维护这个代码,也不需要考虑人家是否调用成功,失败超时的情况。
在这里插入图片描述

总结:通过一个MQ,Pub/Sub发布订阅消息这么一个模型,A系统就跟其他系统彻底解耦了。
你需要去考虑一下你负责的系统是否有类似的场景,就是一个系统或者一个模块调用了多个系统或者模块,互相之间调用复杂,维护起来麻烦,如果能用MQ来解耦的话,可以体现出来。

异步

A系统收到一个请求,需要在自己本地写库,还需要BCD三个系统写库,自己本地写库要3ms,BCD三个系统分别写库要300ms,450ms,200ms。最终请求的总延时是3+450ms+200ms = 953ms,接近1s,用户感觉搞个什么东西,慢死了。等待1s,几乎是不能接受的。

在这里插入图片描述

  • 一般互联网的企业,对于用户的操作,每个请求都必须再200ms以内完成,对用户事无感的。

  • 如果使用MQ,那么A系统连续发送3条消息到MQ队列中,假如耗时5ms,A系统从接受一个请求到返回响应给用户,那么总时长是3+5 = 8ms。

在这里插入图片描述

削峰

每天0:00到12:00,A系统风平浪静,每秒并发请求数量就50个,结果每次一到12:00~13:00,每秒请求并发请求数量突然会增加到5k条。但是系统是直接基于MySQL,每秒钟对MySQL执行约5k条SQL。

  • 一般的Mysql,扛到每秒2k个请求就差不多,如果每秒请求到5k的话,就可能直接把Mysql打死了,用户也就没法在使用系统了。
    但是高峰期一过,到了下午的时候,就成了低峰期,可能一万个用户同时在网站上操作,每秒钟也就请求50个,对整个系统没用任何压力。
    在这里插入图片描述

  • 如果使用MQ,每秒5个请求写入MQ,A系统每秒钟最多处理2k个请求,因为Mysql每秒种最多处理2k个请求,不要超过自己每秒钟能处理的最大亲求数量就ok,这样处理的话,即使是在高峰期的时候,A系统也绝对不会挂掉,而MQ每秒钟5k个请求,就2k个请求出去,结果就导致在中午高峰期可能有几十万几百万留在MQ中。
    在这里插入图片描述

  • 这个短暂的高峰期积压是ok的,因为高峰期过了之后,每秒钟也就50个请求进MQ,但是A系统依然会每秒2k的请求速度在处理,所以说,只要高峰期一过,A系统就会快速处理掉积压。

消息队列的优缺点

缺点
  • 系统的可用性降低
    系统引用的外部依赖越多,越容易挂掉。本来你就是A系统调用BCD三个系统的接口就好了,ASCD系统都好好的,假如你加个MQ进来,万一MQ挂了,整套系统崩溃,不就完了?如何保障消息队列的高可用,todo//
  • 系统的复杂度提高
    硬生生加个MQ进来,怎么保证消息没用被重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?
  • 一致性问题
    A系统处理完了直接返回成功了,都以为你这个请求成功了,但是问题是,要bcd三个系统那里,bd两个系统写库成功了,c系统写库失败了,数据就不一致了。
    所以消息队列一定是复杂的架构,引入她有很多好处,但是也要针对她带来的坏处做各种额外的技术方案喝架构来规避掉,做完之后你会发现,系统的复杂性提升了一个数量级。

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

在这里插入图片描述

综上,各种对比之后
最早大家都是ActiveMQ,但是现在用的都不多了,现在不太推荐这个。
中小公司,技术实力一般,用RabbitMQ是最好的选择。大型公司,基础架构实力比较强,用RccketMQs。
大数据领域的实时计算,日志采集,kafka是业内的标准。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值