RocketMQ常见面试题及答案梳理

1、RocketMQ有什么作用?

  1. 异步:数据的产生方不需要关心谁来使用数据,只需要将数据发送到broker,后续需要管消费流程,Rocket也有保证消息可靠性的方案
  2. 消峰:正常业务系统当流量激增时,有可能会将系统压垮,有了消息队列可以将大量请求缓存起来,慢慢进行消费处理
  3. 解耦:系统的耦合性越高,容错性就越低,以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用。这时可以用MQ进行解耦,生产者向broker投递消息,即使子系统出现故障也会先保存在broker中,当故障恢复时,消费者会通过消费队列获取消息

2.RoctetMQ的架构

  • NameServer:类似于注册中心,管理组件的注册实例信息,不参与消息的传输
  • produce:生产者,消息的发送方
  • Consumer:消费者,消息消费方
  • broker:暂存和传输消息(包含:commitLog、ConsumeQueue、IndexFile)
  • Topic:区分消息的种类,一个发送者可以发送消息给一个或者多个Topic;一个消息的接收者可以订阅一个或者多个Topic消息
  • commitLog:CommitLog是存储消息的主体;borker接收到生产者投递来的消息,会存储到commitLog文件中
  • ConsumeQueue:逻辑消费队列;可以看成基于topic的commitLog的索引文件因为CommitLog是按照顺序写入的,不同的topic消息都会混淆在一起,而Consumer又是按照topic来消费消息的,这样的话势必会去遍历commitLog文件来过滤topic,这样性能肯定会非常差,所以rocketMq采用ConsumeQueue来提高消费性能。即每个Topic下的每个queueId对应一个Consumequeue
  • IndexFile:IndexFile提供了一种可以通过key(topic+msgId)或时间区间来查询消息的方法

3、 RoctetMQ的优缺点

3.1消息堆积的问题:

        如果生产者大量发送消息,消费者消费能力不够,会造成broker消息堆积,需要根据实际场景制定解决方案。

3.2系统复杂度提高

MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。如何保证消息没有被重复消费?怎么处理消息丢失情况?那么保证消息传递的顺序性?

3.3一致性问题

A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败。如何保证消息数据处理的一致性?

4.RoctetMQ顺序消息,如何保证顺序

1)全局有序:可以为Topic设置一个消息队列,使用一个生产者单线程发送数据,消费者端也使用单线程进行消费,从而保证消息的全局有序,但是这种方式效率低,多个消息队列同时消费是无法绝对保证消息的有序性的。

2)局部有序:可以定义一个特定的字段通过运算取模进行投递特定的队列中,消费者端使用MessageListenerOrderly处理有序消息。

5. 消息过滤,如何实现

两种方案:1)一种是在broker端按照Consumer的去重逻辑进行过滤,这样做的好处是避免了无用的消息传输到Consumer端,缺点是加重了Broker的负担;2)在comsumer端进行过滤,无用的消息不进行处理

6.消息的幂等性问题

幂等性原则:就是用户对于同一种操作发起的多次请求的结果是一样的,不会因为操作了多次就产生不一样的结果

解决方案:1)在数据库中做好唯一约束,2)通过redis保存每条消息唯一的key,消费重复消息时先去redis判断key是否已存在

7.RocketMQ是怎么实现分布式事务消息的?

正常事务提交:

1)消费者向borker投递消息时,不是Commit/Rollback状态所以还是半消息,

2)当borker接收到半消息时(此时的消息消费者不可见)也并不会提供给消费者;

3)当生产者知道向broker投送消息成功执行本地事务

4)生产者本地事务完成后向borker发送Commit/Rollback,borker确认状态后根据状态进行投递或删除

补偿流程: 

  1. broker对没有Commit/Rollback的事务状态消息,从服务端发起一次“回查”
  2. Producer收到回查消息,检查回查消息对应的本地事务的状态
  3.  根据本地事务状态,重新Commit/Rollback

事务有三个状态


public enum LocalTransactionState {//本地事务执行成功,给broker发送一个commit的标识COMMIT_MESSAGE,ROLLBACK_MESSAGE,//这个状态将会引起回查UNKNOW,
}

