当前位置: 首页 > 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.洛谷团队系统 题目描述 …...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性&#xff0c;分别代表什么&#xff0c;有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...