消息中间件面试题-参考回答

面试官:RabbitMQ-如何保证消息不丢失

候选人:

嗯!我们当时MYSQL和Redis的数据双写一致性就是采用RabbitMQ实现同步 的,这里面就要求了消息的高可用性,我们要保证消息的不丢失。主要从三 个层面考虑

第一个是开启生产者确认机制,确保生产者的消息能到达队列,如果报错可 以先记录到日志中,再去修复数据

第二个是开启持久化功能,确保消息未消费前在队列中不会丢失,其中的交 换机、队列、和消息都要做持久化

第三个是开启消费者确认机制为auto,由spring确认消息处理成功后完成   ack,当然也需要设置一定的重试次数,我们当时设置了3次,如果重试3次 还没有收到消息,就将失败后的消息投递到异常交换机,交由人工处理

面试官:RabbitMQ消息的重复消费问题如何解决的

候选人:

嗯,这个我们还真遇到过,是这样的,我们当时消费者是设置了自动确认机 制,当服务还没来得及给MQ确认的时候,服务宕机了,导致服务重启之

后,又消费了一次消息。这样就重复消费了

因为我们当时处理的支付(订单|业务唯一标识),它有一个业务的唯一标  识,我们再处理消息时,先到数据库查询一下,这个数据是否存在,如果不 存在,说明没有处理过,这个时候就可以正常处理这个消息了。如果已经存 在这个数据了,就说明消息重复消费了,我们就不需要再消费了

面试官:那你还知道其他的解决方案吗?

候选人:

嗯,我想想~

 

其实这个就是典型的幂等的问题,比如, redis分布式锁、数据库的锁都是可 以的

面试官:RabbitMQ中死信交换机 ? (RabbitMQ延迟队列有了解过嘛)

候选人:

嗯!了解过!

我们当时的xx项目有一个xx业务,需要用到延迟队列,其中就是使用 RabbitMQ来实现的。

延迟队列就是用到了死信交换机和TTL(消息存活时间)实现的。

如果消息超时未消费就会变成死信,在RabbitMQ中如果消息成为死信,队列 可以绑定一个死信交换机,在死信交换机上可以绑定其他队列,在我们发消 息的时候可以按照需求指定TTL的时间,这样就实现了延迟队列的功能了。

我记得RabbitMQ还有一种方式可以实现延迟队列,在RabbitMQ中安装一个  死信插件,这样更方便一些,我们只需要在声明交互机的时候,指定这个就 是死信交换机,然后在发送消息的时候直接指定超时时间就行了,相对于死 信交换机+TTL要省略了一些步骤

面试官:如果有100万消息堆积在MQ ,如何解决 ?

候选人:

我在实际的开发中,没遇到过这种情况,不过,如果发生了堆积的问题,解 决方案也所有很多的

第一:提高消费者的消费能力 ,可以使用多线程消费任务

第二:增加更多消费者,提高消费速度

使用工作队列模式, 设置多个消费者消费消费同一个队列中的消息

第三:扩大队列容积,提高堆积上限

可以使用RabbitMQ惰性队列,惰性队列的好处主要是

①接收到消息后直接存入磁盘而非内存

②消费者要消费消息时才会从磁盘中读取并加载到内存

 

③支持数百万条的消息存储

面试官:RabbitMQ的高可用机制有了解过嘛

候选人:

嗯,熟悉的~

我们当时项目在生产环境下,使用的集群,当时搭建是镜像模式集群,使用 了3台机器。

镜像队列结构是一主多从,所有操作都是主节点完成,然后同步给镜像节

点,如果主节点宕机后,镜像节点会替代成新的主节点,不过在主从同步完 成前,主节点就已经宕机,可能出现数据丢失

面试官:那出现丢数据怎么解决呢?

候选人:

我们可以采用仲裁队列,与镜像队列一样,都是主从模式,支持主从数据同 步,主从同步基于Raft协议,强一致。

并且使用起来也非常简单,不需要额外的配置,在声明队列的时候只要指定 这个是仲裁队列即可