8.什么是分布式消息中的半消息?

半消息是只生产者向broker发送消息时,还没经过两次确认的消息,此时的状态标记为“不可消费”状态,所以暂时对消费者不可见

9.消息的可用性,RocketMQ如何能保证消息的可用性/可靠性?

需要从Producer,Consumer和Broker三个方面来回答:

9.1.producer方面:

  • 同步发送,即发送一条数据等到接受者返回响应之后再发送下一个数据包
  • 异步发送,生产者发送消息时在数据库记录投递状态表,broker接收到进行持久化后才会回调生产者。这时生产者确认投递状态,如果在异步发送后生产者宕机就接收不到回调了,这时可以另外用一个定时任务去查询投递状态表是否有消息长时间未投递成功。
  • 发送分布式事务消息的投递方式

9.2broker方面:

消息只要持久化到CommitLog(日志文件)中,即使Broker宕机,未消费的消息也能重新恢复再消费

9.3Consumer方面

Consumer自身维护了个持久化的offset(对应Message Queue里的min offset),用来标记已经成功消费且已经成功发回Broker的消息下标。如果Consumer消费失败,它会向Broker发回消费失败的状态,发回成功才会更新自己的offset。如果发回给broker时broker挂掉了,Consumer会定时重试,如果Consumer和Broker一起挂掉了,消息还在Broker端存储着,Consumer端的offset也是持久化的,重启之后继续拉取offset之前的消息进行消费。 

10.RocketMQ的刷盘机制是什么?

RocketMQ的存储与读写是基于JDK NIO的内存映射机制,消息存储时首先将消息追加到内存中。通过配置刷盘策略将内存消息数据保存到磁盘文件中。

RocketMQ提供了两种刷盘策略:同步刷盘和异步刷盘

  • 同步刷盘

在消息达到Broker的内存之后,必须刷到commitLog日志文件中才算成功,然后返回Producer数据已经发送成功。

  • 异步刷盘(默认)

异步刷盘是指消息达到Broker内存后就返回Producer数据已经发送成功,会唤醒一个线程去将数据持久化到CommitLog日志文件中。

优缺点分析

同步刷盘能保证消息抵达broker后不丢失,如果是异步刷盘当producer发来消息后响应成功,另外开启一个线程刷盘时,此时刚好borker出现问题无法正常执行。这是消息可能就无法刷到commitLog中。

异步刷盘吞吐量比同步刷盘高,响应速度快 

11.RocketMQ怎么实现负载均衡

11.1Producer负载均衡:

在给borker发送消息时,会根据从NameServer获取到的broker集群实例列表,通过轮训的策略进行投递。

11.2Consumer负载均衡

集群模式:

首先理解Broker是如何与Consumer进行消息交互的,是Consumer主动向Borker的Consumer queue拉取消息的;而一个queue只能对应一个Consumer实例,而Consumer实例可以同时消费多个queue,处于多对一的关系。那么如果在系统运行过程中我又启动了多个Consumer,这时会有一个重平衡机制,让新启动的Consumer分配到queue。

问题:如果只有3个queue和3个Consumer实例,刚好是一 一对应的,这时新增consumer实例,queue数量不够的话,新增的实例就分配不到queue

广播模式:

广播模式会让一条消息让所有订阅的消费者组的实例都进行消费,会让所有consumer都分到所有的queue

12.什么是死信?

当一条消息无法正常消费的时会被投递到死信队列,比如一条消息初次消费失败或超时,消息队列会自动进行消费重试累计默认16次;达到最大重试次数后,消息队列不会立刻将消息丢弃而是暂时存放到死信队列中。

死信队列的特征

  • 死信消息会保存三天后(CommitLog的过期时间)被删除 
  • RocketMQ会为每个消费组都设置一个Topic名称为 %DLQ%+consumerGroup 的死信队列

13.什么是推拉消息模式?

PULL:拉取模式为消费者主动从broker中拉取消息消费,只要拉取到消息,就会启动消费过程

