java面试:有了解过RocketMq架构么?详细讲解一下

RocketMq是一个消息队列的常见架构,负责对消息的传递和管理,进而来保证服务的上下游具有一个相对较好的性能,因此在java的面试当中,RocketMq常常会最为一个考察要点来判断面试者对mq消息队列的熟悉程度,因此今天我们就对RocketMq消息队列进行分享和讲解,希望大家能从中学习到知识,能够有所收获。

1.RocketMq的数据结构

与kafka类似,RocketMq也是由发送信息的生产者,接受信息持久化到磁盘,以及接受消费者请求并处理的broker和类似于zoomkeepe的管理broker的轻量级注册中心NameServer和消费消息的消费者组成的。

2.RocketMq的topic

由于消息是有分类的,所以各种消息通过RocketMq的topic来进行分类,这样生产者就能将对应的消息发送到对应的topic的集群当中,而消费者只要订阅对应的topic就可以获取到对应需要的消息

但是同样的,我们知道一条消息是可以被多个消费者消费的,为了区分消费者的消费进度,于是RocketMq设置将topic下的信息以队列queue的方式来存储,因此通过queue当中的offset让对应的消费者进行保存,这样在下一次消费的时候,就可以通过消费者保存的offset来确认上一次的消费进度。

直到这里我们都会发现实际上RocketMq和kafka有许多的异同点,但事实上,RocketMq在topic当中还有一个tag属性,这是对消息的再一次精度的分类,是消息的精确度更高。

3.RocketMq的高可用

假设topic对应的所有queue都放在以台服务器上,那这个topic的性能瓶颈就由这台服务器来决定,为了解决这样的单机性能问题,topic下的queue被分为了多段,而每一段的queue只存储部分信息,而broker是集群,因此一个topic下的多个queue就可以被分散到不同的broker节点当中,这样我们单机存储的性能问题就被解决了。

不过依旧会存在一定的问题,首先就是虽然说消息被分散了出去,但RocketMq就只能保证单个queue队列中的消息是有序的,而同一个topic下的queue切片的有序性就无法保证了。

而其次就是,假设broker故障宕机了就会导致其所存储的部分queue数据就丢失了,这样的结果就是消息的完整性就相对较差了。

为了解决这个问题,RocketMq提供了一个对broker做主从的机制,每个主broker数据都会同步到其他的从broker节点当中,而当主节点宕机的情况出现,那么从节点就会转从为主,且主节点负责处理读写请求。

为了能够有效管理broker,注册中心nameserver主要是具有以下三项功能,首先是通过broker定时上报心跳来感知节点的改变,其次是掌管消息路由,让生产者组和消费者组知道具体发送和获取到哪个broker节点上,最后是负责集群的负载均衡和故障转移,提高系统的可用性。

4.RocketMq的生产消费者组

为了能够及时的将数据消费掉,因此RocketMq增加了消费者组的概念,多个消费者组成消费者组,而这些消费者组就能够并行的对消息进行消费。

不过RocketMq还设置了一个生产者组的概念,这个是kafka中并不具备的,而这个概念的产生是由于,kafka只是需求业务的高吞吐,而RocketMq是设计用来发送类似订单等关键重要事务的,因此就需要一个生产者有一个事务机制来帮助完成这些业务,所以需要broker知道所有的消费者与生产者都是谁,因此设计了一个生产者组来方便协调这些业务。

5.RocketMq的工作流程

为了保证工作流程顺利进行,RocketMq需要保证生产者要发送信息到哪个broker中,而消费者需要从那个broker中获取信息,因此RocketMq当中的broker集群会定时的向nameserver注册中心发送心跳包,这样nameserver就掌管了所有broker的topic和queue的信息。

生产者访问nameserver就能获取到路由信息,将消息发送给对应broker,而broker收到消息就会持久化到磁盘,然后同步数据给从节点。

消费者通过访问nameserver就可以获得订阅信息和路由信息,就知道去哪个broker中去拉取信息了。

今天的分享就到这里了,希望这篇博客能给你一些帮助,让你对关于RocketMq架构的问题得到进一步的提升,在面试的时候能从容面对面试官。

相关推荐
Goldn.1 天前
Java核心技术栈全景解析:从Web开发到AI融合
java· spring boot· 微服务· ai· jvm· maven· hibernate
李慕婉学姐1 天前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
m0_740043731 天前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
编织幻境的妖1 天前
SQL查询连续登录用户方法详解
java·数据库·sql
用户47949283569151 天前
面试官问"try-catch影响性能吗",我用数据打脸
前端·javascript·面试
沐雪架构师1 天前
大模型Agent面试精选15题(第四辑)-Agent与RAG(检索增强生成)结合的高频面试题
面试·职场和发展
未若君雅裁1 天前
JVM面试篇总结
java·jvm·面试
kk哥88991 天前
C++ 对象 核心介绍
java·jvm·c++
YoungHong19921 天前
面试经典150题[072]:从前序与中序遍历序列构造二叉树(LeetCode 105)
leetcode·面试·职场和发展
招风的黑耳1 天前
我用SpringBoot撸了一个智慧水务监控平台
java·spring boot·后端