面试官:Kafka是如何保证消息不丢失

候选人:

嗯,这个保证机制很多,在发送消息到消费者接收消息,在每个阶段都有可 能会丢失消息,所以我们解决的话也是从多个方面考虑

第一个是生产者发送消息的时候,可以使用异步回调发送,如果消息发送失 败,我们可以通过回调获取失败后的消息信息,可以考虑重试或记录日志, 后边再做补偿都是可以的。同时在生产者这边还可以设置消息重试,有的时 候是由于网络抖动的原因导致发送不成功,就可以使用重试机制来解决

第二个在broker中消息有可能会丢失,我们可以通过kafka的复制机制来确保 消息不丢失,在生产者发送消息的时候,可以设置一个acks,就是确认机

制。我们可以设置参数为all,这样的话,当生产者发送消息到了分区之后, 不仅仅只在leader分区保存确认,在follwer分区也会保存确认,只有当所有 的副本都保存确认以后才算是成功发送了消息,所以,这样设置就很大程度 了保证了消息不会在broker丢失

 

第三个有可能是在消费者端丢失消息, kafka消费消息都是按照offset进行标 记消费的,消费者默认是自动按期提交已经消费的偏移量,默认是每隔5s提 交一次,如果出现重平衡的情况,可能会重复消费或丢失数据。我们一般都 会禁用掉自动提价偏移量,改为手动提交,当消费成功以后再报告给broker

消费的位置,这样就可以避免消息丢失和重复消费了

面试官:Kafka中消息的重复消费问题如何解决的

候选人:

kafka消费消息都是按照offset进行标记消费的,消费者默认是自动按期提交 已经消费的偏移量,默认是每隔5s提交一次,如果出现重平衡的情况,可能 会重复消费或丢失数据。我们一般都会禁用掉自动提价偏移量,改为手动提 交,当消费成功以后再报告给broker消费的位置,这样就可以避免消息丢失 和重复消费了

为了消息的幂等,我们也可以设置唯一主键来进行区分,或者是加锁,数据 库的锁,或者是redis分布式锁,都能解决幂等的问题

面试官:Kafka是如何保证消费的顺序性

候选人:

kafka默认存储和消费消息,是不能保证顺序性的,因为一个topic数据可能  存储在不同的分区中,每个分区都有一个按照顺序的存储的偏移量,如果消 费者关联了多个分区不能保证顺序性

如果有这样的需求的话,我们是可以解决的,把消息都存储同一个分区下就 行了,有两种方式都可以进行设置,第一个是发送消息时指定分区号,第二 个是发送消息时按照相同的业务设置相同的key,因为默认情况下分区也是  通过key的hashcode值来选择分区的, hash值如果一样的话,分区肯定也是  一样的

面试官:Kafka的高可用机制有了解过嘛

候选人:

嗯,主要是有两个层面,第一个是集群,第二个是提供了复制机制

 

kafka集群指的是由多个broker实例组成,即使某一台宕机,也不耽误其他 broker继续对外提供服务

复制机制是可以保证kafka的高可用的, 一个topic有多个分区,每个分区有  多个副本,有一个leader,其余的是follower,副本存储在不同的broker中; 所有的分区副本的内容是都是相同的,如果leader发生故障时,会自动将其 中一个follower提升为leader,保证了系统的容错性、高可用性

面试官:解释一下复制机制中的ISR

候选人:

ISR的意思是in-sync replica,就是需要同步复制保存的follower

其中分区副本有很多的follower,分为了两类, 一个是ISR,与leader副本同 步保存数据,另外一个普通的副本,是异步同步数据,当leader挂掉之后, 会优先从ISR副本列表中选取一个作为leader,因为ISR是同步保存数据,数 据更加的完整一些,所以优先选择ISR副本列表

面试官:Kafka数据清理机制了解过嘛

候选人:

嗯,了解过~~

Kafka中topic的数据存储在分区上,分区如果文件过大会分段存储segment

