面试宝典之为什么使用消息队列?

本贴最后更新于 2156 天前,其中的信息可能已经物是人非

如果你使用过消息队列,那么面试官一定会问一些消息队列的问题,而且面试官的问题都是循序渐进的,那么来感受下面试官的连环炮吧。

1、为什么使用消息队列啊?

面试官心理剖析:
看你平时有没有思考,是不是为了用而用?面试官主要想知道你们是什么业务使用了 MQ,没用的时候有什么问题?用了之后给你们带来了哪些好处?

回答:
使用的场景很多,但是把核心的场景说出来就可以了,核心场景有:解耦、异步、削峰;
(1)、解耦:
场景分析:
有 A、B、C 系统,现在 A 系统调用 B、C 系统的接口。又来一个 E 系统也需要 A 调用,可能过段时间 B 系统不需要 A 调用了。每次变更对 A 系统的维护人都是很痛苦的。A 系统还要考虑如果其他系统挂了怎么办?是否需要重试?这样系统严重的耦合在一起。
问题解决:
imagepng

(2)、异步:
场景分析:
A 系统调用 B、C 系统,因为是同步调用,用户发起请求到得到响应要花费 2s,用户是不能忍受的。
问题解决:
使用 MQ,B、C 系统的处理时间是异步的,只有 A 系统的处理时间,在加上调用 MQ 的时间,那么用户那边可以快速得到响应,使用异步的前提是 B、C 的结果在 A 系统中不会使用到。
imagepng

(3)、削峰:
场景分析:
在高峰期的时候,系统每秒的请求量达到 5000,那么调用 mysql 的请求也是 5000,一般情况下 mysql 的请求大概在 2000 左右,那么在高峰期的时候,数据库就被打垮了,那系统就不可用了。
问题解决:
在系统 A 前面加个 MQ,用户请求先到 MQ,系统 A 从 MQ 中每秒消费 2000 条数据,这样就把本来 5000 的请求变为 mysql 可以接受的请求数量了,可以保证系统不挂掉,可以继续提供服务。MQ 里的数据可以慢慢的把它消费掉。
imagepng

2、消息队列有什么缺点啊?

面试官心理剖析:
主要是想了解你知不知道 MQ 的缺点,如果不知道缺点就引入这个框架,那就是挖坑。

回答:
(1)、系统可用性降低:因为引入了 MQ,如果 MQ 挂了,那 MQ 下流的系统就不可用。
(2)、系统复杂性提高:怎么保证消息不会被重复消费?消息丢失了怎么办?如何保证消息的顺序性?(你可以根据自己遇到的问题都说一下,尽量说一下你熟悉的,因为面试官会根据你说的问题继续提问)
(3)、一致性问题:如果 MQ 消费端其中一个系统挂了,怎么办?

注意:这里回答的时候尽量选择自己熟悉的场景。面试官肯定会问你那你们是怎么解决的?如果你说不上来那不是给自己挖坑嘛。

3、kafka、activemq、rabbitmq、rocketmq 都有什么区别以及适合哪些场景?

面试官心理剖析:
看你选型的时候,是否会比较相同框架的区别,是否满足业务场景,主要是看你是不是埋坑的人?

回答:

特性 ActiveMQ RabbitMQ RocketMQ Kafka
单机吞吐量 万级 万级 10 万级 10 万级
topic 数量对吞吐量的影响 - - topic 可以达到几百,几千个的级别,吞吐量会有较小幅度的下降 topic 从几十个到几百个的时候,吞吐量会大幅度下降
时效性 ms 级 微秒级 ms 级 ms 级
可用性 非常高,分布式架构 非常高,分布式架构
消息可靠性 有较低的概率丢失数据 - 经过参数优化配置,可以做到 0 丢失 经过参数优化配置,消息可以做到 0 丢失
功能支持 完善 并发能力很强,性能极其好,延时很低 MQ 功能较为完善,还是分布式的,扩展性好 功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准
优劣势总结 非常成熟,功能强大;偶尔会有较低概率丢失消息;社区不活跃了, 性能极其好,延时很低;功能完善;提供管理界面;社区比较活跃;吞吐量较低;使用 erlang 开发源码阅读不方便; 接口简单易用;吞吐量高;分布式扩展方便;社区还算活跃;经过双 11 的考验; MQ 功能比较少;吞吐量高;分布式架构;可能存在消息重复消费问题;主要适用大数据实时计算以及日志收集;

个人总结:

中小型公司,技术一般,可以考虑用 RabbitMQ;
大型公司,基础架构研发实力较强,用 RocketMQ 是很好的选择
实时计算、日志采集:使用 kafka;

注意:可以挑几个重要的点说,不然会觉得你在背博客;

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 203 关注
  • 消息队列
    40 引用 • 52 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
chaigx
欢迎关注我的公众号:程序之声。有些文章没办法同步过来,访问个人博客:http://www.chaiguanxin.com

推荐标签 标签

  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 94 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 351 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 376 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖 • 1 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    287 引用 • 4484 回帖 • 669 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 327 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 764 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    169 引用 • 506 回帖
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 19 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 664 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 26 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 2 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1705 回帖 • 1 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 5 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 173 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1348 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    729 引用 • 1327 回帖
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 22 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 585 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    690 引用 • 535 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 700 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 483 关注