精华内容
下载资源
问答
  • 消息队列面试 - 为什么使用消息队列,消息队列有什么优点和缺点? 面试题 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景? 面试官...

     

    消息队列面试 - 为什么使用消息队列,消息队列有什么优点和缺点?

     

    面试题

    • 为什么使用消息队列?
    • 消息队列有什么优点和缺点?
    • Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?

    面试官心理分析

    其实面试官主要是想看看:

    • 第一,你知不知道你们系统里为什么要用消息队列这个东西?
      不少候选人,说自己项目里用了 Redis、MQ,但是其实他并不知道自己为什么要用这个东西。其实说白了,就是为了用而用,或者是别人设计的架构,他从头到尾都没思考过。
      没有对自己的架构问过为什么的人,一定是平时没有思考的人,面试官对这类候选人印象通常很不好。因为面试官担心你进了团队之后只会木头木脑的干呆活儿,不会自己思考。

    • 第二,你既然用了消息队列这个东西,你知不知道用了有什么好处&坏处?
      你要是没考虑过这个,那你盲目弄个 MQ 进系统里,后面出了问题你是不是就自己溜了给公司留坑?你要是没考虑过引入一个技术可能存在的弊端和风险,面试官把这类候选人招进来了,基本可能就是挖坑型选手。就怕你干 1 年挖一堆坑,自己跳槽了,给公司留下无穷后患。

    • 第三,既然你用了 MQ,可能是某一种 MQ,那么你当时做没做过调研?
      你别傻乎乎的自己拍脑袋看个人喜好就瞎用了一个 MQ,比如 Kafka,甚至都从没调研过业界流行的 MQ 到底有哪几种。每一个 MQ 的优点和缺点是什么。每一个 MQ 没有绝对的好坏,但是就是看用在哪个场景可以扬长避短,利用其优势,规避其劣势
      如果是一个不考虑技术选型的候选人招进了团队,leader 交给他一个任务,去设计个什么系统,他在里面用一些技术,可能都没考虑过选型,最后选的技术可能并不一定合适,一样是留坑。

    面试题剖析

    为什么使用消息队列

    其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么?

    面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务场景有个什么技术挑战,如果不用 MQ 可能会很麻烦,但是你现在用了 MQ 之后带给了你很多的好处。

    先说一下消息队列常见的使用场景吧,其实场景有很多,但是比较核心的有 3 个:解耦异步削峰

    解耦

    看这么个场景。A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如果 C 系统现在不需要了呢?A 系统负责人几乎崩溃......

    mq-1

    在这个场景中,A 系统跟其它各种乱七八糟的系统严重耦合,A 系统产生一条比较关键的数据,很多系统都需要 A 系统将这个数据发送过来。A 系统要时时刻刻考虑 BCDE 四个系统如果挂了该咋办?要不要重发,要不要把消息存起来?头发都白了啊!

    如果使用 MQ,A 系统产生一条数据,发送到 MQ 里面去,哪个系统需要数据自己去 MQ 里面消费。如果新系统需要数据,直接从 MQ 里消费即可;如果某个系统不需要这条数据了,就取消对 MQ 消息的消费即可。这样下来,A 系统压根儿不需要去考虑要给谁发送数据,不需要维护这个代码,也不需要考虑人家是否调用成功、失败超时等情况。

    mq-2

    总结:通过一个 MQ,Pub/Sub 发布订阅消息这么一个模型,A 系统就跟其它系统彻底解耦了。

    面试技巧:你需要去考虑一下你负责的系统中是否有类似的场景,就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要直接同步调用接口的,如果用 MQ 给它异步化解耦,也是可以的,你就需要去考虑在你的项目里,是不是可以运用这个 MQ 去进行系统的解耦。在简历中体现出来这块东西,用 MQ 作解耦。

    异步

    再来看一个场景,A 系统接收一个请求,需要在自己本地写库,还需要在 BCD 三个系统写库,自己本地写库要 3ms,BCD 三个系统分别写库要 300ms、450ms、200ms。最终请求总延时是 3 + 300 + 450 + 200 = 953ms,接近 1s,用户感觉搞个什么东西,慢死了慢死了。用户通过浏览器发起请求,等待个 1s,这几乎是不可接受的。

    mq-3

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

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

    mq-4

    削峰

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

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

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

    mq-5

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

    mq-6

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

    消息队列有什么优缺点

    优点上面已经说了,就是在特殊场景下有其对应的好处解耦异步削峰

    缺点有以下几个:

    • 系统可用性降低
      系统引入的外部依赖越多,越容易挂掉。本来你就是 A 系统调用 BCD 三个系统的接口就好了,人 ABCD 四个系统好好的,没啥问题,你偏加个 MQ 进来,万一 MQ 挂了咋整,MQ 一挂,整套系统崩溃的,你不就完了?如何保证消息队列的高可用,可以点击这里查看

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

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

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

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

    特性 ActiveMQ RabbitMQ RocketMQ Kafka
    单机吞吐量 万级,比 RocketMQ、Kafka 低一个数量级 同 ActiveMQ 10 万级,支撑高吞吐 10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景
    topic 数量对吞吐量的影响     topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是 RocketMQ 的一大优势,在同等机器下,可以支撑大量的 topic topic 从几十到几百个时候,吞吐量会大幅度下降,在同等机器下,Kafka 尽量保证 topic 数量不要过多,如果要支撑大规模的 topic,需要增加更多的机器资源
    时效性 ms 级 微秒级,这是 RabbitMQ 的一大特点,延迟最低 ms 级 延迟在 ms 级以内
    可用性 高,基于主从架构实现高可用 同 ActiveMQ 非常高,分布式架构 非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
    消息可靠性 有较低的概率丢失数据 基本不丢 经过参数优化配置,可以做到 0 丢失 同 RocketMQ
    功能支持 MQ 领域的功能极其完备 基于 erlang 开发,并发能力很强,性能极好,延时很低 MQ 功能较为完善,还是分布式的,扩展性好 功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用

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

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

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

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

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

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

     

    转载来源:https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/why-mq.md

    展开全文
  • 消息队列面试场景

    2019-02-13 14:24:48
    消息队列面试场景   面试官:你好。 候选人:你好。 (面试官在你的简历上面看到了,呦,有个亮点,你在项目里用过 MQ,比如说你用过 ActiveMQ) 面试官:你在系统里用过消息队列吗?(面试官在随和的语气...

    消息队列面试场景

     

    面试官:你好。

    候选人:你好。

    (面试官在你的简历上面看到了,呦,有个亮点,你在项目里用过 MQ,比如说你用过 ActiveMQ

    面试官:你在系统里用过消息队列吗?(面试官在随和的语气中展开了面试)

    候选人:用过的(此时感觉没啥)

    面试官:那你说一下你们在项目里是怎么用消息队列的?

    候选人:巴拉巴拉,“我们啥啥系统发送个啥啥消息到队列,别的系统来消费啥啥的。比如我们有个订单系统,订单系统每次下一个新的订单的时候,就会发送一条消息到 ActiveMQ 里面去,后台有个库存系统负责获取消息然后更新库存。”

    (部分同学在这里会进入一个误区,就是你仅仅就是知道以及回答你们是怎么用这个消息队列的,用这个消息队列来干了个什么事情?)

    面试官:那你们为什么使用消息队列啊?你的订单系统不发送消息到 MQ,直接订单系统调用库存系统一个接口,咔嚓一下,直接就调用成功,库存不也就更新了。

    候选人:额。。。(楞了一下,为什么?我没怎么仔细想过啊,老大让用就用了),硬着头皮胡言乱语了几句。

    (面试官此时听你楞了一下,然后听你胡言乱语了几句,开始心里觉得有点儿那什么了,怀疑你之前就压根儿没思考过这问题)

    面试官:那你说说用消息队列都有什么优点和缺点?

    (面试官此时心里想的是,你的 MQ 在项目里为啥要用,你没怎么考虑过,那我稍微简单点儿,我问问你消息队列你之前有没有考虑过如果用的话,优点和缺点分别是啥?)

    候选人:这个。。。(确实平时没怎么考虑过这个问题啊。。。胡言乱语了)

    (面试官此时心里已经更觉得你这哥儿们不行,平时都没什么思考)

    面试官KafkaActiveMQRabbitMQRocketMQ 都有什么区别?

    (面试官问你这个问题,就是说,绕过比较虚的话题,直接看看你对各种 MQ 中间件是否了解,是否做过功课,是否做过调研)

    候选人:我们就用过 ActiveMQ,所以别的没用过。。。区别,也不太清楚。。。

    (面试官此时更是觉得你这哥儿们平时就是瞎用,根本就没什么思考,觉得不行)

    面试官:那你们是如何保证消息队列的高可用啊?

    候选人:这个。。。我平时就是简单走 API 调用一下,不太清楚消息队列怎么部署的。。。

    面试官:如何保证消息不被重复消费啊?如何保证消费的时候是幂等的啊?

    候选人:啥?(MQ 不就是写入&消费就可以了,哪来这么多问题)

    面试官:如何保证消息的可靠性传输啊?要是消息丢失了怎么办啊?

    候选人:我们没怎么丢过消息啊。。。

    面试官:那如何保证消息的顺序性?

    候选人:顺序性?什么意思?我为什么要保证消息的顺序性?它不是本来就有顺序吗?

    面试官:如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?

    候选人:不是,我这平时没遇到过这些问题啊,就是简单用用,知道 MQ 的一些功能。

    面试官:如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路。

    候选人:。。。。。我还是走吧。。。。


    这其实是面试官的一种面试风格,就是说面试官的问题不是发散的,而是从一个小点慢慢铺开。比如说面试官可能会跟你聊聊高并发话题,就这个话题里面跟你聊聊缓存、MQ 等等东西,由浅入深,一步步深挖

    其实上面是一个非常典型的关于消息队列的技术考察过程,好的面试官一定是从你做过的某一个点切入,然后层层展开深入考察,一个接一个问,直到把这个技术点刨根问底,问到最底层。

     

    为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么优点和缺点?

    如何保证消息队列的高可用?

    如何保证消息不被重复消费?即如何保证消息消费的幂等性

    如何保证消息的可靠性传输?即如何处理消息丢失的问题

    如何保证消息的顺序性?

    如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?

    如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路。

     

    来源:“创享视界”,创享视界(creativeview.cn)是一个带动全民颠覆八小时工作制,通过投稿把自己的创意智慧变现的方式创造被动收入,从而实现财务自由的平台。我们相信,创新思维不仅有助于打造更出色的产品,还可以让世界变得更美好,让人人受益。

    展开全文
  • Java笔试面试-消息队列面试题总结

    万次阅读 多人点赞 2019-09-26 15:10:12
    1.消息队列的应用场景有哪些? 答:消息队列的应用场景如下。 应用解耦,比如,用户下单后,订单系统需要通知库存系统,假如库存系统无法访问,则订单减库存将失败,从而导致订单失败。订单系统与库存系统耦合,这...

    1.消息队列的应用场景有哪些?

    答:消息队列的应用场景如下。

    • 应用解耦,比如,用户下单后,订单系统需要通知库存系统,假如库存系统无法访问,则订单减库存将失败,从而导致订单失败。订单系统与库存系统耦合,这个时候如果使用消息队列,可以返回给用户成功,先把消息持久化,等库存系统恢复后,就可以正常消费减去库存了。
    • 削峰填谷,比如,秒杀活动,一般会因为流量过大,从而导致流量暴增,应用挂掉,这个时候加上消息队列,服务器接收到用户的请求后,首先写入消息队列,假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。
    • 日志系统,比如,客户端负责将日志采集,然后定时写入消息队列,消息队列再统一将日志数据存储和转发。

    2.RabbitMQ 有哪些优点?

    答:RabbitMQ 的优点如下:

    • 可靠性,RabbitMQ 的持久化支持,保证了消息的稳定性;
    • 高并发,RabbitMQ 使用了 Erlang 开发语言,Erlang 是为电话交换机开发的语言,天生自带高并发光环和高可用特性;
    • 集群部署简单,正是因为 Erlang 使得 RabbitMQ 集群部署变的非常简单;
    • 社区活跃度高,因为 RabbitMQ 应用比较广泛,所以社区的活跃度也很高;
    • 解决问题成本低,因为资料比较多,所以解决问题的成本也很低;
    • 支持多种语言,主流的编程语言都支持,如 Java、.NET、PHP、Python、JavaScript、Ruby、Go 等;
    • 插件多方便使用,如网页控制台消息管理插件、消息延迟插件等。

    3.RabbitMQ 有哪些重要的角色?

    答:RabbitMQ 包含以下三个重要的角色:

    • 生产者:消息的创建者,负责创建和推送数据到消息服务器;
    • 消费者:消息的接收方,用于处理数据和确认消息;
    • 代理:就是 RabbitMQ 本身,用于扮演“快递”的角色,本身不生产消息,只是扮演“快递”的角色。

    4.RabbitMQ 有哪些重要的组件?它们有什么作用?

    答:RabbitMQ 包含的重要组件有:ConnectionFactory(连接管理器)、Channel(信道)、Exchange(交换器)、Queue(队列)、RoutingKey(路由键)、BindingKey(绑定键) 等重要的组件,它们的作用如下:

    • ConnectionFactory(连接管理器):应用程序与 RabbitMQ 之间建立连接的管理器,程序代码中使用;
    • Channel(信道):消息推送使用的通道;
    • Exchange(交换器):用于接受、分配消息;
    • Queue(队列):用于存储生产者的消息;
    • RoutingKey(路由键):用于把生成者的数据分配到交换器上;
    • BindingKey(绑定键):用于把交换器的消息绑定到队列上。

    运行流程,如下图所示:
    在这里插入图片描述

    5.什么是消息持久化?

    答:消息持久化是把消息保存到物理介质上,以防止消息的丢失。

    6.RabbitMQ 要实现消息持久化,需要满足哪些条件?

    答:RabbitMQ 要实现消息持久化,必须满足以下 4 个条件:

    • 投递消息的时候 durable 设置为 true,消息持久化,代码:channel.queueDeclare(x, true, false, false, null),参数 2 设置为 true 持久化;
    • 设置投递模式 deliveryMode 设置为 2(持久),代码:channel.basicPublish(x, x, MessageProperties.PERSISTENTTEXTPLAIN,x),参数 3 设置为存储纯文本到磁盘;
    • 消息已经到达持久化交换器上;
    • 消息已经到达持久化的队列。

    7.消息持久化有哪些缺点?如何缓解?

    答:消息持久化的缺点是很消耗性能,因为要写入硬盘要比写入内存性能较低很多,从而降低了服务器的吞吐量。可使用固态硬盘来提高读写速度,以达到缓解消息持久化的缺点。

    8.如何使用 Java 代码连接 RabbitMQ?

    答:使用 Java 代码连接 RabbitMQ 有以下两种方式:

    方式一:

    public static Connection GetRabbitConnection() {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setUsername(Config.UserName);
        factory.setPassword(Config.Password);
        factory.setVirtualHost(Config.VHost);
        factory.setHost(Config.Host);
        factory.setPort(Config.Port);
        Connection conn = null;
        try {
            conn = factory.newConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
    

    方式二:

    public static Connection GetRabbitConnection2() {
        ConnectionFactory factory = new ConnectionFactory();
        // 连接格式:amqp://userName:password@hostName:portNumber/virtualHost
        String uri = String.format("amqp://%s:%s@%s:%d%s", Config.UserName, Config.Password, Config.Host, Config.Port,
                Config.VHost);
        Connection conn = null;
        try {
            factory.setUri(uri);
            factory.setVirtualHost(Config.VHost);
            conn = factory.newConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
    

    9.使用 Java 代码编写一个 RabbitMQ 消费和生产的示例?

    答:代码如下:

    public static void main(String[] args) {
        publisher();     // 生产消息
        consumer();     // 消费消息
    }
    
    /**
     * 推送消息
     */
    public static void publisher() {
        // 创建一个连接
        Connection conn = ConnectionFactoryUtil.GetRabbitConnection();
        if (conn != null) {
            try {
                // 创建通道
                Channel channel = conn.createChannel();
                // 声明队列【参数说明:参数一:队列名称,参数二:是否持久化;参数三:是否独占模式;参数四:消费者断开连接时是否删除队列;参数五:消息其他参数】
                channel.queueDeclare(Config.QueueName, false, false, false, null);
                String content = String.format("当前时间:%s", new Date().getTime());
                // 发送内容【参数说明:参数一:交换机名称;参数二:队列名称,参数三:消息的其他属性-routing headers,此属性为MessageProperties.PERSISTENT_TEXT_PLAIN用于设置纯文本消息存储到硬盘;参数四:消息主体】
                channel.basicPublish("", Config.QueueName, null, content.getBytes("UTF-8"));
                System.out.println("已发送消息:" + content);
                // 关闭连接
                channel.close();
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 消费消息
     */
    public static void consumer() {
        // 创建一个连接
        Connection conn = ConnectionFactoryUtil.GetRabbitConnection();
        if (conn != null) {
            try {
                // 创建通道
                Channel channel = conn.createChannel();
                // 声明队列【参数说明:参数一:队列名称,参数二:是否持久化;参数三:是否独占模式;参数四:消费者断开连接时是否删除队列;参数五:消息其他参数】
                channel.queueDeclare(Config.QueueName, false, false, false, null);
    
                // 创建订阅器,并接受消息
                channel.basicConsume(Config.QueueName, false, "", new DefaultConsumer(channel) {
                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                            byte[] body) throws IOException {
                        String routingKey = envelope.getRoutingKey(); // 队列名称
                        String contentType = properties.getContentType(); // 内容类型
                        String content = new String(body, "utf-8"); // 消息正文
                        System.out.println("消息正文:" + content);
                        channel.basicAck(envelope.getDeliveryTag(), false); // 手动确认消息【参数说明:参数一:该消息的index;参数二:是否批量应答,true批量确认小于index的消息】
                    }
                });
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    10.RabbitMQ 交换器类型有哪些?

    答:RabbitMQ 消费类型也就是交换器(Exchange)类型有以下四种:

    • direct:轮询方式
    • headers:轮询方式,允许使用 header 而非路由键匹配消息,性能差,几乎不用
    • fanout:广播方式,发送给所有订阅者
    • topic:匹配模式,允许使用正则表达式匹配消息

    RabbitMQ 默认的是 direct 方式。

    11.RabbitMQ 如何确保每个消息能被消费?

    答:RabbitMQ 使用 ack 消息确认的方式保证每个消息都能被消费,开发者可根据自己的实际业务,选择 channel.basicAck() 方法手动确认消息被消费。

    12.RabbitMQ 接收到消息之后必须消费吗?

    答:RabbitMQ 接收到消息之后可以不消费,在消息确认消费之前,可以做以下两件事:

    • 拒绝消息消费,使用 channel.basicReject(消息编号, true) 方法,消息会被分配给其他订阅者;
    • 设置为死信队列,死信队列是用于专门存放被拒绝的消息队列。

    13.topic 模式下发布了一个路由键为“com.mq.rabbit.error”的消息,请问以下不能接收到消息的是?

    A:cn.mq.rabbit.*
    B:#.error
    C:cn.mq.*
    D:cn.mq.#

    答:C

    题目解析:“*”用于匹配一个分段(用“.”分割)的内容,“#”用于匹配 0 和多个字符。

    14.以下可以获取历史消息的是?

    A:topic 交换器
    B:fanout 交换器
    C:direct 交换器
    D:以上都不是

    答:C

    题目解析:fanout 和 topic 都是广播形式的,因此无法获取历史消息,而 direct 可以。

    15.RabbitMQ 包含事务功能吗?如何使用?

    答:RabbitMQ 包含事务功能,主要是对信道(Channel)的设置,主要方法有以下三个:

    • channel.txSelect() 声明启动事务模式;
    • channel.txComment() 提交事务;
    • channel.txRollback() 回滚事务。

    16.RabbitMQ 的事务在什么情况下是无效的?

    答:RabbitMQ 的事务在 autoAck=true 也就是自动消费确认的时候,事务是无效的。因为如果是自动消费确认,RabbitMQ 会直接把消息从队列中移除,即使后面事务回滚也不能起到任何作用。

    17.Kafka 可以脱离 ZooKeeper 单独使用吗?

    答:Kafka 不能脱离 ZooKeeper 单独使用,因为 Kafka 使用 ZooKeeper 管理和协调 Kafka 的节点服务器。

    18.Kafka 有几种数据保留的策略?

    答:Kafka 有两种数据保存策略:按照过期时间保留和按照存储的消息大小保留。

    19.Kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 Kafka 将如何处理?

    答:这个时候 Kafka 会执行数据清除工作,时间和大小不论哪个满足条件,都会清空数据。

    20.什么情况会导致 Kafka 运行变慢?

    答:以下情况可导致 Kafka 运行变慢:

    • CPU 性能瓶颈
    • 磁盘读写瓶颈
    • 网络瓶颈

    21.使用 Kafka 集群需要注意什么?

    答:Kafka 集群使用需要注意以下事项:

    • 集群的数量不是越多越好,最好不要超过 7 个,因为节点越多,消息复制需要的时间就越长,整个群组的吞吐量就越低;
    • 集群数量最好是单数,因为超过一半故障集群就不能用了,设置为单数容错率更高。
    展开全文
  • 消息队列面试

    2019-09-07 16:14:12
  • 消息队列面试题及答案

    万次阅读 多人点赞 2019-11-27 15:48:36
    1、为什么使用消息队列消息队列使用的场景和中间件有很多,但解决的核心问题主要是:异步、解耦、消峰填谷。 2、消息队列的优缺点 异步、解耦、消峰填谷这是消息队列最大的优点,除了这些消息队列还可以会解决...
  • 消息队列面试 - 如何保证消息的顺序性? 面试题 如何保证消息的顺序性? 面试官心理分析 其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的?...
  • 消息队列面试 - 如何保证消息的可靠性传输? 面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 面试官心理分析 这个是肯定的,用 MQ 有个基本原则,就是数据不能多一条,也不能少一条,不...
  • 消息队列面试相关

    万次阅读 多人点赞 2018-05-14 13:25:21
    其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务场景有个什么技术挑战,...
  • 面试题:消息队列面试连环炮

    万次阅读 2019-11-02 23:15:58
    目录:你使用过消息中间件吗?你们为什么使用消息中间件?消息队列有什么好处?什么场景下使用的?用来干了个什么的事情?系统中引入消息队列之后会不会有什么坏处?你们使用哪一个消息中间件?为什么...
  • 消息队列面试热点一锅端

    千次阅读 多人点赞 2020-07-15 22:42:35
    大家好,我是 yes。 最近我一直扎在消息队列实现细节之中无法自拔,...当然在剖析这几个问题之前需要简单的介绍下什么是消息队列消息队列常见的一些基本术语和概念。 接下来进入正文。 什么是消息队列 来看看维基百
  • 消息队列面试常见问题大综合

    千次阅读 2020-02-09 17:17:02
    面试官心理分析面试题剖析为什么使用消息队列解耦异步削峰消息队列有什么优缺点Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?二、如何保证消息队列的高可用?面试官心理分析面试题剖析RabbitMQ 的高可用性...
  • 消息队列,kafka,复制的底层原理,leader选举的算法,增加partition以后的rebalance算法,扣很多很多的细节,如何优化kafka写入的吞吐量 其实这块如果挖深了可以问的极其深,如果是我来深挖,可能会挖到ES底层的...
  • 1. 如何确保消息正确地发送至RabbitMQ? ...一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认给生产者(包含消息唯一ID)。如果RabbitMQ发生内部错误...
  • 见名知义,消息队列主要就是用来发送和接收处理消息,但它的作用可不仅解决应用间通信问题。 1 消息队列的现实由来 在工厂我们随处可见各种传送带,很多道工序都替代了人工一次次极大耗费劳动力的往返运动,而把一套...
  • MQ都得有消息模型,就会产生比如队列(Queue)、主题(Topic)、分区(Partition)这些名词,但是概念上却不尽相同。 因为没有标准。曾经,也有一些国际组织尝试制定消息的标准,比如JMS和AMQP。但标准制定跟不上MQ...
  • 最近我一直扎在消息队列实现细节之中无法自拔,今儿暂时先跳出来盘一盘大方向上的消息队列有哪些核心注意点。核心点有很多,为了更贴合实际场景,我从常见的面试问题入手:如何保证消息不丢失?如何处...
  • 一些常见的消息队列面试题整理

    千次阅读 2019-03-29 10:24:52
    你们公司生产环境用的是什么消息中间件? RabbitMQ、ActiveMQ、RocketMQ、Kafka优缺点与应用场景 为什么在你们系统架构中要引入消息中间件? 系统解耦、异步调用、流量削峰 说说系统架构引入消息中间件有什么...
  • 什么是消息队列你了解过么?
  • 消息队列面试题及答案整理

    千次阅读 2021-02-24 13:48:31
    消息队列面试题为什么要使用消息队列/消息队列的应用场景使用了消息队列会有什么缺点如何保证消息队列是高可用的RocketMQ是如何保证消息队列是高可用的如何保证消息不被重复消费/如何保证消息消费的幂等性如何保证...
  • RabbitMQ消息队列常见面试题总结

    千次阅读 2021-03-22 02:46:39
    RabbitMQ消息队列常见面试题总结; 1、什么是消息队列消息队列的优缺点? 2、Kafka、ActiveMQ、RabbitMQ、RocketMQ的区别? 3、如何保证消息不被重复消费? 4、如何保证消息不丢失,进行可靠性传输? 5、如何保证...
  • Java面试消息队列

    2020-02-27 10:54:25
    消息队列面试题 题目来自于中华石杉,解决方案根据自己的思路来总结而得。题目主要如下:![3duWCT.png](https://imgchr.com/i/3duWCT) 1. 为什么要引入消息队列? 消息队列的引入可以解决3个核心问题: 解耦 异步 削...
  • 面试官的主要目的就是为了想问问你消息队列的运用场景,在你的项目里面是怎么运用消息队列的,用来解决了什么问题。 面试官期待的回答就是:你们公司的某一个业务场景遇到了技术挑战,如果不用MQ就会很麻烦,但是用...
  • 1. 你们系统里为什么要使用消息队列? 2. 既然使用了消息队列,说说他还有什么使用场景? 3. 消息队列的优缺点是什么?
  • 消息队列面试

    2019-09-25 14:48:41
    面试题为什么使用消息队列消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?面试官心理分析其实面...
  • 3.1. 为什么使用消息队列 3.2. 消息队列有什么优缺点 3.3. Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点? 1. 面试题 为什么使用消息队列消息队列有什么优点和缺点? Kafka、ActiveMQ、RabbitMQ、...
  • Java面试突击系列(一):消息队列面试连环炮

    千次阅读 多人点赞 2020-11-18 10:39:32
    消息队列面试连环炮 前言 你用过消息队列么? 说说你们项目里是怎么用消息队列的? 我们有一个订单系统,订单系统会每次下一个新订单的时候,就会发送一条消息到ActiveMQ里面去,后台有一个库存系统,负责获取...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 137,811
精华内容 55,124
关键字:

消息队列面试