PUSH:推模式为消费者就是要注册消息的监听器,监听器是要用户自行实现的。当消息达到broker服务器后,消费者端会触发监听器拉取消息进行消费。但是从实际上看还是从broker中拉取消息

14.RocketMQ Broker中的消息被消费后会立即删除吗?

不会,每条消息都会持久化到CommitLog中,每个Consumer连接到Broker后会维持消费进度信息(offset),当有消息消费后只是当前Consumer的消费进度(offset)更新了。

 15.RocketMQ的消息存储结构是怎么样的?

消息会通过messageStore消息存储管理器将消息储存在broker的commitLog中,而CommitLog结构包含

  • ConsumeQueue:逻辑消费队列;可以看成基于topic的commitLog的索引文件因为CommitLog是按照顺序写入的,不同的topic消息都会混淆在一起,而Consumer又是按照topic来消费消息的,这样的话势必会去遍历commitLog文件来过滤topic,这样性能肯定会非常差,所以rocketMq采用ConsumeQueue来提高消费性能。即每个Topic下的每个queueId对应一个Consumequeue
  • IndexFile:IndexFile提供了一种可以通过key(topic+msgId)或时间区间来查询消息的方法

MessageStoreConfig:消息存储配置对象 

文件目录:storePathRootDir\store下的commitLog、Consume Queue、index等 

 

另外borker持久化文件中还会储存一些其他数据,比如offset、topic等

文件目录:storePathRootDir\store\config下的json文件数据(consumerFilter.json,consumerOffset.json,subscriptionGroup.json,topics.json)
 

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

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

相关文章

ChatGPT正确打开方式与GPT-4.5的key最新获取方式

前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

【2015~2024】大牛直播SDK演化史

大牛直播SDK的由来 大牛直播SDK始于2015年,最初我们只是想做个低延迟的RTMP推拉流解决方案,用于移动单兵等毫秒级延迟的场景下,我们先是实现了Android平台RTMP直播推送模块,当我们用市面上可以找到的RTMP播放器测试时延的时候&am…

网络设备的分类和功能、机柜布局、网络设备安装

网络互连设备根据不同层实现的机理不一样,又具体分为五类: 1、网络传输介质互联设备 2、网络物理层互联设备 3、数据链路层互联设备 4、网络层互联设备 5、应用层互联设备 常用设备 网络互联设备--互联设备 1、中继器 中继器是局域网互连的最简单…

恒创科技:云存储和网盘怎么区分出来?

随着互联网的发展,数据存储已成为人们日常生活中不可或缺的一部分。云存储和网盘是经常被人们提及的两种存储方式,均通过网络进行数据存储和访问的服务。但,它们在技术实现、数据安全性、访问方式和数据容量等方面存在一定的差异。要区分&…

三甲医院预约挂号系统源码,具备后台管理端和用户使用端,用户使用端包括:微信公众号、支付宝小程序

随着医疗行业的不断发展,预约挂号管理系统已成为医院管理中不可或缺的一部分。 预约挂号管理系统是一款综合性的预约挂号管理系统,帮助医院实现全方位的信息化管理,提高医疗服务质量和效率。支撑公众号、小程序、手机网上预约。 一款服务适用…

企业用户注册阿里云账号:为何选择企业实名认证及其五大优势

在数字化时代,云计算已成为企业运营不可或缺的一部分。阿里云,作为领先的云服务提供商,为企业用户提供了丰富的云产品和解决方案。但在享受这些服务之前,企业用户需要完成阿里云账号的注册和实名认证。本文将深入探讨为何企业用户…

小程序打包发行流程

工具 HBuilder X 、微信开发者工具、微信公众平台地址(微信公众平台) 配置 一、manifest.json 配置 通过 HBuilder X 打开 manifest.json 文件,找到 微信小程序配置,填写 微信小程序AppID,此 AppID 必须是本人有权…

Jvm相关知识(面试高级必备)

类的实例化顺序 先静态、先父后子 先静态:父静态>子静态 优先级:父类>子类 静态代码块>非静态代码块>构造函数 一个类的实例化过程: ①.父类的static代码块,当前类的static; ②.顺序执行…

