首页 > 其他分享 >消息队列面试题

消息队列面试题

时间:2023-04-05 12:34:27浏览次数:36  
标签:面试题 消费 队列 partition Queue 消息 consumer

为什么要使用消息队列?

主要有三点原因:解耦、异步、削峰。

(1)解耦。比如,用户下单后,订单系统需要通知库存系统,假如库存系统无法访问,则订单减库存将失败,从而导致订单操作失败。订单系统与库存系统耦合,这个时候如果使用消息队列,可以返回给用户成功,先把消息持久化,等库存系统恢复后,就可以正常消费减去库存了。

(2)异步。将消息写入消息队列,非必要的业务逻辑以异步的方式运行,不影响主流程业务。

(3)削峰。消费端慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。比如秒杀活动,一般会因为流量过大,从而导致流量暴增,应用挂掉。这个时候加上消息队列,服务器接收到用户的请求后,首先写入消息队列,如果消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。

使用了消息队列会有什么缺点

  • 系统可用性降低。引入消息队列之后,如果消息队列挂了,可能会影响到业务系统的可用性。
  • 系统复杂性增加。加入了消息队列,要多考虑很多方面的问题,比如:一致性问题、如何保证消息不被重复消费、如何保证消息可靠性传输等。

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

RabbitMQ:镜像集群模式

RabbitMQ 是基于主从做高可用性的,Rabbitmq有三种模式:单机模式、普通集群模式、镜像集群模式。单机模式一般在生产环境中很少用,普通集群模式只是提高了系统的吞吐量,让集群中多个节点来服务某个 Queue 的读写操作。那么真正实现 RabbitMQ 高可用的是镜像集群模式。

镜像集群模式跟普通集群模式不一样的是,创建的 Queue,无论元数据还是Queue 里的消息都会存在于多个实例上,然后每次你写消息到 Queue 的时候,都会自动和多个实例的 Queue 进行消息同步。

好处在于:任何一个机器宕机不影响其他机器的使用。

坏处在于:

  • 性能开销太大:消息同步所有机器,导致网络带宽压力和消耗很重;
  • 扩展性差:如果某个 Queue 负载很重,即便加机器,新增的机器也包含了这个 Queue 的所有数据,并没有办法线性扩展

Kafka:partition 和 replica 机制

Kafka 基本架构是多个 broker 组成,每个 broker 是一个节点。创建一个 topic 可以划分为多个 partition,每个 partition 可以存在于不同的 broker 上,每个 partition 就放一部分数据,这就是天然的分布式消息队列。就是说一个 topic 的数据,是分散放在多个机器上的,每个机器就放一部分数据。

Kafka 0.8 以前,是没有 HA 机制的,任何一个 broker 宕机了,它的 partition 就没法写也没法读了,没有什么高可用性可言。

Kafka 0.8 以后,提供了 HA 机制,就是 replica 副本机制。每个 partition 的数据都会同步到其他机器上,形成自己的多个 replica 副本。然后所有 replica 会选举一个 leader 出来,生产和消费都跟这个 leader 打交道,然后其他 replica 就是 follower。写的时候,leader 会负责把数据同步到所有 follower 上去,读的时候就直接读 leader 上数据即可。Kafka 会均匀的将一个 partition 的所有 replica 分布在不同的机器上,这样才可以提高容错性。

如何保证消息的顺序性?

RabbitMQ

拆分多个 Queue,每个 Queue一个 Consumer;或者就一个 Queue 但是对应一个 Consumer,然后这个 Consumer 内部用内存队列做排队,然后分发给底层不同的 Worker 来处理。

Kafka

(1)一个 Topic,一个 Partition,一个 Consumer,内部单线程消费,单线程吞吐量太低,一般不会用这个。

(2)写 N 个内存 Queue,具有相同 key 的数据都到同一个内存 Queue;然后对于 N 个线程,每个线程分别消费一个内存 Queue 即可,这样就能保证顺序性。

如何避免消息重复消费?

在消息生产时,MQ内部针对每条生产者发送的消息生成一个唯一id,作为去重和幂等的依据(消息投递失败并重传),避免重复的消息进入队列。

在消息消费时,要求消息体中也要有一全局唯一id作为去重和幂等的依据,避免同一条消息被重复消费。

大量消息在 MQ 里长时间积压,该如何解决?

一般这个时候,只能临时紧急扩容了,具体操作步骤和思路如下:

(1)先修复 consumer 的问题,确保其恢复消费速度,然后将现有 consumer 都停掉;

(2)新建一个 topic,partition 是原来的 10 倍,临时建立好原先 10 倍的 queue 数量;

