简介

  • 现在java分布式项目中,MQ基本都是必备的消息中间件。或许你曾接触过RabbitMQ, RocketMQ, Kafka, ActiveMQ。或许你只是对这些有所耳闻。今天,简单总结一下关于MQ在面试的一些问题。

什么是消息队列

  • 首先,我们聚焦在队列上。我们都知道队列是一种数据结构,支持先进先出。所以,消息队列就是一种可以储存消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。并且是有顺序的。当生产者按照A, B, C…这样的顺序存入消息队列中,消费者也按照A, B, C…这样的顺序取出来进行消费。
  • 消息队列是分布式中的消息中间件。使用它,主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。 虽然我们引入消息队列存在这些优点,但当一个系统加入一个新东西时,必然会带来一些问题。例如消费的顺序性,如何保证消息不被重复消费?如何保证消息的可靠性传输(如何处理消息丢失的问题)?…等等问题。所以说使用消息队列也不是十全十美的,使用它也会让系统可用性降低、复杂度提高,另外还需要我们保障一致性等问题。
  • 目前流行的MQ就有RabbitMQ, RocketMQ, Kafka, ActiveMQ。各种MQ都有其对应的使用场景,等下在后面也会一一对比这些消息队列。

为什么要使用消息队列

总体而言,使用消息队列有两点好处。

  1. 通过异步处理提高系统性能(削峰、减少响应所需时间);
  2. 降低系统耦合性。
    (1) 通过异步处理提高系统性能(削峰、减少响应所需时间);
  • 如上图中,在不使用消息队列服务器的时候,用户的请求数据直接写入数据库,在高并发的情况下数据库压力剧增,使得响应速度变慢。但是在使用消息队列之后,用户的请求数据发送给消息队列之后立即 返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。
  • 由于消息队列服务器处理速度快于数据库(消息队列也比数据库有更好的伸缩性),因此响应速度得到大幅改善。
  • 消息队列具有很好的削峰作用的功能——即通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。 举例:在电子商务一些秒杀、促销活动中,合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。如下图所示:
  • 用户请求数据写入消息队列之后就立即返回给用户了,但是请求数据在后续的业务校验、写数据库等操作中可能失败。因此使用消息队列进行异步处理之后,需要适当修改业务流程进行配合,
  • 比如用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功,以免交易纠纷。这就类似我们平时手机订火车票和电影票。
    (2) 降低系统耦合性。
    我们知道如果模块之间不存在直接调用,那么新增模块或者修改模块就对其他模块影响较小,这样系统的可扩展性无疑更好一些。

我们最常见的事件驱动架构类似生产者消费者模式,在大型网站中通常用利用消息队列实现事件驱动结构。如下图所示:
  

  • 消息队列使利用发布-订阅模式工作,消息发送者(生产者)发布消息,一个或多个消息接受者(消费者)订阅消息。 从上图可以看到消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合,消息发送者将消息发送至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该消息从何而来。对新增业务,只要对该类消息感兴趣,即可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计。

  • 消息接受者对消息进行过滤、处理、包装后,构造成一个新的消息类型,将消息继续发送出去,等待其他消息接受者订阅该消息。因此基于事件(消息对象)驱动的业务架构可以是一系列流程。

  • 另外为了避免消息队列服务器宕机造成消息丢失,会将成功发送到消息队列的消息存储在消息生产者服务器上,等消息真正被消费者服务器处理后才删除消息。在消息队列服务器宕机后,生产者服务器会选择分布式消息队列服务器集群中的其他服务器发布消息。

备注: 消息队列只能利用发布-订阅模式工作,只不过在解耦这个特定业务环境下是使用发布-订阅模式的。除了发布-订阅模式,还有点对点订阅模式(一个消息只有一个消费者),我们比较常用的是发布-订阅模式。 另外,这两种消息模型是 JMS 提供的,AMQP 协议还提供了 5 种消息模型。

消息队列可能带来的问题

  • 系统可用性降低: 系统可用性在某种程度上降低,为什么这样说呢?在加入MQ之前,你不用考虑消息丢失或者说MQ挂掉等等的情况,但是,引入MQ之后你就需要去考虑了!
  • 系统复杂性提高: 加入MQ之后,你需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题!
  • 一致性问题: 我上面讲了消息队列可以实现异步,消息队列带来的异步确实可以提高系统响应速度。但是,万一消息的真正消费者并没有正确消费消息怎么办?这样就会导致数据不一致的情况了!

常见MQ对比

