RocketMQ常见面试题及答案梳理

news2024/9/24 18:18:30

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.coloradmin.cn/o/1397270.html

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

相关文章

【论文阅读】ControlNet、文章作者 github 上的 discussions

文章目录 IntroductionMethodControlNetControlNet for Text-to-Image DiffusionTrainingInference Experiments消融实验定量分析 在作者 github 上的一些讨论消融实验更进一步的探索Precomputed ControlNet 加快模型推理迁移控制能力到其他 SD1.X 模型上其他 Introduction 提…

深入探究Python的filter()函数

Python是一种多用途的编程语言,提供了许多内置函数,以简化和增强代码的可读性。其中一个强大的函数就是​filter()​。在本文中,我们将深入研究​filter()​函数,探讨其用途、语法和实际示例,以了解如何在Python编程中…

3.C语言——函数

函数 1.什么是函数2.函数的分类1.库函数2.自定义函数 3.函数的参数1.实际参数(实参)2.形式参数(形参) 4.函数的声明1.同一个文件的函数声明2.多文件的函数声明 5.函数的调用6.函数的嵌套调用和链式访问1.嵌套调用2.链式访问 7.函数…

CSS中隐藏页面元素的几种方式和区别

前言、 在平常的样式排版中,我们经常遇到将某个模块隐藏的场景,通过css隐藏的元素方法有很多种,它们看起来实现的效果是一致的,但实际上每一种方法都有一丝轻微的不同,这些不同决定了在一些特定场合下使用哪一种方法。…

POKT Network (POKT) :进军百亿美元市场规模的人工智能推理市场

POKT Network(又称 Pocket Network)是一个去中心化的物理基础设施网络(DePIN),它能够协调并激励对任何开放数据源的访问,最初专注于向应用程序和服务提供商提供区块链数据。 自 2020 年主网上线以来&#x…

图像分割实战-系列教程15:deeplabV3+ VOC分割实战3-------网络结构1

🍁🍁🍁图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 本项目的网络结构在network文件夹中,主要在modeling.py和_deeplab.py中: mo…

利用浏览器开发者工具进行网页性能优化

目录 学习目标: 学习内容: 学习时间: 学习产出: 网页性能优化的基本概念和指标: 浏览器开发者工具的基本功能和使用方法: 使用网络面板进行网页加载性能分析: 使用性能面板进行网页渲染性能分析…

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

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

机器学习:何为监督学习和无监督学习

目录 一、监督学习 (一)回归 (二)分类 二、无监督学习 聚类 一、监督学习 介绍:监督学习是指学习输入到输出(x->y)映射的机器学习算法,监督即理解为:已知正确答案…

【算法】斐波那契数列 [递推,矩阵快速幂]

方法一. 递推 class Solution { public:int fib(int n) {int MOD 1e9 7;if (n < 2) return n;int p 0, q 0, r 1;for (int i 2; i < n; i) {p q;q r;r (p q) % MOD;}return r;} }; 方法二&#xff1a;矩阵快速幂 class Solution { public:const int MOD 1e…

AI 编程的机会和未来:从 Copilot 到 Code Agent

大模型的快速发展带来了 AI 应用的井喷。统计 GPT 使用情况&#xff0c;编程远超其他成为落地最快、使用率最高的场景。如今&#xff0c;大量程序员已经习惯了在 AI 辅助下进行编程。数据显示&#xff0c;GitHub Copilot 将程序员工作效率提升了 55%&#xff0c;一些实验中 AI …

《Python数据分析技术栈》第01章 03 Python基础(Python Basics)

03 Python基础&#xff08;Python Basics&#xff09; 《Python数据分析技术栈》第01章 03 Python基础&#xff08;Python Basics&#xff09; In this section, we get familiar with the syntax of Python, commenting, conditional statements, loops, and functions. 在…

dns正反解析配置

1.配置正向解析baidu.com 1、下载bind包 [rootlocalhost ~]# yum install bind -y 2、对配置文件修改 [rootlocalhost ~]# vim /etc/named.conf 3、对数据文件修改 [rootlocalhost ~]# vim /var/named/baidu 4、重启服务 [rootlocalhost ~]# systemctl restart named.service 5…

2.【C语言】(函数指针||sizeof||笔试题)

0x01.函数指针 void test(const char* str) {printf("%s\n", str); }int main() {void (*pf)(const char*) test;//pf是函数指针变量void (*pfarr[10])(const char*);//pfarr是存放函数指针的数组void (*(*p)[10])(const char*) &pfarr;//p是指向函数指针数组…

ROS学习笔记8——实现ROS通信时的常用命令

机器人系统中启动的节点少则几个&#xff0c;多则十几个、几十个&#xff0c;不同的节点名称各异&#xff0c;通信时使用话题、服务、消息、参数等等都各不相同&#xff0c;一个显而易见的问题是: 当需要自定义节点和其他某个已经存在的节点通信时&#xff0c;如何获取对方的话…

【Docker】Nacos的单机部署及集群部署

一、Nacos的介绍 Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 动态服务发现&#xff1a;Nacos支持DNS与RPC服务发现&#xff0c;提供原生SDK、OpenAPI等多种服务注册方式和DNS、HTTP与API等多种服务发现方式。服务健康监测&#xff1a;Nacos提供…

VUE组件--动态组件、组件保持存活、异步组件

动态组件 有些场景可能会需要在多个组件之间进行来回切换&#xff0c;在vue中则使用<component :is"..."> 来实现组件间的来回切换 // App.vue <template><component :is"tabComponent"></component><button click"change…

基于Springboot+vue图书管理系统(前后端分离)

该项目完全免费 项目技术栈前后端分离&#xff1a; 后端&#xff1a;Springboot Mybatis-plus 前端&#xff1a;Vue ElementUI 数据库&#xff1a; MySQL 项目功能描述 管理员&#xff1a; 登录、个人信息、修改密码、管理后台管理系统所有数据 首页统计&#xff1a;…

64.Spring事件监听的核心机制是什么?

Spring事件监听的核心机制是什么? spring的事件监听有三个部分组成 事件(ApplicationEvent) 负责对应相应监听器 事件源发生某事件是特定事件监听器被触发的原因监听器(ApplicationListener) 对应于观察者模式中的观察者。监听器监听特定事件,并在内部定义了事件发生后的响应…

0.96寸OLED-单独驱动和U8g2驱动-硬件软件IIC

0.96寸OLED-单独驱动和U8g2驱动-硬件软件IIC 博主平时DIY经常使用OLED&#xff0c;其中以4脚的I2C屏最多&#xff0c;就想着总结一下子&#xff0c;让广大DIY朋友更容易找到资源。 驱动采用的时SSD1306 同学们拿到代码后&#xff0c;可以直接用&#xff0c;其中博主给的代码默认…