每个分段都在磁盘上以索引(xxxx.index)和日志文件(xxxx.log)的形式存储,

这样分段的好处是,第一能够减少单个文件内容的大小,查找数据方便,第 二方便kafka进行日志清理。

在kafka中提供了两个日志的清理策略:

第一,根据消息的保留时间,当消息保存的时间超过了指定的时间,就会触 发清理,默认是168小时(7天)

第二是根据topic存储的数据大小,当topic所占的日志文件大小大于一定的阈 值,则开始删除最久的消息。这个默认是关闭的

这两个策略都可以通过kafka的broker中的配置文件进行设置

面试官:Kafka中实现高性能的设计有了解过嘛

 

候选人:

Kafka 高性能,是多方面协同的结果,包括宏观架构、分布式存储、 ISR 数据 同步、以及高效的利用磁盘、操作系统特性等。主要体现有这么几点:

消息分区:不受单台服务器的限制,可以不受限的处理更多的数据

顺序读写:磁盘顺序读写,提升读写效率

页缓存:把磁盘中的数据缓存到内存中,把对磁盘的访问变为对内存的访问

零拷贝:减少上下文切换及数据拷贝

消息压缩:减少磁盘IO和网络IO

分批发送:将消息打包批量发送,减少网络开销

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

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

相关文章

学习SVN

学习SVN 摘要1.简介2.下载安装3.SVN生命周期4.SVN Server搭建5.SVN Client使用6.git与SVN的区别 SVN 官网 Github SVN 源码 摘要 本篇博客对SVN的基础使用进行总结,以便加深理解和记忆 1.简介 SVN是Apache Subversion的缩写,是一个开源的源码版本控制…

java-ssm-jsp-基于ssm的宝文理学生社团管理系统

java-ssm-jsp-基于ssm的宝文理学生社团管理系统 获取源码——》公主号:计算机专业毕设大全

应对高并发的软件架构之道

在去年年终总结的时候,我提出了这样的困惑,究竟什么是真正的技术能力,是对于各种底层技术的钻研吗?钻研是好事,但实践下来,深入钻研并不在实际工作中有用,且钻研的越深,忘得越快&…

AIGC安全研究简述(附资料下载)

2023 AIGC技术实践及展望资料合集(29份).zip 2023 AIGC大型语言模型(LLM)实例代码合集.zip 2023大模型与AIGC峰会(公开)PPT汇总(25份).zip AIGC的安全研究是一个复杂且重要的领域,涉及多个关键…

Leetcode : 1137. 高度检查器

学校打算为全体学生拍一张年度纪念照。根据要求,学生需要按照 非递减 的高度顺序排成一行。 排序后的高度情况用整数数组 expected 表示,其中 expected[i] 是预计排在这一行中第 i 位的学生的高度(下标从 0 开始)。 给你一个整数…

一篇搞懂什么是LRU缓存|一篇搞懂LRU缓存的实现|LRUCache详解和实现

LRUCache 文章目录 LRUCache前言项目代码仓库什么时候会用到缓存(Cache)缓存满了,怎么办?什么是LRUCacheLRUCache的实现LRUCache对应的OJ题实现LRUCache对应的STL风格实现 前言 这里分享我的一些博客专栏,都是干货满满的。 手撕数据结构专栏…

什么是测试用例?如何设计?

在学习或者实际的测试工作中经常都会提到“测试用例”这个词,没错,测试用例是测试工作的核心,不管要做的是什么样的测试,在真正动手执行测试之前,我们都需要先根据软件需求来设计测试用例,之后再依据设计好…

动态加权平衡损失:深度神经网络的类不平衡学习和置信度校准

系列文章目录 文章目录 系列文章目录前言一、研究目的二、研究方法创新点处理类不平衡的大多数方法交叉熵损失函数Brier Score 三、DWB Loss总结 前言 Dynamically Weighted Balanced Loss: ClassImbalanced Learning and Confidence Calibration of Deep Neural Networks 下载…

2024年3月10日 十二生肖 今日运势