freeswitch on centos dockerfile模式

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 centos7 docker上编译安装fs的流程记录,本文使用dockerfile模式。 环境 docker engine:Version 24.0.6 centos docker:7 freeswitch:v1.6.20 dockerfile 创建空目录…

力扣电话号码的组合

文章目录 题目说明做题思路代码实现代码解析 题目链接 题目说明 首先我们先分析一下这个题目题目中说呢先给出一个字符串这个字符串其实就是这个九键数字我们要按照要求将数字所代表的字符进行自由组合形成一个字符串并且这个字符串的长度和输入的数字字符串长度相同&#xff0…

第11章 GUI Page500~504 步骤三十二:打开画板文件02

各个图元类新增GetTypeName_Static(),并将原来的GetTypeName()改为调用静态方法实现: 直线: 圆: 十字: 矩形: 文字: tool_4_save_load.hpp添加两行 tool_4_save_load.cpp增加: 增加…

【资治通鉴】古代纪年法 ( 天干地支纪年法 | 木星纪年法 | 太岁纪年法 | 星次 | 天球 | 黄道带 | 四象二十八星宿 )

文章目录 一、天干地支纪年法二、木星纪年法1、星次2、天球3、黄道带 三、太岁纪年法四、四象二十八星宿1、四象与二十八星宿关联2、二十八星宿与星次关联3、西游记中的二十八星宿 2024 年 使用 天干地支纪年法是 甲辰年 , 使用 太岁纪年法是 阏逢执徐 ; 一、天干地支纪年法 天…

建筑能源管理系统

建筑能源管理系统是一种集成了先进的监测、控制、分析和优化技术的智能化系统,旨在提高建筑能源效率,降低能源消耗,减少环境污染,并为用户提供舒适、安全的建筑环境。通过监测建筑内的各种能源消耗情况,如电力、热水、…

arthas(阿尔萨斯)日常java代码调优使用命令

官方项目文档:https://gitee.com/arthas/arthas (最权威的教学还是得官网,这里仅作简单记录) 1:启动 java -jar arthas-boot.jar 2:查看cpu占用排名前三 thread -3 3:查看指定id thread 203 4:查…

数据结构day1

1.思维导图 2.定义一个简单宏或宏函数,实现两个数交换。 3.定义字符类型指针,指针指向n个连续堆区内存,输入,计算字符串长度 定义函数,实现内存申请 定义函数,解释字符串长度 定义函数,释放内…

河南文旅火爆出圈,来了解小魔推短视频矩阵的魅力!

最近几天四川文旅的抖音账号,1天发视频六十多条,增长粉丝20w,另外河北文旅抖音账号,一天发视频七十多条,增长粉丝30w,更有河南文旅抖音账号,单日发布上百条视频,实现涨粉15w&#xf…

最长上升子序列模型(LIS)

最长上升子序列模型就像它的名字一样,用来从区间中找出最长上升的子序列。它主要用来处理区间中的挑选问题,可以处理上升序列也可以处理下降序列,原序列本身的顺序并不重要。 模型 895. 最长上升子序列(活动 - AcWing&#xff0…

mysql原理--事务的隔离级别与 MVCC

1.事前准备 为了故事的顺利发展,我们需要创建一个表: CREATE TABLE hero (number INT,name VARCHAR(100),country varchar(100),PRIMARY KEY (number) ) EngineInnoDB CHARSETutf8;然后向这个表里插入一条数据:INSERT INTO hero VALUES(1, 刘…

如何才能拥有比特币 - 01 ?

如何才能拥有BTC 在拥有 BTC 之前我们要先搞明白 BTC到底保存在哪里?我的钱是存在银行卡里的,那我的BTC是存在哪里的呢? BTC到底在哪里? 一句话概括,BTC是存储在BTC地址中,而且地址是公开的,…

HTML111111111

在线编辑器 在线 HTML 空元素 没有内容的 HTML 元素被称为空元素。空元素是在开始标签中关闭的。 即使 在所有浏览器中都是有效的,但使用 其实是更长远的保障。 HTML 水平线 标签在 HTML 页面中创建水平线。 hr 元素可用于分隔内容。 HTML 折行 如果您希望…