MQ面试题

一、部署架构了解么?

1.1、生产者

1.2、消费者

1.3、brocker

负责接收生产者的消息并且储存起来,同时转发给消费者;

1.4、nameServer

类似注册中心,所有的brocker通过长链接和nameserver链接;通过心跳的方式定期的发送消息给nameserver;每个nameserver节点是对等的;

二、部署类型

RocketMQ有4种部署类型

2.1、单Master

单机模式, 即只有一个Broker

2.1.1、优点

简单

2.1.2、缺点

高性能差

高可用差

单点问题, 如果Broker宕机了, 会导致RocketMQ服务不可用, 不推荐使用

2.2、多Master模式

组成一个集群, 集群每个节点都是Master节点, 配置简单, 性能也是最高, 某节点宕机重启不会影响RocketMQ服务

2.2.1、优点

解决了高性能

2.2.2、缺点

高可用未解决

如果某个节点宕机了, 会导致该节点存在未被消费的消息在节点恢复之前不能被消费

2.3、多Master多Slave模式,异步复制

每个Master配置一个Slave, 多对Master-Slave, Master与Slave消息采用异步复制方式, 主从消息一致只会有毫秒级的延迟

2.3.1、优点

是弥补了多Master模式(无slave)下节点宕机后在恢复前不可订阅的问题。在Master宕机后, 消费者还可以从Slave节点进行消费。采用异步模式复制,提升了一定的吞吐量。总结一句就是,采用多Master多Slave模式,异步复制模式进行部署,系统将会有较低的延迟和较高的吞吐量

2.3.2、优点

就是如果Master宕机, 磁盘损坏的情况下, 如果没有及时将消息复制到Slave, 会导致有少量消息丢失

2.4、多Master多Slave模式,同步双写

与多Master多Slave模式,异步复制方式基本一致,唯一不同的是消息复制采用同步方式,只有master和slave都写成功以后,才会向客户端返回成功

2.4.1、优点

数据与服务都无单点,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高

2.4.2、缺点

缺点就是会降低消息写入的效率,并影响系统的吞吐量

实际部署中,一般会根据业务场景的所需要的性能和消息可靠性等方面来选择后两种

三、rocketmq如何保证高可用性?

3.1、数据高可用

一主多从;多分数据容灾;

同步双写等;

3.2、服务高可用

3.2.1、nameServer的集群化部署

每一台nameserver都是对等的;存储的信息通过分布式同步机制,保证了数据的一致性;任何一台nameServer挂了都不影响整体的服务能力

3.2.2、broker的集群化部署

1、如果一台broker挂了,生产者通过负载均衡;会发送消息到其他broker;

2、如果一台broker的master节点挂了,consumer会自动切换到slaver节点

3.2.3、同步机制

1、异步:只要master写入成功,直接返回成功,异步复制到slave

2、同步:master和slave都写成功才返回成功

四、rocketmq的工作流程是怎样的?

1、首先启动nameServer:等待broker/productor/consumer连接上来

2、启动broker:会跟所有的NameServer建立并保持一个长连接,定时发送心跳包。心跳包中包含当前Broker信息(ip、port等)、Topic信息以及Borker与Topic的映射关系

3、创建topic:创建时需要制定topic储存在那些broker上,可以在发送消息都时候直接创建TOPIC

4、Producer发送消息:启动的时候先和NameServer集群上的一台机器建立长链接,获取到当前发送消息到TOPIC的所有boker信息;然后从队列列表中轮询选择一个队列,与队列所在的Broker建立长连接,进行消息的发送

5、Consumer消费消息:和其中一套NameServer建立长链接,获取topic在多broker,然后和broker建立长链接进行消费;

五、rocketmq的底层存储机制

5.1、commitLog顺序写

我们知道,操作系统每次从磁盘读写数据的时候,都需要找到数据在磁盘上的地址,再进行读写。而如果是机械硬盘,寻址需要的时间往往会比较长而一般来说,如果把数据存储在内存上面,少了寻址的过程,性能会好很多;
但Kafka 的数据存储在磁盘上面,依然性能很好,这是为什么呢?
这是因为,Kafka采用的是顺序写,直接追加数据到末尾。实际上,磁盘顺序写的性能极高,在磁盘个数一定,转数一定的情况下,基本和内存速度一致
因此,磁盘的顺序写这一机制,极大地保证了Kafka本身的性能

5.2、零拷贝

传统方式实现:
先读取、再发送,实际会经过以下四次复制
1、将磁盘文件,读取到操作系统内核缓冲区Read Buffer
2、将内核缓冲区的数据,复制到应用程序缓冲区Application Buffer
3、将应用程序缓冲区Application Buffer中的数据,复制到socket网络发送缓冲区
4、将Socket buffer的数据,复制到网卡,由网卡进行网络传输


传统方式,读取磁盘文件并进行网络发送,经过的四次数据copy是非常繁琐的
重新思考传统IO方式,会注意到在读取磁盘文件后,不需要做其他处理,直接用网络发送出去的这种场景下,第二次和第三次数据的复制过程,不仅没有任何帮助,反而带来了巨大的开销。那么这里使用了零拷贝,也就是说,直接由内核缓冲区Read Buffer将数据复制到网卡,省去第二步和第三步的复制。

