消息队列的灵魂拷问,你能过几关?
1. 引子
消息队列分布式系统中重要的组件,一种存放消息的容器,主要作用有解耦、异步、削锋,是大型分布式系统不可缺少的中间件。
常见的消息队列有 ActiveMQ,RabbitMQ,RocketMQ,Kafka。
简历中涉及到了消息队列,面试官先问了这样几个问题:
- 你们系统里为什么要使用消息队列?
- 既然使用了消息队列,说说他还有什么使用场景?
- 消息队列的优缺点是什么?
2. 为什么使用消息队列?
我的回答:甲方提供 EOS 充值服务,我方进行调用。出于解耦的目的,引入了消息队列。
一个类似应试的回答方法,就是思考面试官问这个问题是出于什么目的,想获得的是什么样的答案?
当问到为什么使用消息队列时,面试官期望的回答是公司的 xxx 业务遇到了挑战,不用 MQ 会有麻烦,使用 MQ 之后带来了好处。
通过一个问题就能看出是为了用而用,还是经过思考之后使用。
3. 消息队列的使用场景?
问消息队列的使用场景,和问消息队列有什么优点,消息队列有什么作用是等价的。
消息队列的作用主要有三个解耦、异步、削峰。
解耦
B,C,D 系统需要使用 A 系统产生的关键数据。
- 无消息队列时
- 系统 A 为系统 B、C、D 等提供各自的接口,导致系统 A 与它们紧密耦合
- 添加系统 E 又需要接口,删除 B 系统原接口又没用了
- 有消息队列时
- 系统 A 作为生产者,将消息发送到消息队列
- 系统 B、C、D 作为消费者订阅消息
- 新增消费者只需订阅消息,对原系统和业务没有影响
异步
用户请求数据时,系统的响应时间是保证用户体验很重要的一部分。
- 无消息队列时
- 用户请求 A 系统,A 系统需要等待 BCD 执行完成之后响应
- 用户收到响应用时近 1 秒
- 用消息队列时
- 用户请求 A 系统,A 系统将请求推到消息队列中,B、C、D 异步执行
- 用户收到响应用时 200 毫秒
削峰
秒杀场景下,每秒有 5000 个请求,Mysql 每秒最大处理 2000 条 sql。
- 无消息队列时
- 用户请求数据直接写入数据库,高并发时数据库压力剧增,甚至奔溃
- Mysql 宕机,整个系统都不能用了
- 有消息队列时系统 B、C、D
- 用户请求数据先存入 MQ 中
- 系统 A 每秒读取 2000 条数据进行处理
- 每秒多出 3000 条未处理数据按场景稍后处理
4. 消息队列有什么缺点?
优点前面已经说过了,还需要讨论一下缺点。
为什么要问缺点是什么?
凡事都有两面性,如果只是考虑到消息队列的优点,而没有考虑缺点,这就是一个潘多拉的魔盒。打开魔盒,接踵而来的会是一系列的意外。
推广到引入其他技术亦然,只有考虑到缺点之后才可以采取额外的技术方案或者架构来规避这些缺点。
系统可用性降低
- 系统引入的外部依赖越多,宕机的可能性就越大
- 系统引入消息队列,就要考虑消息队列的可靠性
- 比如原本只需要考虑 A,B,C,D 四个系统
- 引入消息队列之后就需要考虑 A,B,C,D 四个系统外加消息队列
系统复杂度提高
- 消息重复消费问题
- 消息丢失问题
- 消息传递顺序问题
一致性问题
- A 系统处理完返回成功,即认为请求成功
- 但是也存在 BC 系统写入成功,而 D 系统写入失败的情况
- 这样的情况就是数据不一致
总结
面试官问到 MQ 的时候,希望考察我们在使用 MQ 的时候是否有过自己的思考。没有完美的技术,任何技术都具有两面性,要考虑它的使用场景,并且对可能遇到的风险做到心中有数,提前预防。
思考
引入消息队列之后:
- 如何保证高可用?
- 如何避免消息的重复消费和消息丢失?
- 如何保证消息的顺序执行?
消息队列的灵魂拷问,你能过几关?相关推荐
- redis灵魂拷问:如何使用stream实现消息队列
redis在很早之前就支持消息队列了,使用的是PUB/SUB功能来实现的.PUB/SUB有一个缺点就是消息不能持久化,如果redis发生宕机,或者客户端发生网络断开,历史消息就丢失了. redis5. ...
- ibm mq并发访问队列_消息队列之九问九答
问题1 为什么要用消息队列呀? 答:如下图所示,外呼系统需要将外呼结果发送给业务系统,如果采用rpc的调用方式:则带来的后果, 首先,1.外呼系统与业务系统严重耦合,多个业务系统需要外呼系统传输数据, ...
- 泪目跳槽太不容易,蚂蚁金服三轮面试,四个小时灵魂拷问
本人是双非院校科班研究生,Java开发3年工作经验,以下是最近的面试总结: 先说下我的面试准备经历,为了保证自己简历有较大一定的概率通过筛选,我在2018毕业后面试了多家公司,去了一家上海一家小公司一 ...
- 【消息中间件MQ系列】消息队列之ActiveMQ、RocketMQ、RabbitMQ、Kafka不得不说的秘密
热门系列: [消息中间件MQ系列]RabbitMQ安装与使用,并与SpringBoot整合 程序人生,精彩抢先看 目录 1.消息队列/消息中间件介绍 1.1 消息中间件是什么 1.1.1 消息中间件的 ...
- 深入理解消息队列(场景,对比,原理和设计思想)
导语 | 消息队列也通常称为消息中间件,提到消息队列,大部分互联网人或多或少都听过该名词.对于后端工程师而言,更是日常开发中必备的一项技能.随着大数据时代的到来,apache旗下的Kafka一度成为消 ...
- 大规模集群故障处理,能抗住这3个灵魂拷问算你赢
点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"加入公众号专属技术群 我相信每一个集群管理员,在长期管理多个不同体量及应用场景的 ...
- 大牛书单 | 消息队列方向的好书
消息队列也通常称为消息中间件,提到消息队列,大部分互联网人或多或少都听过该名词.对于后端工程师而言,更是日常开发中必备的一项技能.消息队列主要解决应用耦合.异步消息.流量削锋等问题,具有高性能.高可用 ...
- 消息队列背后的设计思想
作者:jaydenwen,腾讯 PCG 后台开发工程师 消息队列也通常称为消息中间件,提到消息队列,大部分互联网人或多或少都听过该名词.对于后端工程师而言,更是日常开发中必备的一项技能.随着大数据时代 ...
- 工程师的灵魂拷问:你的密钥安全吗?
阿里妹导读:密钥管理是密码学应用的核心问题之一.任何涉及加密/签名的应用,无论算法本身机制多么安全,最终都会受到灵魂拷问:你密钥存在哪儿?本文实现了一种安全的密钥管理方案,基于安全多方计算技术,避免了 ...
最新文章
- 怎样把DataGrid存放在ViewState中的无用数据卡掉
- docker脚本安装 阿里云_让运行在 Docker 中的 Ghost 支持阿里云 OSS
- Azure 内容审查器之文本审查
- 编写html要注意,编写XHTML需要注意的问题以及和HTML的区别
- maven junit空指针_Maven相关笔试面试题目
- python工作区是什么_在IPython中保存工作区
- 水下等离子切割机行业调研报告 - 市场现状分析与发展前景预测
- 函数解素数求距离问题
- 51单片机学习7-最小系统protel原理图的绘制
- android接入微信登录授权提示{errcode:40125,errmsg:invalid appsecret, view more at 。。。解决办法
- Ehcache开源解读
- 如何用手机连接无线网络
- C++手动开启O2、O3优化略
- Asp.Net Core报错System.Text.Json.JsonException: A possible object cycle was detected which is not supp
- shiro中anon配置不生效
- DW1000学习之路(三)--------DW1000的中断处理问题
- 如何有效地帮助新人融入项目中
- 分享6款好用并免费的远程管理工具
- MSSQL 数据库邮件配置
- 2020清华大学计算机学院黄翔,清华大学计算机科学与技术系2020—2021学年度学生会主席候选人名单公示...