对比方向 概要
吞吐量 万级的 ActiveMQ 和 RabbitMQ 的吞吐量(ActiveMQ 的性能最差)要比 十万级甚至是百万级的 RocketMQ 和 Kafka 低一个数量级。
可用性 都可以实现高可用。ActiveMQ 和 RabbitMQ 都是基于主从架构实现高可用性。RocketMQ 基于分布式架构。 kafka 也是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
时效性 RabbitMQ 基于erlang开发,所以并发能力很强,性能极其好,延时很低,达到微秒级。其他三个都是 ms 级。
功能支持 除了 Kafka,其他三个功能都较为完备。 Kafka 功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准
消息丢失 ActiveMQ 和 RabbitMQ 丢失的可能性非常低, RocketMQ 和 Kafka 理论上不会丢失。
  • ActiveMQ 的社区算是比较成熟,但是较目前来说,ActiveMQ 的性能比较差,而且版本迭代很慢,不推荐使用。
  • RabbitMQ 在吞吐量方面虽然稍逊于 Kafka 和 RocketMQ ,但是由于它基于 erlang 开发,所以并发能力很强,性能极其好,延时很低,达到微秒级。但是也因为 RabbitMQ 基于 erlang 开发,所以国内很少有公司有实力做erlang源码级别的研究和定制。如果业务场景对并发量要求不是太高(十万级、百万级),那这四种消息队列中,RabbitMQ 一定是你的首选。如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。
  • RocketMQ 阿里出品,Java 系开源项目,源代码我们可以直接阅读,然后可以定制自己公司的MQ,并且 RocketMQ 有阿里巴巴的实际业务场景的实战考验。RocketMQ 社区活跃度相对较为一般,不过也还可以,文档相对来说简单一些,然后接口这块不是按照标准 JMS 规范走的有些系统要迁移需要修改大量代码。还有就是阿里出台的技术,得做好这个技术万一被抛弃,社区黄掉的风险。
  • kafka 的特点其实很明显,就是仅仅提供较少的核心功能,但是提供超高的吞吐量,ms 级的延迟,极高的可用性以及可靠性,而且分布式可以任意扩展。同时 kafka 最好是支撑较少的 topic 数量即可,保证其超高吞吐量。kafka 唯一的一点劣势是有可能消息重复消费,那么对数据准确性会造成极其轻微的影响,在大数据领域中以及日志采集中,这点轻微影响可以忽略这个特性天然适合大数据实时计算以及日志收集。
    参考
  • 《Java工程师面试突击第1季-中华石杉老师》
  • https://github.com/Snailclimb/JavaGuide

【面试】MQ常见面试问题相关推荐

  1. 面试系列 -- 常见面试问题回答思路

    面试过程中,面试官会向应聘者发问,而应聘者的回答将成为面试官考虑是否接受他的重要依据.对应聘者而言,了解这些问题背后的"猫腻"至关重要.本文对面试中经常出现的一些典型问题进行了整理 ...

  2. 【面试】—常见面试问题,面试技巧和注意事项

    1.请你自我介绍一下你自己? 回答提示:往往大多数人在回答这个问题时,只说姓名.年龄.爱好.工作经验,这些在简历上都有.(面试官不瞎又不是看不到) 一家企业最希望知道的是求职者能否胜任工作,包括:最强 ...

  3. clr 面试_C# 常见面试问题汇总

    1.c#垃圾回收机制 从以下方面入手展开:  1.压缩合并算法   2.代的机制  3.GC调用终结器 Garbage Collector . NET采用了和Java类似的方法由CLR(Common ...

  4. 【Android -- 面试】常见面试技术要点

    不断学习,做更好的自己!

  5. RocketMQ 常见面试问题

    一.使用RocketMQ如何保证消息不丢失? 这个是在面试时,关于MQ,面试官最喜欢问的问题.这个问题是所有MQ都需要面对的一个共性问题.大致的解决思路都是一致的,但是针对不同的MQ产品又有不同的解决 ...

  6. 推荐收藏 | 算法工程师常见面试问题及相关资料汇总

    关注上方"视学算法",选择"星标公众号", 关键时间,第一时间送达! 编辑:数据派THU Github传送门: https://github.com/lcylm ...

  7. JavaScript 面试中常见算法问题详解

    JavaScript 面试中常见算法问题详解,翻译自 https://github.com/kennymkchan/interview-questions-in-javascript.下文提到的很多问 ...

  8. 一些常见面试问题背后的逻辑是什么?

    以前我上大学那会,学校的就业办主要就是帮你安排招聘会,从来没听说针对面试的辅导或者模拟面试啥的,所有的面试经验都来源于网上写的一些文章,然后再在面试的时候通过各种碰壁去揣测面试官在想啥. 前不久美国的 ...

  9. Web前端人员如何面试?常见vue面试题有哪些?

    Web前端人员如何面试?常见vue面试题有哪些?vue是一套用于构建用户界面的渐进式JavaScript框架,也是初创项目的首选前端框架.很多企业在招聘前端工程师时都会考察其对vue的了解,接下来小编 ...

最新文章

  1. 吉大19秋学期计算机应用基础在线作业,吉大16秋学期《计算机应用基础》在线作业一答案...
  2. python爬取全国社会组织查询网站
  3. jsp学习之包含——include
  4. 巧用linux服务器下的/dev/shm/,避开磁盘IO不给力!
  5. 3d打印 路径规划_3D打印螺旋桨技术的应用和挑战
  6. android加载声音文件,Android是在应用程序中加载和播放声音的最快方式
  7. WinCC归档数据报表控件
  8. 前端学习(751):Javascript作用域
  9. 单链表(不带头结点)
  10. DDD领域模型、贫血模型、充血模型概念总结
  11. [P4063][JXOI2017]数列(DP)
  12. 自己在总结前人经验下弄的几个opencv封装函数
  13. c语言自学教程——博文总结
  14. win2003从组策略关闭端口(445/135/137/138/139/3389等)教程
  15. FPGA循环点亮流水灯
  16. 利用layui创建二级表头
  17. 短视频的素材在哪里找呢?推荐给你一个好办法
  18. 嵌入式linux培训教程,嵌入式Linux开发学习之Linux文件系统学习
  19. idea 超实用的插件
  20. 简单实用!一文掌握效度分析所有知识点!

热门文章

  1. MySQL 增删改查 基础
  2. ant design vue input change_ElementUI 不维护了?供我们选择的 Vue 组件库还有很多!
  3. 临床药理学|名词解释(考试后总结版)
  4. 手机python教程_python爬虫获取京东手机图片的图文教程
  5. 小米11pro和小米11ultra哪个好
  6. 有关苹果电脑的一些对话
  7. 使用npm安装cnpm
  8. 什么是 IoC 和 AOP?
  9. 【美化§魔幻的麒麟xp主题】
  10. Android 使用 style 给 Activity 设置背景(background 和 windowBackground的区别)