那么采用零拷贝的方式发送消息,必定会大大减少读取的开销,使得RocketMq读取消息的性能有一个质的提升

此外,还需要再提一点,零拷贝技术采用了MappedByteBuffer内存映射技术,采用这种技术有一些限制,其中有一条就是传输的文件不能超过2G,这也就是为什么RocketMq的存储消息的文件CommitLog的大小规定为1G的原因

小结:RocketMq采用文件系统存储消息,并采用顺序写写入消息,使用零拷贝发送消息,极大得保证了RocketMq的性能

六、RocketMq的存储结构是怎样的


1、CommitLog-存储所有的消息元数据,包括Topic、QueueId以及message

2、CosumerQueue-消费逻辑队列:存储消息在CommitLog的offset

3、IndexFile-索引文件:存储消息的key和时间戳等信息,使得RocketMq可以采用key和时间区间来查询消息

也就是说,rocketMq将消息均存储在CommitLog中,并分别提供了CosumerQueue和IndexFile两个索引,来快速检索消息

七、RocketMq性能比较高的原因?

1、写入高性能:顺序写

2、消费的高性能:零拷贝

一、如何让RocketMQ保证消息的顺序消费

二、RocketMQ如何保证消息不丢失

三、rocketMQ的消息堆积如何处理

四、RocketMQ在分布式事务支持这块机制的底层原理?

五、让你来动手实现一个分布式消息中间件,整体架构

13、高吞吐量下如何优化生产者和消费者的性能?

开发
同一group下,多机部署,并行消费
单个Consumer提高消费线程个数
批量消费
消息批量拉取
业务逻辑批量处理
运维
网卡调优
jvm调优
多线程与cpu调优
Page Cache

一、RocketBroker中的消息被消费后会立即删除吗?

二、RocketMQ消费模式有几种?

2.1、集群模式

2.2、广播模式

三、消费消息是push还是pull

四、broker如何处理拉取请求的

五、RocketMQ如何做负载均衡

5.1、生产者

5.2、消费者

六、重复消费

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

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

相关文章

SketchUp Pro 2023 for Mac——打造你的创意之城

SketchUp Pro 2023 for Mac是一款专业级的3D建模软件,为你提供最佳的设计和创意工具。不论你是建筑师、室内设计师,还是爱好者,SketchUp Pro都能满足你对于创意表达的需求。 SketchUp Pro 2023拥有强大而直观的界面,让你轻松绘制…

【小程序 - 加强】自定义组件、使用npm包、全局数据共享、分包_05

目录 一、自定义组件 1. 组件的创建与引用 1.1 创建组件 1.2 引用组件 1.2.1 局部引用组件 1.2.2 全局引用组件 1.2.3 全局引用 VS 局部引用 1.2.4 组件和页面的区别 2. 样式 2.1 组件样式隔离 2.2 组件样式隔离的注意点 2.3 修改组件的样式隔离选项 2.4 styleIso…

Springboot+vue的在线试题题库管理系统(有报告),Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的在线试题题库管理系统(有报告),Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的在线试题题库管理系统,采用M&…

双重差分模型(DID)论文写作指南与操作手册

手册链接:双重差分模型(DID)论文写作指南与操作手册https://www.cctalk.com/m/group/90983583?xh_fshareuid60953990 简介: 当前,对于准应届生们来说,毕设季叠加就业季,写作时间显得十分宝贵…

嵌入式软件架构中抽象层设计方法

大家好,今天分享一篇嵌入式软件架构设计相关的文章。 软件架构这东西,众说纷纭,各有观点。什么是软件架构,我们能在网上找到无数种定义。 比如,我们可以这样定义:软件架构是软件系统的基本结构&#xff0c…

MyBatis的关联映射

目录 ​编辑 文章目录 前言 一、表与表之间的关系 一对一: 一对多: 多对一: 多对多: 二、多对一 1.创建接口MoreMapper 在MoreMapper里面写入方法,通过员工ID来查询员工的信息以及部门的信息,员…

ChatGPT启蒙之旅:弟弟妹妹的关键概念入门

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

基于Java的校园二手书交易平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

【数据结构】堆,堆的实现,堆排序,TOP-K问题

大家好!今天我们来学习数据结构中的堆及其应用 目录 1. 堆的概念及结构 2. 堆的实现 2.1 初始化堆 2.2 销毁堆 2.3 打印堆 2.4 交换函数 2.5 堆的向上调整 2.6 堆的向下调整 2.7 堆的插入 2.8 堆的删除 2.9 取堆顶的数据 2.10 堆的数据个数 2.11 堆的判…

C/C++学习 -- 分组密算法(3DES算法)

1. 3DES算法概述 3DES(Triple Data Encryption Standard),又称为TDEA(Triple Data Encryption Algorithm),是一种对称加密算法,是DES(Data Encryption Standard)的加强版…

GPT系列论文解读:GPT-1

GPT系列 GPT(Generative Pre-trained Transformer)是一系列基于Transformer架构的预训练语言模型,由OpenAI开发。以下是GPT系列的主要模型: GPT:GPT-1是于2018年发布的第一个版本,它使用了12个Transformer…

【STL】用哈希表(桶)封装出unordered_set和unordered_map

⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏留言 ⭐系列专栏:C进阶 ⭐代码仓库:C进阶 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我…