小运播报:2024年3月10日,星期日,农历二月初一 (甲辰年丁卯月癸酉日),法定节假日。 红榜生肖:龙、牛、蛇 需要注意:鸡、狗、兔 喜神方位:东南方 财神方位:…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Image)

Image为图片组件,常用于在应用中显示图片。Image支持加载PixelMap、ResourceStr和DrawableDescriptor类型的数据源,支持png、jpg、jpeg、bmp、svg、webp和gif类型的图片格式。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容&am…

作业 字符数组-统计和加密

字串中数字个数 描述 输入一行字符&#xff0c;统计出其中数字字符的个数。 输入 一行字符串&#xff0c;总长度不超过255。 输出 输出为1行&#xff0c;输出字符串里面数字字符的个数。 样例 #include <iostream> #include<string.h> using namespace std; int m…

AI绘画提示词案例(宠物

目录 1. 雪地猫猫&#xff1a;1.1 提示词&#xff1a;1.2 效果&#xff1a; 2. 趴地猫猫&#xff1a;2.1 提示词&#xff1a;2.2 效果&#xff1a; 3. 长城萨摩耶&#xff1a;3.1 提示词&#xff1a;3.2 效果&#xff1a; 4. 沙发猫猫&#xff1a;4.1 提示词&#xff1a;4.2 效…

[BT]小迪安全2023学习笔记(第21天:Web攻防-JWT)

第21天 JSON Web Token&#xff08;JWT&#xff09; JWT是一种紧凑且自包含的方式&#xff0c;用于在网络上安全地传输信息作为JSON对象。这些信息可以被验证和信任&#xff0c;因为它们是数字签名的。JWT通常用于身份验证和信息交换&#xff0c;下面是一个简化的JWT示例&…

Mysql:如何自定义导出表结构

为了方便将mysql表结构信息快速录入到word或Excel表格中&#xff0c;最终实现如下效果&#xff1a; 对于word,则可将Excel表格复制粘贴即可。 废话不多少&#xff0c;开干。 准备准建&#xff1a;navicat 或sqlyog 第一步&#xff1a;编辑sql&#xff0c;如&#xff1a; SE…

P5461 赦免战俘

来自-赦免战俘 - 洛谷 参考&#xff1a;题解 P5461 【赦免战俘】 - 洛谷专栏 代码&#xff1a; #include <iostream> #include <math.h> //利用pow()函数算次方 using namespace std; int a[1500][1500]; //因为最大每边顶多有2^101024人&#xff0c;所以1500…

HTML 01

1.html使用标签来表达 结束标签多一个/ <strong>文字内容</strong> <hr> 包裹内容就是双标签&#xff0c;换行等是单标签 浏览器中显示内容&#xff1a; 2.html的骨架是网页模板 <!DOCTYPE html> <html lang"en"> <head>&l…

Full GC的认识、预防和定位

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ &#x1f440;&#x1f440;&#x1f440; 个人博客&#xff1a;小奥的博客 &#x1f44d;&#x1f44d;&#x1f44d;&#xff1a;个人CSDN ⭐️⭐️⭐️&#xff1a;传送门 &#x1f379; 本人24应届生一枚&#xff0c;技术和水平有限&am…

【leetcode】429. N 叉树的层序遍历

题目描述 给定一个 N 叉树&#xff0c;返回其节点值的_层序遍历_。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;。 树的序列化输入是用层序遍历&#xff0c;每组子节点都由 null 值分隔&#xff08;参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;…

使用Python编写简单学生管理系统

学完python基础&#xff0c;把学过的知识运用起来做一个简单的学生管理系统 1、需求分析 需求&#xff1a;进入系统显示系统功能界面&#xff0c;功能如下&#xff1a; ① 添加学员信息 ② 删除学员信息 ③ 修改学员信息 ④ 查询学员信息(只查询某个学员) ⑤ 遍历所有学…

【蓝桥杯】蓝桥杯算法复习(一)

&#x1f600;大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#x1f62b;&#xff0c;但是也想日更的人✈。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4…