面试题-【消息队列】

news2024/11/17 23:52:19

消息队列

  • 问题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即可对外服务。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用MMYOLO中yolov8训练自己VOC数据集实战

概述 MMYOLO是商汤公司基于PyTorch框架和YOLO系列算法开源的工具箱 - 目前支持的任务 目标检测旋转框目标检测 - 支持的算法 YOLOv5YOLOv6YOLOv7YOLOv8YOLOXRTMDetRTMDet-Rotated - 支持的数据集 COCO Dataset VOC Dataset CrowdHuman Dataset DOTA 1.0 Dataset 安装…

SpringBoot集成mybatis时idea控制台中文乱码问题解决

在application.yml中配置好映射文件打印数据库日志文件时,控制台出现乱码的情况解决如下 问题 在执行查询操作的时候,查询时可以查看是没有问题的,但是控制台乱码了 解决 在File-Setting-Editor-File Encodings中设置如图所示就可以了 现在…

【Web前端实操15】利用Grid布局完成九宫格

相关知识点: 创建多列 column-count 属性指定了需要分割的列数 列与列之间的间隙 column-gap 属性指定了列与列间的间隙 列边框 column-rule-style 属性指定了列与列间的边框样式 column-rule-width 属性指定了两列的边框厚度 column-rule-color 属性指定了…

解读《鸿蒙·NEXT星空版》华为注资70亿,将每月开发岗增涨10万+

​1月18日,鸿蒙生态千帆启航仪式正式开启。华为余承东说道:鸿蒙生态大势已定,满天星光,终汇成璀璨星河。 HarmonyOS NEXT鸿蒙星河版面向开发者开放申请。星河版将实现原生精致、原生易用、原生流畅、原生安全、原生智能、原生互联…

基于 Docker 搭建 Uptime-Kuma 一个极简风的应用监控

GitHub:https://github.com/louislam/uptime-kuma 一、uptime-kuma 介绍 Demo:https://uptime.wuhanjiayou.cn/ uptime-kuma 是一款开源的监控工具, 支持 TCP / PING / HTTP 等多种监控方式,可监测网站,数据库,Docker…

0125-2-Vue深入学习1—mustache模板引擎原理

[mustache] 是 “胡子”的意思&#xff0c;因为它的嵌入标记 {{ }} 旋转过来很像[胡子]&#xff0c;Vue中的 {{ }} 语法也引用了mustache&#xff0c;这也是我深入学习的目的。 1、原始js方式使 数据 变为视图 <ul id"list"></ul><script>var arr …

01-echarts如何绘制三维折线图

echarts如何绘制三维折线图 一、相关依赖包1、下载依赖2、引入依赖 二、创建图表盒子1、创建盒子2、定义数据3、编写方法1、初始化盒子2、设置配置项3、修改数据格式4、设置颜色数组4、设置name数组5、设置线三维和点三维6、添加配置项7、设置图表自适应 4、调用方法 三、整体代…

Oracle DG环境下的秘钥管理

今天有朋友问到1&#xff09;DG环境下的秘钥管理需要注意什么&#xff0c;2&#xff09;秘钥管理对DG的日志同步有影响吗&#xff1f; 对于2&#xff09;的回答是明确的&#xff0c;没有影响。秘钥的管理和DG的redo log shipping完全是两套机制。在最新版的Oracle Key Vault常…

线上版本升级 — — pg数据库备份

线上版本升级 — — pg数据库备份 在版本升级之前&#xff0c;我们通常为了保险都需要将数据库里的数据结构备份一份&#xff0c;防止升级失败之后数据丢失。&#xff08;根据业务而来&#xff0c;并非所有业务都需要备份&#xff09; 1 备份 1.1 pg_dump&#xff1a;备份指定…

Linux常见的管理命令

1. whoami 作用&#xff1a; 显示出当前有效的用户名称&#xff0c;Linux是多用户多任务 语法&#xff1a;whoami(选项) 选项&#xff1a; --help&#xff1a;在线帮助 --version&#xff1a;显示版本信息和退出 场景使用&#xff1a; 1. 当用户想要查看当前登录系统的用户…

