中华石杉-- --消息队列的笔记
消息队列
为什么使用消息队列
面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务场景有个什么技术挑战,如果不用 MQ 可能会很麻烦,但是你现在用了 MQ 之后带给了你很多的好处。
先说一下消息队列常见的使用场景吧,其实场景有很多,但是比较核心的有 3 个:解耦、异步、削峰。
解耦:
看这么个场景。A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如果 C 系统现在不需要了呢?A 系统负责人几乎崩溃…
在这个场景中,A 系统跟其它各种乱七八糟的系统严重耦合,A 系统产生一条比较关键的数据,很多系统都需要 A 系统将这个数据发送过来。A 系统要时时刻刻考虑 BCDE 四个系统如果挂了该咋办?要不要重发,要不要把消息存起来?头发都白了啊!
如果使用 MQ,A 系统产生一条数据,发送到 MQ 里面去,哪个系统需要数据自己去 MQ 里面消费。如果新系统需要数据,直接从 MQ 里消费即可;如果某个系统不需要这条数据了,就取消对 MQ 消息的消费即可。这样下来,A 系统压根儿不需要去考虑要给谁发送数据,不需要维护这个代码,也不需要考虑人家是否调用成功、失败超时等情况。
异步:
再来看一个场景,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 系统写库失败了,咋整?你这数据就不一致了。
Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?
综上,各种对比之后,有如下建议:
一般的业务系统要引入 MQ**,最早大家都用 ActiveMQ**,但是现在确实大家用的不多了,没经过大规模吞吐量场景的验证,社区也不是很活跃,所以大家还是算了吧,我个人不推荐用这个了;
后来大家开始用 RabbitMQ,但是确实 erlang 语言阻止了大量的 Java 工程师去深入研究和掌控它,对公司而言,几乎处于不可控的状态,但是确实人家是开源的,比较稳定的支持,活跃度也高;
不过现在确实越来越多的公司会去用 RocketMQ,确实很不错,毕竟是阿里出品,但社区可能有突然黄掉的风险(目前 RocketMQ 已捐给 Apache,但 GitHub 上的活跃度其实不算高)对自己公司技术实力有绝对自信的,推荐用 RocketMQ,否则回去老老实实用 RabbitMQ 吧,人家有活跃的开源社区,绝对不会黄。
所以中小型公司,技术实力较为一般,技术挑战不是特别高,用 RabbitMQ 是不错的选择;大型公司,基础架构研发实力较强,用 RocketMQ 是很好的选择。
如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。
如何保证消息队列的高可用?
这个问题这么问是很好的,因为不能问你 Kafka 的高可用性怎么保证?ActiveMQ 的高可用性怎么保证?一个面试官要是这么问就显得很没水平,人家可能用的就是 RabbitMQ,没用过 Kafka,你上来问人家 Kafka 干什么?这不是摆明了刁难人么。
所以有水平的面试官,问的是 MQ 的高可用性怎么保证?这样就是你用过哪个 MQ,你就说说你对那个 MQ 的高可用性的理解。
RabbitMQ 的高可用性
RabbitMQ 是比较有代表性的,因为是基于主从(非分布式)做高可用性的,我们就以 RabbitMQ 为例子讲解第一种 MQ 的高可用性怎么实现。
RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模式。
- 单机模式
单机模式,就是 Demo 级别的,一般就是你本地启动了玩玩儿的中华石杉-- --消息队列的笔记相关推荐
- RocketMQ4.X消息队列详细笔记
人不能没有批评和自我批评 那样一个人就不能进步. 目录 JMS和消息中间件介绍 JMS消息服务和使用场景 消息中间件常见概念和编程模型 主流消息队列和技术选型讲解 基础介绍和阿里云服务器快速部署 Ro ...
- kafka消息队列学习笔记
消息队列: (1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除) 点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息推送到客户端.这个模型的特点是 ...
- Kafka消息队列学习笔记1——Kafka入门1
目录 1.消息队列 1.1.传统消息队列的应用场景 2.1.1.异步处理 1.1.2.系统解耦 1.1.3.流量削峰 1.1.4.日志处理 1.2.生产者-消费者模型 1.3.消息队列的两种模式 1. ...
- rabbitMQ 实战 高效部署分布式消息队列 读书笔记
第三章 运行和管理RabbitMQ 1. 创建一个新用户 ./rabbitmqctl add_usertest_ai_20171228 testai Creating user "test_ ...
- Windows消息机制学习笔记(一)—— 消息队列
Windows消息机制学习笔记(一)-- 消息队列 基本概念 实验一:使用代码画出最简单窗口 第一步:编译并运行以下代码 第二步:查看运行结果 第三步:使用其它窗口对其进行覆盖,观察效果 总结 消息队 ...
- 【操作系统/OS笔记16】进程间通信(IPC),直接/间接通信与阻塞/非阻塞通信,信号,管道,消息队列,共享内存
本次笔记内容: 11.8 IPC概述 11.9 信号.管道.消息队列和共享内存 文章目录 进程间通信(Inter-Process Communication, IPC)概述 为什么要进程间通信? 直接 ...
- RabbitMQ(消息队列)私人学习笔记
俗话说"好记性不如烂笔头",编程的海洋如此的浩大,养成做笔记的习惯是成功的一步! 此笔记主要是rabbitMQ3.6.6版本的笔记,并且笔记都是博主自己一字一字编写和记录,有错误的 ...
- Linux学习笔记-无名管道,有名管道,消息队列
Linux学习笔记-无名管道,命名管道,消息队列 无名管道 特点 创建无名管道的函数 demo 命名管道 特点 创建命名管道的函数 demo 消息队列 特点 创建消息队列涉及到的函数 demo 无名管 ...
- Kafka入门教程其一 消息队列基本概念 及常用Producer Consumer配置详解学习笔记
文章目录 1. 综述 2. 消息队列(Message Queue) 2.1 点对点 2.2 发布/订阅(pub-sub) 3. Kafka基础术语解释 3.1 Broker 3.2 Partition ...
- 调试笔记 — Redis 消息队列发布信息被消费者重复订阅多次牵扯到的 Tomcat 配置问题 [#00001]
最近在项目中发现了一个奇葩的 BUG ,当用户调用后台时,后台向消息队列中发布一条消息,这条消息会被监听器(消费者)监听到,有趣的事情就在这里,此时由于只发送了一条消息,照理说监听器应该只会触发一次, ...
最新文章
- Scala中没有break和continue, 如何退出循环
- MySQL3次导入报错解决!
- STM32之独立版USB(Host)驱动+MSC+Fatfs移植
- 大学新生学计算机推荐电脑,大学新生用什么电脑好呢?
- Storm原理与实现
- 面对一个全新的环境,作为一个Mysql DBA,首先应该了解什么?
- 研究生最忌讳的几点是什么?读研期间你该主动做什么?
- python爬虫微博24小时热搜_GitHub - Writeup007/weibo_Hot_Search: 微博爬虫:每天定时爬取微博热搜榜的内容,留下互联网人的记忆。...
- “隔空播放”显示器只有“关闭”的原因
- Cadence Allegro PCB如何快速查找元器件
- 045-Java-036
- 小猫钓鱼纸牌游戏java_java实现纸牌游戏-小猫钓鱼算法
- Unity打包篇:Unity 导出 Gradle 工程出现release builds have to be signed when using Gradle解决办法
- “时间的朋友”2017跨年演讲全回顾
- 涂鸦Zigbee SDK开发系列教程——2.环境搭建
- PUNCH图剖分浅析
- 如何巧用微信生态搭建和运营私域流量
- 2014苹果全球开发者大会:新系统成主角 无硬件发布
- Vue-Router前端路由的两种模式、区别、原理?
- 几个国外域名解析网站
热门文章
- 广义线性模型 matlab,基于Matlab的广义线性模型建模
- .San(三). Xia(峡).对长江二号洪水削峰作用总结
- 【C++】模板(函数模板,类模板,模板的特化,模板的分离编译)
- linux copy 复制文件夹及子文件夹
- 数值分析思考题(钟尔杰版)参考解答——第一章
- java 微博阅读量怎么算,新浪微博阅读量怎么算
- 国家/地区编码中文对照表
- After Effects CC 2019 中文版软件下载 /破解教程
- 【深度剖析】小米CyberDog四足机器人的AI运动系统的实现
- 国开计算机实操题操作,国开大学计算机实操答案一.
- RocketMQ4.X消息队列详细笔记