当前位置: 首页 > news >正文

面试题-【消息队列】

消息队列

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

相关文章:

面试题-【消息队列】

消息队列 问题1 如何进行消息队列的技术选型优点解耦 (pub/sub模型)异步(异步接口性能优化)削峰 使用消息队列的缺点几种消息队列的特性 问题2 引入消息队列之后该如何保证其高可用性RabbitMQ的高可用kafka高可用 问题3 在消息队列…...

【江科大】STM32:I2C通信外设(硬件)

在将2C通信外设之前,我们先捋一捋,串口的相关特点来和I2C进行一个对北比。 首先: 1,大部分单片机,设计的PCB板均带有串口通信的引脚(也就是通信基本都借助硬件收发器来实现) 2.对于串口的异步时序&#xff…...

【机器学习300问】15、什么是逻辑回归模型?

一、逻辑回归模型是为了解决什么问题? 逻辑回归(Logistic Regression)是一种广义线性回归分析模型,尤其适用于解决二分类问题(输出为两个类别)。 (1)二分类举例 邮件过滤&#xff…...

C#调用C动态链接库

前言 已经没写过博客好久了,上一篇还是1年半前写的LTE Gold序列学习笔记,因为工作是做通信协议的,然后因为大学时没好好学习专业课,现在理论还不扎实,不敢瞎写; 因为工作原因,经常需要分析一些字…...

前端实现转盘抽奖 - 使用 lucky-canvas 插件

目录 需求背景需求实现实现过程图片示意实现代码 页面效果lucky-canvas 插件官方文档 需求背景 要求实现转盘转动抽奖的功能: 只有正确率大于等于 80% 才可以进行抽奖;“谢谢参与”概率为 90%,“恭喜中奖”概率为 10%; 需求实现 实…...

2024.1.23力扣每日一题——最长交替子数组

2024.1.23 题目来源我的题解方法一 枚举 题目来源 力扣每日一题;题序:2765 我的题解 方法一 枚举 每次都以两个相邻作为满足要求的循环数据,并且以一个布尔变量控制循环的位置 时间复杂度:O(n) 空间复杂度:O(1) pub…...

C语言王道练习题第七周两题

第一题 Description 输入一个学生的学号,姓名,性别,用结构体存储,通过 scanf 读取后,然后再 通过 printf 打印输出 Input 学号,姓名,性别,例如输入 101 xiongda m Output 输出…...

某马头条——day11+day12

实时计算和定时计算 流式计算 kafkaStream 入门案例 导入依赖 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusions><exclusion><artifactId>connect-json</artifactId&…...

springboot实现aop

目录 AOP(术语)引入依赖实现步骤测试验证感谢阅读 AOP(术语) 连接点 类里面哪些方法可以增强&#xff0c;这些点被称为连接点 切入点 实际被真正增强的方法 通知&#xff08;增强&#xff09; 实际增强的逻辑部分称为通知&#xff08;增强&#xff09; 通知&#xff08;增强&…...

Golang 中高级工程师学习笔记

闭包的作用 闭包&#xff08;Closure&#xff09;是一种函数值&#xff0c;它可以引用在其外部定义的变量。闭包允许这些变量保持在函数内部&#xff0c;而不是被每次调用时重新创建。闭包的作用主要体现在以下几个方面 封装&#xff1a; 闭包允许函数访问其外部作用域中的变…...

USB-C接口给显示器带来怎样的变化?

随着科技的不断发展&#xff0c;Type-C接口已经成为现代电子设备中常见的接口标准。它不仅可以提供高速的数据传输&#xff0c;还可以实现快速充电和视频传输等功能。因此&#xff0c;使用Type-C接口的显示器方案也受到了广泛的关注。本文将介绍Type-C接口显示器的优势、应用场…...

写一份简单的产品说明书:格式和排版建议

现在的市场竞争那么激烈&#xff0c;拥有一份简洁明了的产品说明书可以说是很重要的。产品说明书不仅向用户提供了对产品的详细了解&#xff0c;还能够树立品牌形象&#xff0c;提升用户体验。 | 一、写一份简单的产品说明书—一些建议 1.创意封面设计 一个吸引人的封面设计能…...

【Python学习】Python学习21- 正则表达式(1)

目录 【Python学习】Python学习21- 正则表达式&#xff08;1&#xff09; 前言re.match函数实例 re.search方法re.match与re.search的区别参考 文章所属专区 Python学习 前言 本章节主要说明Python的正则表达式。 正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的…...

Docker 和 Kubernetes:容器化时代的崛起与演变

在过去的十年间&#xff0c;容器化技术彻底改变了软件开发和部署的面貌。 Docker 的登场无疑是这场变革的催化剂&#xff0c;它将应用和服务的打包、分发、部署流程标准化&#xff0c;让开发者的生活变得更加简单。 紧随其后&#xff0c;Kubernetes 作为容器编排的领军者&#…...

美易官方京东养车回应索赔事件:推动行业健康发展并携手品牌商家加码补贴

近日&#xff0c;一则关于途虎养车起诉京东索赔500万元的新闻引起了业界的广泛关注。据华尔街见闻1月25日报道&#xff0c;针对此事&#xff0c;京东养车相关负责人作出了回应。京东养车表示&#xff0c;“震虎价”并非针对特定企业&#xff0c;其核心目的在于通过提升效率来改…...

深度学习与图像描述生成——看图说话(3)

目录 一、整体架构 二、学习策略 2.1 监督学习 2.2 无监督学习 2.3 强化学习 三、特征映射 3.1 定义 3.2 原理 3.3 关键技术 3.4 重要案例 3.5 特别注意下特征空间这一概念 四、语言模型 4.1 定义与原理 4.2 关键技术 4.3 重要性与作用 4.4 案例与应用 五、注…...

[SAP ABAP] ABAP编程中SY-SUBRC值的含义

在ABAP编程中&#xff0c;SY-SUBRC是一个系统变量&#xff0c;用于表示最近一次执行的系统命令(例如数据库操作、函数模块调用等)的结果状态码 SY-SUBRC的值用于检查命令是否执行成功&#xff0c;通常用于控制程序的流程 查询数据 使用SELECT语句选择查询 SY-SUBRC 0 &qu…...

测试模型分类

测试模型 1. 概述 软件测试和软件开发一样,都遵循软件工程原理,遵循管理学原理,所以理解好软件的开发模型会便于理解测试模型. 软件测试的一般流程: 我们发现一般的软件测试流程和软件开发的流程一样,但是这样的流程测试介入的较晚,对于前期重大的bug很难修复.所以测试的流程…...

mavros和PX4中的海拔高与椭球高转换

飞控高度传感器中一般有两种高度&#xff1a; 海拔高。也称AMSL&#xff08;Above Mean Sea Level&#xff09;height或者geoid height或者正高&#xff0c;顾名思义就是指高于当地平均海平面的高度。我猜气压计测得的高度应当就是与海平面相关的。椭球高。也称ellipsoid heig…...

洛谷刷题-【入门2】分支结构

目录 1.苹果和虫子 题目描述 输入格式 输出格式 输入输出样例 2.数的性质 题目描述 输入格式 输出格式 输入输出样例 3.闰年判断 题目描述 输入格式 输出格式 输入输出样例 4.apples 题目描述 输入格式 输出格式 输入输出样例 5.洛谷团队系统 题目描述 …...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好&#xff0c;我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题&#xff0c;统一使用 二重复合函数&#xff1a; z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式&#xff08;偏导…...

boost::filesystem::path文件路径使用详解和示例

boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类&#xff0c;封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解&#xff0c;包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...