04 约数

定义&#xff1a; 若整数n除以整数d的余数为0&#xff0c;即d能够整除n&#xff0c;n是d的倍数&#xff0c;记作d|n. 通过质因子求一个数的约数 如果n可以表示成 其中均为n的质因子 因为对于任意一个质因子都有选0个 选1个 选2个....选个共种可能&#xff0c; n的约数个数…

C++ STL库详解:list

目录 一、list简介 二、list的使用 2.1list的构造 2.2list iterator迭代器的使用 2.3list element access 2.4list 常见接口 2.5迭代器失效 三、list与vector的对比 一、list简介 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器…

腾讯云轻量应用服务器Docker如何一键搭建属于自己的幻兽帕鲁服务器?

幻兽帕鲁/Palworld是一款2024年Pocketpair开发的开放世界生存制作游戏&#xff0c;在帕鲁的世界&#xff0c;玩家可以选择与神奇的生物“帕鲁”一同享受悠闲的生活&#xff0c;也可以投身于与偷猎者进行生死搏斗的冒险。而帕鲁可以进行战斗、繁殖、协助玩家做农活&#xff0c;也…

【机器学习300问】19、深度学习和机器学习什么关系?

之前的文章都聚焦在传统的机器学习上&#xff0c;作为入门&#xff0c;学了许多机器学习的基础。往后的文章我会穿插着机器学习和深度学习的内容进行&#xff0c;所有有必要在这里先说下两者的关系。 一、从范围上讲 深度学习和机器学习都是人工智能的一个子领域&#xff0c;它…

杰理-修改蓝牙版本5.4

杰理-修改蓝牙版本5.4 #define BLUETOOTH_CORE_SPEC_54 0x0dextern void set_bt_version(u8 version); set_bt_version(BLUETOOTH_CORE_SPEC_54); //蓝牙版本5.4

Vscode配置python代码开发

文章目录 1. 配置python运行环境2. 常用插件说明3. Vscode配置文件说明3.1 setting.json配置说明3.2 launch.json配置说明 4. 远程开发5. 其他配置 1. 配置python运行环境 安装python插件&#xff1a;点击VSCode左侧边栏中的扩展图标&#xff08;或按 CtrlShiftX&#xff09;&a…

即时设计好用吗?即时设计都有什么优势?

即时设计是否易于使用&#xff1f;即时设计有哪些易于使用的功能&#xff1f;假如你在寻找一个免费的Sketch 或者网页版本 PS&#xff0c;那么「即时设计」这是个不错的选择。这个云端 UI 设计工具允许您在不占用计算机内存的情况下使用任何设备。它可以快速存储您的设计文件&a…

AI教我学编程之SQL Server常见指令以及数据类型

前言 今天在工作的过程中&#xff0c;遇到了许多常见的属性&#xff0c;在此做下记录&#xff0c;方便以后查询 目录 SQL Server 常见指令 对话AI 光有概念怎么行 阶段总结 SQL Server关键字 边学边练 数据类型 看图说话 对话AI 数据类型我知道 括号里的神秘数字 疑问 边练…

Linux sudo与/etc/sudoers

sudo介绍 sudo命令可以让普通用户在执行需要超级用户权限的命令时&#xff0c;临时提升为超级用户。例如&#xff0c;普通用户可以使用sudo执行系统管理任务&#xff0c;如安装软件、修改系统配置等。访问控制&#xff1a;sudo命令通过sudoers文件中的配置&#xff0c;可以对用…

企业软件项目成果-图像识别

下面图像识别仅仅使用了OpenCV库而已&#xff0c;并没有涉及深度学习、机器学习。 整盘样本的拍照识别结果&#xff08;识别准确率达100%&#xff09;&#xff1a; 宫颈刷图像识别的测试结果&#xff08;识别准确率达100%&#xff09;&#xff1a;