为什么使用消息队列?消息队列有什么优点和缺点?常用的MQ 都有什么区别,以及适合哪些场景?

news2024/9/24 19:13:40

问题:

  • 为什么使用消息队列?
  • 消息队列有什么优点和缺点?
  • 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 三个系统写库, 自己本地写库要 3ms,BCD 三个系统分别写库要 300ms、450ms、200ms。最终请求总延时是 3 + 300 + 450 + 200 = 953ms,接近 1s,用户感觉搞个什么东西,慢死了慢死了。用户通过浏览器 发起请求,等待个 1s,这几乎是不可接受的。

一般互联网类的企业,对于用户直接的操作,一般要求是每个请求都必须在 200 ms 以内完成, 对用户几乎是无感知的。

如果使用 MQ,那么 A 系统连续发送 3 条消息到 MQ 队列中,假如耗时 5ms,A 系统从接受一 个请求到返回响应给用户,总时长是 3 + 5 = 8ms,对于用户而言,其实感觉上就是点个按钮, 8ms 以后就直接返回了,爽!网站做得真好,真快!

 削峰

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

一般的 MySQL,扛到每秒 2k 个请求就差不多了,如果每秒请求到 5k 的话,可能就直接把 MySQL 给打死了,导致系统崩溃,用户也就没法再使用系统了。

但是高峰期一过,到了下午的时候,就成了低峰期,可能也就 1w 的用户同时在网站上操作, 每秒中的请求数量可能也就 50 个请求,对整个系统几乎没有任何的压力。

如果使用 MQ,每秒 5k 个请求写入 MQ,A 系统每秒钟最多处理 2k 个请求,因为 MySQL 每秒钟 最多处理 2k 个。A 系统从 MQ 中慢慢拉取请求,每秒钟就拉取 2k 个请求,不要超过自己每秒 能处理的最大请求数量就 ok,这样下来,哪怕是高峰期的时候,A 系统也绝对不会挂掉。而 MQ 每秒钟 5k 个请求进来,就 2k 个请求出去,结果就导致在中午高峰期(1 个小时),可能有 几十万甚至几百万的请求积压在 MQ 中。

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

消息队列有什么优缺点?

是在特殊场景下有其对应的好处,解耦、异步、削峰

缺点有以下几个:

  • 系统可用性降低

系统引入的外部依赖越多,越容易挂掉。本来你就是 A 系统调用 BCD 三个系统的接口就好了, ABCD 四个系统还好好的,没啥问题,你偏加个 MQ 进来,万一 MQ 挂了咋整?MQ 一挂,整套 系统崩溃,你不就完了?

  • 系统复杂度提高

硬生生加个 MQ 进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证 消息传递的顺序性?头大头大,问题一大堆,痛苦不已。

  • 一致性问题

A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个 系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。

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

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

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/713096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机专业大学如何自学?常用网站和工具

耗时5小时,第一个B站视频,满足分享欲 计算机专业现状 or 困境?如何自学?常用网站科普!_哔哩哔哩_bilibili 👆发了个视频,结合文章中的链接,保存到自己浏览器收藏夹里就完了 目录 …

亚马逊买家账号防关联怎么弄?

如果你希望你的亚马逊买家账号不被关联到其他账号,你可以采取以下措施来增强账号的安全性和保护个人信息: 1、强密码:使用强密码来保护你的亚马逊账号。确保密码包含字母、数字和特殊字符,并且长度足够长。避免使用与其他网站或账…

Linux day2

在 Linux 系统中,你看到一个文件的属主和属组都是 root,它的权限是 -rwxrwxr--,那么下面的描述中哪个是不正确的() 官方解析: 文件类型和文件权限由10个字符组成: 第 1 位表示文件的类型&#x…

黄牛泛滥如何影响亚洲的演唱会和现场娱乐行业

