消息队列面试题:为什么要使用消息队列?
开源项目:浪海博客 需要星星 谢谢 ~
gitee地址:https://gitee.com/langhai666/langhai-blog
github地址:https://github.com/Allenkuzma/langhaiblogs
为什么要使用消息队列?
首先需要了解 MQ 消息队列的三个最重要的优点或者说特征:解耦、异步、削峰。
这里由购物场景来说明:用户下单,必然会生成订单,生成物流信息,以及减少库存。
解耦:
在没有引入消息队列之前,下单系统会和库存系统以及物流系统等其他系统存在严重的耦合关系。
在引入消息队列之后,各个系统只需要从自己感兴趣的队列当中消费消息,也就是一个发布订阅模型,在代码层面各个系统的耦合性大大降低了。
异步:
在没有引入消息队列之前,下单系统需要同步调用各个其他系统来进行减少库存和生成物流信息等操作。这些操作的时间加起来,有可能超过1秒,可能会给用户的体验带来影响。
在引入消息队列之后,下单系统只需要将消息发送到消息队列中即可,这样大大节省了用户等待的时间,提升了用户的体验感。
削峰:
餐饮系统当中,中饭和晚饭的时候是一个高峰期,在某一个时间段会有大量的请求发过来,这样有可能导致把mysql打死,从而导致系统崩溃。
在引入消息队列之后,可以将大量的请求先存储在消息队列当中,按照自己系统的消费能力慢慢消费,最终起到一个流量平缓的效果。
在引入消息队列之后,带来了哪一些弊端?
系统可用性降低
系统引入了外部的组件越多,遇到的问题就会越多。如果消息队列挂了怎么办呢?这个时候将要考虑消息队列的高可用模型。
系统的复杂度提高
引入消息队列之后,需要考虑消息的丢失问题,以及消息有可能被重复消费的问题。还有一致性问题(有的系统成功消费,有的系统消费失败,造成数据不一致的情况。)等等。
如何从activeMQ、RabbitMQ、RocketMQ、Kafka中选择合适的消息队列?
activeMQ的起源比较早,现在社区的活跃度比较低,使用的人也比较少,一般不推荐使用。
rabbitMQ采用的erlang语言开发,如果要进行二次定制开发的话,就必须掌握erlang语言。rabbitMQ的时效性最低,可以到达微秒级别。
rocketMQ是阿里巴巴出品,经历过大规模吞吐量场景的验证(双十一购物),国内有许多公司在使用。
kafka在大数据方面应用的非常多,比如说用来进行日志采集和实时计算等场景。
本文章由 浪海博客 2024-01-12 编写发布。