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,一经查实,立即删除!

相关文章

H12-821_324

324.以下关于AC漫游组的描述,说法错误的是? A.漫游组的AC需要部署一台Master Controller B.AC可担任多个漫游组的漫游组服务器,同时自身可加入多个漫游组 C.Master Contoller必须为漫游组内的AC D.STA只能在同一个漫游组内的AC间才能进行漫游 答案:BC …

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、中继器 中继器是局域网互连的最简单…

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

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

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

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

openssl3.2 - 官方demo学习 - kdf - argon2.c

文章目录 openssl3.2 - 官方demo学习 - kdf - argon2.c概述笔记END openssl3.2 - 官方demo学习 - kdf - argon2.c 概述 设置KDF算法的参数, 并获得key 笔记 /*! \file argon2.c \note openssl3.2 - 官方demo学习 - kdf - argon2.c 设置KDF算法的参数, 并获得key *//** Copy…

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

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

Nginx Proxy反向代理

Nginx Proxy 反向代理 1. 反向代理原理2. 正/反向代理的区别2.1. 正向代理2.2. 反向代理 3. 知识扩展3.1. HTTP Server 和 Application Server的区别和联系3.2. 静态资源和动态资源的区别 4. Nginx Proxy 配置4.1. 配置源站服务器4.2. 配置 Nginx 反向代理服务器4.3. Nginx pro…

小程序打包发行流程

工具 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…

DAY25:回溯算法组合题216、17

Leetcode: 216 组合总和III 经过了昨天组合的题目的学习,这道题比较简单,套用之前的模板就可以 基本思路 终止条件,遇到向量的个数一样,并且sum等于n的时候终止。输入变量,n,k,还有起始的idx和基于当前元…

2024.1.19

今天狠狠地复习了一下C语言,不复习不知道,一复习吓一跳昂,这感觉好多都忘却了,这并非一件好事,所以说还好复习了,不然考试就有点问题了,但是还好写一下这些代码就马上想起来了,所以说…

如何快速申请GPT账号?

详情点击链接:如何快速申请GPT账号?​​​​​​​ 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析,AI画图,图像识别,文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude…

search——Bloom Filter

详情,看这一篇博客 package mainimport ("fmt""math""strconv" )type BloomFilter struct {*bitMapk uint64 // hash function countm uint64 // bits array lengthn uint64 // insert n numberp float64 //…

递归组件怎么实现无线滚动

递归组件实现无限滚动的方法通常涉及到对数据的递归处理和组件的自我调用。以下是一个简单的示例,展示如何使用递归组件实现无限滚动: 首先,定义一个递归组件,该组件可以调用自己来渲染下一组数据。假设我们要展示一个滚动列表&a…

什么是vue的sync语法糖如何使用

Vue的sync语法糖是用于实现子组件修改父组件数据的双向绑定。在Vue中,默认是单向数据流,子组件不能直接修改父组件的数据。但是有些情况下,我们需要子组件能够修改父组件的数据,这时就可以使用sync语法糖。 使用sync语法糖的步骤…

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

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