随着新冠大流行的结束,中国的各类线下娱乐活动尤其是演唱会等又逐渐红火了起来,但蓬勃发展的现场娱乐活动却饱受日益严重的黄牛问题的困扰。黄牛是指个人通过使用自动化机器人批量购买现场活动门票,然后以高昂的价格转售的行为(黄…

【python】基础应用

python 基础 变量函数函数定义函数参数说明匿名函数 lambda 文件文件编码文件读取文件写入 异常tryExceptionelsefinally异常的传递 模块模块导入自定义python包并导入第三方包的导入 JSON 变量 python 中变量的定义不需要指定变量的类型,直接进行定义,…

五月&六月券商金工精选

✦研报目录✦ ✦简述✦ 按发布时间排序 海通证券 通往绝对收益之路(八):“固收”产品股票端的量化解决方案 发布日期:2023-05-05 关键词:固收、股票、量化策略 主要内容:本研报研究了优秀的“固收”产品…

考完PMP就可以做项目经理了?

接触过项目的自然没问题,如果是小白 0经验肯定是不能直接做项目经理的。 首先是要积攒一些经验,如果是纯小白,建议再去考一个P2(prince2)证书,这个证书主要是实操为主,可以带着你手把手去做项目&#xff0…

【C++11】lambda表达式详解

目录 1.lambda引入 2.语法 3.捕捉列表详解 [ ] 不捕获任何外部变量 [] 捕获父作用域的所有变量的值,只读不可以修改 [&]捕获父作用域的所有变量的引用,可修改捕获的变量 [val] 只捕获指定的变量值,不可以修改 [&val] 只捕获外…

【云原生系列】云计算概念与架构设计介绍

1 什么是云计算 云计算是一种基于互联网的计算模式,在这个模式下,各种计算资源(例如计算机、存储设备、网络设备、应用程序等)可以通过互联网实现共享和交付。云计算架构设计的主要目标是实现高效、可扩展、可靠、安全和经济的计算…

读者与写者问题

本篇文章我们使用C探讨一下读者与写者问题. 1. 读者与写者问题引入 读写操作是计算机中对存储区最常见的两种操作. 我们之前探讨了生产者与消费者问题, 知道了如何开启多个线程, 现在就可以直接写出读者与写者问题的最基本的代码了, 仍从最简单的情况开始--两个读者, 代码如下…

React01-React简介及环境搭建

一、SPA 单页面应用 1. 多页面应用(MPA) 一个链接对应一个页面。 优点:便于百度搜索。 缺点:请求量大。 应用:电商网站 2. 单页面应用(SPA) 应用:音乐网站 优点:…

Babylist EDI 需求详解

Babylist 是一个为准父母提供方便和灵活的婴儿注册服务的平台,帮助他们准备迎接新生儿的到来。Babylist 与各种不同的品牌和零售商合作,包括婴儿用品、玩具、衣物和其他相关产品的制造商。用户可以在 Babylist 上浏览各种不同的产品,并根据自…

9、Redis集群(cluster)

是什么 Redis集群是一个提供在多个Redis节点间共享数据的程序集,Redis集群可以支持多个master 能干嘛 Redis集群支持多个master,每个master又可以挂载多个slave 读写分离 支持数据的高可用 支持海量数据的读写存储操作 由于Cluster自带Sentinel的故障转…

UWB智能定位管理系统源码(Java+ vue+ spring boot)

智能定位管理系统技术架构:Java vue spring boot 一、系统概述 系统聚焦基于UWB(超宽带)技术的底层定位网络和定位算法,通过对定位分站、定位标签、定位引擎的硏发,实现高精度定位网络,获取高精度定位结果,支撑行业大…

爬虫入门指南(6):反爬虫与高级技巧:IP代理、User-Agent伪装、Cookie绕过登录验证及验证码识别工具

文章目录 前言IP代理与User-Agent伪装IP代理User-Agent伪装 使用Cookie绕过登录验证使用验证码识别工具未完待续... 前言 随着互联网发展,网站数据变得越来越重要。然而,为了保护其数据的安全性和唯一性,网站通常会采取反爬虫措施。本篇博客将…

一场由AIGC引发的网文变革

文 | 螳螂观察 作者 | 青月 2019年底《庆余年》第一季播出引发了全民追剧热潮,不仅实现了国内的口碑、流量双丰收,还收获了包括韩国在内的27个国家或地区海外观众的超高评价。 经过三年多的蓄力,前不久《庆余年》第二季发布了开机特辑。这…

论文解读|CVPR 2023:非刚性点云匹配的神经内嵌算法

原创 | 文 BFT机器人 01 背景 在非刚性点云匹配领域,将两个或多个形状的点云对应起来是一个具有挑战性的任务。在这个问题中,形状的变形可能会导致点云之间的几何形状和拓扑结构的差异。因此,点云匹配方法需要能够识别和建立这些非刚性变形下…

一文图解|低精度定时器原理

Linux 内核通常会使用 定时器 来做一些延时的操作,比如常用的 sleep() 系统调用就是使用定时器来实现的。 在 Linux 内核中,有两种类型的定时器:高精度定时器 与 低精度定时器。低精度定时器基于硬件的时钟中断实现的,其定时周期…

开放式蓝牙耳机推荐,高性价比的蓝牙耳机首选这些品牌

在开放式耳机的流行度越来越高的同时,新接触想入手开放式耳机的小伙伴们,面对不同样式型号的耳机,会更多的考虑舒适度还是音质?亦或者是外观呢,通过各方体验调查,我总结了几款值得大家选择的开放式耳机&…

Linux--共同访问的公共目录不允许a用户删除b用户目录或文件:粘滞位 -t

情景: ①当多个用户共享同一个目录,需要在该目录下,进行读写、创建文件 ②但是自己只能删除自己的,而不能删除别人的(w:可以互删的,但是不满足条件) 语法: chmod t 目录名 注意…