面试题-【消息队列】

消息队列

  • 问题1 如何进行消息队列的技术选型
    • 优点
      • 解耦 (pub/sub模型)
      • 异步(异步接口性能优化)
      • 削峰
    • 使用消息队列的缺点
    • 几种消息队列的特性
  • 问题2 引入消息队列之后该如何保证其高可用性
    • RabbitMQ的高可用
    • kafka高可用
  • 问题3 在消息队列里消费到了重复的数据怎么办
  • 问题4 如何保证消息的可靠性
    • RabbiteMQ可能存在消息丢失的问题
    • kafka可能消息丢失的问题
  • 问题5 怎么保证从消息队列里拿到的数据按顺序执行
    • RabbiteMQ保证消息顺序性
    • kafka保证消息顺序性
  • 问题6 几百万消息在消息队列里积压怎么办
  • 问题7 让你来开发一个消息队列中间件,你会怎么设计架构

问题1 如何进行消息队列的技术选型

为什么使用消息队列?消息队列的优点和缺点?kafka,activeMQ,rabbitMQ、rocketMQ的优点和缺点,都有什么区别以及适用那些场景?

消息队列应用场景有很多,但是主要目的是的解耦,异步,削峰

优点

解耦 (pub/sub模型)

不使用消息队列
使用消息队列

异步(异步接口性能优化)

直接调用
MQ异步化

削峰

直接请求数据库
削峰

使用消息队列的缺点

  1. 可用性降低
  2. 系统复杂性提高,比如消息重复,消息丢失,消息顺序
  3. 一致性问题
    在这里插入图片描述

几种消息队列的特性

特性activeMQRabbiteMQRocketMQkafka
单机吞吐量万级万级10万级,可以支撑高吞吐量10万级别,高吞吐量。适合日志采集,实时计算等场景
topic数量对吞吐量的影响topic可以达到几百,几千个的级别,吞吐量会有较小幅度的下降这是RocketMQ的一大优势,在同等机器下,可以支撑大量的topic topic从几十个到几百个的时候,吞吐量会「大幅度下降」所以在同等机器下,kafka尽量保证topic数量不要过多。如果要支撑大规模topic,需要增加更多的机器资源topic从几十个到几百个的时候,吞吐量会「大幅度下降」所以在同等机器下,kafka尽量保证topic数量不要过多。如果要支撑大规模topic,需要增加更多的机器资源
时效性ms级微秒级,这是rabbitmq的一大特点,延迟是最低的ms级ms级
可用性高,基于主从架构实现高可用性高,基于主从架构实现高可用性 非常高,分布式架构非常高,分布式架构非常高,分布式架构
消息可靠性有比较低的丢消息可能经过参数优化配置,可以做到0丢失经过参数优化配置,可以做到0丢失
总结非常成熟,比较早 偶尔丢消息社区活跃度低基于erlang开发,所以并发能力很强,性能极其好,延时很低MQ功能较为完善,还是分布式的,扩展性好功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准

其实activeMQ、RabbiteMQ更类似单机应用,一个queue的数据不会被拆分成多分分散到多个机器上,RocketMQ、kafka是分布式的,一个topic数据可以被拆分成多个partition,进而分散到多个机器上,摆脱单机容量限制

问题2 引入消息队列之后该如何保证其高可用性

高可用主要是避免单机故障(有副本)以及数据不丢(磁盘)

RabbitMQ的高可用

有三种部署模式

  1. 单机模式 (简单demo)
  2. 普通集群模式 (不能保证高可用,机器挂了数据就访问不了,但是整个集群的容量是可以超过单个机器的大小)
  3. 镜像集群模式(所有机器完全相同,但是不能超过单机容量限制)

普通集群
镜像集群模式

kafka高可用

在这里插入图片描述
一个topic可以有多个partition,这样就可以把一个topic数据分散到多个机器上(摆脱单机限制),每个partition有leader和follower,这样如果leader挂了,follower可以升级成leader

问题3 在消息队列里消费到了重复的数据怎么办

问题:怎么保证消息不被重复消费?或者说怎么保证消息消费时的幂等性
消息队列只保证消息不丢,并不保证消息不会重发,所以需要应用保证幂等
问题:
在这里插入图片描述
如何保证系统幂等性
在这里插入图片描述

问题4 如何保证消息的可靠性

怎么保障消息不丢

RabbiteMQ可能存在消息丢失的问题

在这里插入图片描述

kafka可能消息丢失的问题

整体上一样的,kafka是自动提交offset,当消费者处理完再提交offset
在这里插入图片描述