(3)然后写一个临时的分发数据的 consumer 程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的 10 倍数量的 queue;

(4)接着临时用 10 倍的机器来部署 consumer,每一批 consumer 消费一个临时 queue 的数据。这种做法相当于是临时将 queue 资源和 consumer 资源扩大 10 倍,以正常的 10 倍速度来消费数据;

(5)等快速消费完积压数据之后,得恢复原先部署的架构,重新用原先的 consumer 机器来消费消息。

 

标签:面试题,消费,队列,partition,Queue,消息,consumer
From: https://www.cnblogs.com/xfeiyun/p/17289127.html

相关文章

  • Vue进阶(四十七):面试必备:2023 Vue经典面试题总结(含答案)
    一、什么是MVVM?MVVM是Model-View-ViewModel的缩写。MVVM是一种设计思想。Model层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;View代表UI组件,它负责将数据模型转化成UI展现出来,ViewModel是一个同步View和Model的对象。在MVVM架构下,View和Model之间并没......
  • 美团面试题目以及解答20200424
    一面:集合有哪些:List(ArrayList Linklist)set(SetTreesetHashset)map(HashmapcurrentHashmaphashtable)arraylist和linkedlist区别一个是基于数组的实现一个是基于的链表的实现hashmap怎么扩容(多线程扩容为什么会死循环),put过程出现的是链表的闭环。concurrentHashMap1.7和1.......
  • Jmeter:通过Jmeter发送MQ消息
    某些业务完成测试自动化需要模拟『发送MQ』功能,本文介绍一下怎么在比较方便地在Jmeter中发送『MQ』消息。安装Jmeter插件在Github上有人分享了关于『Jmeter发送MQ』的插件,地址在:https://github.com/aliesbelik/jmeter-amqp-plugin进入release下载最新的包,并放到Jmeter文件......
  • 「刷起来」Go必看的进阶面试题详解
    勤学如春起之苗,不见其增日有所长;辍学如磨刀之石,不见其损日有所亏。本文的重点:逃逸分析、延迟语句、散列表、通道、接口。1.逃逸分析逃逸分析是Go语言中的一项重要优化技术,可以帮助程序减少内存分配和垃圾回收的开销,从而提高程序的性能。下面是一道涉及逃逸分析的面试题及其详......
  • #yyds干货盘点# LeetCode面试题:二进制求和
    1.简述:给你两个二进制字符串a和b,以二进制字符串的形式返回它们的和。 示例 1:输入:a="11",b="1"输出:"100"示例 2:输入:a="1010",b="1011"输出:"10101"2.代码实现:classSolution{publicStringaddBinary(Stringa,Stringb){......
  • 2023年php面试题
                                      Php面试题1、isset和empty的区别?Isset测试变量是否被赋值,如果这个变量没被赋值,则返回false,empty是判断变量是否为空,当赋值为0,null,’’,返回true为真。他们之间最大的区别就是当一个变量被赋值0时,empty判......
  • Domino (贪心,多个位置排序,优先队列) 第二十届浙大城市学院程序设计竞赛
    题目大意:给出2个队列A,B选K个ai和在从里面选L个bi问权值最大时多少   思路:排序预处理有多个元素的时候,对那个元素首先排序,以至于可以处理这个问题是很重要的当不能一步直接贪心出来,可以先贪部分,然后利用DP的思想慢慢加入点去更新即可先对ai排序,......
  • 单调队列与滑动窗口一
    单调队列--滑动窗口最值问题显然O(n^2)的时间复杂度是无法接受的我们先考虑滑动窗口滑动过程中最大值的问题过程即为我们想要维护每个滑动区间的最大值,当新插入一个元素前,我们把这个区间的第一个元素移除,插入新元素,并想在尽可能贴近O(1)的时间内得到该区间的最大值......
  • #yyds干货盘点# LeetCode面试题:加一
    1.简述:给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位,数组中每个元素只存储单个数字。你可以假设除了整数0之外,这个整数不会以零开头。 示例 1:输入:digits=[1,2,3]输出:[1,2,4]解释:输入数组表示数字123。示例 2:输入:digit......
  • 以下是一些可能涉及到的Starrocks面试题
    Starrocks是什么,它与其他OLAP数据库的区别是什么?Starrocks是一种分布式列式存储的MPP(MassivelyParallelProcessing)OLAP数据库,能够支持PB级别的数据存储和查询。与传统的基于Hadoop的OLAP系统相比,Starrocks具有以下几点优势:灵活的存储格式:Starrocks使用列式存储,可以根据数据特点和......