问题5 怎么保证从消息队列里拿到的数据按顺序执行

RabbiteMQ保证消息顺序性

在这里插入图片描述

kafka保证消息顺序性

kafka只能保证partition内部数据的顺序性,不会处理多个partition,所以如果是业务的一些操作的话可以指定partition,或者通过key计算hash,保证一个业务的数据会到一个partition
在这里插入图片描述

问题6 几百万消息在消息队列里积压怎么办

面试:如何处理消息队列延时及过期失效的问题?消息队列满了怎么处理?有几百万消息积压几个小时应该怎么办?
分析:可能是消费端出现问题不消费了或者是消费变慢了,以及可能消息队列中数据快把磁盘堆满了都没人消费,并且在RabbiteMQ中有TTL设置,过期的数据可能就丢失了,常见的例子比如消费端需要把数据写入到数据库,结果mysql挂了,消费就hang住了
在这里插入图片描述

问题7 让你来开发一个消息队列中间件,你会怎么设计架构

主要考察,对于消息队列有没有研究,能不能整体上把握住,给出一些关键点

(1)首先这个 mq得支持可伸缩性吧,就是需要的时候快速扩容,就可以增加香吐量和容量,那怎么搞?设计个分布式的系统呗,参照一下 kafka 的设计理念,broker -> topic->partition,每个 partition 放一个机器,就存一部分数据。如果现在资源不够了,简单啊,给topic 增加 partition,然后做数据迁移,增加机器,不就可以存放更多数据,提供更高的吞吐量了?
(2)其次你得考虑一下这个 mg 的数据要不要落地磁盘吧?那肯定要了,落磁盘,才能保证别进程挂了数据就丢了。那落磁盘的时候怎么落啊?顺序写,这样就没有磁盘随机读写的寻址开销,磁盘顺序读写的性能是很高的,这就是 kafka 的思路。
(3)其次你考虑一下你的 mq的可用性啊?这个事儿,具体参考我们之前可用性那个环节讲解的 kafka 的高可用保障机制。多副本 ->leader & follower ->broker 挂了重新选举 leader即可对外服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/346138.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

07 队列

目录 1.队列 2.实现 3.OJ题 1. 队列 只允许在一段进行插入数据操作,在另一端进行数据删除操作的特殊线性表,队列具有先进先出FIFO(First In Firtst Out),插入操作的叫队尾,删除操作的叫队头 2. 实现 队列…

前端echarts图形报表常见的样式配置

文章目录 🐒个人主页🏅Vue项目常用组件模板仓库📖前言:🐕1.深色主题🐕2.改变柱状图颜色🐕突然发现去问ai,更容易理解,那就不总结了 🐒个人主页 🏅…

太阳光模拟器汽车耐老化太阳跟踪聚光户外加速老化试验

1 范围 1.1 本标准适用于以太阳为光源的菲涅耳反射系统来进行汽车外饰材料的加速老化试验。 1.2 本标准规定的设备和方法可用于确定曝露于日光、热和潮湿下的汽车材料的相对耐老化性, 前提是假设试验期间发生的对材料加速老化速率起决定性作用的物理、化学变化机理…

缓存高并发问题

Redis 做缓存虽减轻了 DBMS 的压力,减小了 RT,但在高并发情况下也是可能会出现各种问题的。 缓存穿透 当用户访问的数据既不在缓存也不在数据库中时,就会导致每个用户查询都会“穿透”缓存“直抵”数据库。这种情况就称为缓存穿透。当高度发…

什么是网络?

你是一台电脑,你的名字叫 A 很久很久之前,你不与任何其他电脑相连接,孤苦伶仃。 直到有一天,你希望与另一台电脑 B 建立通信,于是你们各开了一个网口,用一根网线连接了起来。 用一根网线连接起来怎么就能&…

Oracle BIEE 示例(一)数据透视表2

1 背景 版本:BIEE 12C 视图:数据透视表 实现内容(顺序与具体内容不一致): 2 空列显示(方法一) 2.1 问题 列为空时,标题栏不显示信息。 2.2 期望 即使数据为空,也要显示列名。 2.3 官方资料 2.3.1 操作步骤 2.3.1.1 要在分析级别关闭空值隐藏,请执行以下操作…

不停机迁移,TDengine 在 3D 打印技术中的“焕新”之路

小T导读:自 2021 年我们正式使用 TDengine 至今已接近三年,现在 TDengine 已经成熟应用于我们多个项目当中,凭借着强大的读写存储能力,为我司多项业务的核心数据保驾护航。近期我们团队刚好完成 TDengine 2.x 到 3.x 的数据迁移&a…

基于EfficientNet(B0-B7)全系列不同参数量级模型开发构建中草药图像识别分析系统,实验量化对比不同模型性能

EfficientNet系列的模型在我们前面开发识别类项目或者是检测类项目都是比较少去使用的,一方面是技术本身迭代发展的速度是比较快的,可能新的东西还没学习更新的东西就出来了,另一方面是EfficientNet本身实际业务使用度并不高,可能…

C++ STL之deque的理解及使用

文章目录 1. 介绍2. 实现原理(简单理解)3. deque的优缺点4. deque类的使用4.1 deque类对象的构造函数4.2 deque类对象的容量操作4.3 deque类对象的修改操作4.4 deque类对象的访问及遍历操作 1. 介绍 deque(双端队列):是一种双开口的连续空间的…

UCAS-AOD遥感旋转目标检测数据集——基于YOLOv8obb,map50已达96.7%

1.UCAS-AOD简介 1.1数据说明 遥感图像,又名高分辨率遥感图像。遥感图像的分类依据是根据成像的介质不同来进行分类的。UCAS-AOD (Zhu et al.,2015)用于飞机和汽车的检测,包含飞机与汽车2类样本以及一定数量的反例样本(背景&…

第4章 面向对象(下)

4.1 继承 4.1.1 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。例如,猫和狗都属于动物,程序中便可以描述为猫…

2017年认证杯SPSSPRO杯数学建模C题(第二阶段)移动端考研产品的春天真的到来了吗全过程文档及程序

2017年认证杯SPSSPRO杯数学建模 C题 移动端考研产品的春天真的到来了吗 原题再现: 2017 年的全国硕士研究生招生考试共有 201 万人报名参加,比去年增加了 24 万名考生,增加 13.56%。看起来新一轮的考研热潮即将到来,而考研教学和…

JAVA工程中引用本地jar的3种常用方式,你用过哪种?

文章目录 前言1. 第1种方式2. 第2种方式3. 第3种方式 前言 实际项目过程中咱们经常会碰到需要本地引用jar包到java工程中的场景,本文就介绍一下遇到此场景时如何在IDEA中导入本地jar包到工程中的3种方式,简单却很常用。 1. 第1种方式 IDEA -> File …

MySQL函数—流程函数

MySQL函数—流程函数:用于实现条件筛选,从而题搞语句的效率。 MySQL函数—流程函数 函数功能IF(value,t,f)如果value为true,则返回t,否则返回fIFNULL(value1,value2)如果value1不为空,返回value1,否则返回v…

单点登陆(SSO)基于CAS实现前后端分离的SSO系统开发「IDP发起」

关于其他前端常见登录实现单点登录方案,请见「前端常见登录实现方案 单点登录方案 」 前沿 单点登录(SSO),英文全称为 Single Sign On。 SSO 是指在多个应用系统中,用户只需要登录一次,就可以访问所有相互…

分布变化下的Test-Time adaption 综述

论文 https://arxiv.org/abs/2303.15361 代码 https://github.com/tim-learn/awesome-test-time-adaptation (其实这是相关领域代码和论文合集之类的东西) Abstract 机器学习方法努力在训练过程中获得一个鲁棒模型,即使在分布变化的情况下…

RDMA vs InfiniBand 网卡接口如何区分?

(该架构图来源于参考文献) 高性能计算网络,RoCE vs. InfiniBand该怎么选? 新 RoCEv2 标准可实现 RDMA 路由在第三层以太网网络中的传输。RoCEv2 规范将用以太网链路层上的 IP 报头和 UDP 报头替代 InfiniBand 网络层。这样,就可以在基于 IP…

向日葵远程控制Mac版权限设置教程解决远程无法控制问题

很多Mac新手安装向日葵远程控制Mac版后,根据提示设置了权限后发现无法远程控制,其实主要是你只勾选了中文的“向日葵权限选项“,而忘记了勾选了向日葵另外一个英文选项权限。 判断是否完全开启控制权限 打开向日葵访问权限设置面板&#xf…

gitlab runner 安装、注册、配置、使用

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Unity Mask合批情况验证

1.首先是两个Mask完全重合的情况下 每张图片使用的image都来自同一个图集 发现彼此之间是没有合批的,但是每个Mask内部是实现了合批的 经过计算此种情况的visiableList:mask1,IM1,IM2,mask2,IM3&#xf…