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架构的问题得到进一步的提升,在面试的时候能从容面对面试官。

相关推荐
Deamon Tree4 小时前
HBase 核心架构和增删改查
java·hbase
卡卡酷卡BUG4 小时前
Java 后端面试干货:四大核心模块高频考点深度解析
java·开发语言·面试
Yolo566Q4 小时前
OpenLCA生命周期评估模型构建与分析
java·开发语言·人工智能
lang201509285 小时前
Spring Boot日志配置完全指南
java·spring boot·单元测试
在坚持一下我可没意见5 小时前
HTTP 协议基本格式与 Fiddler 抓包工具实战指南
java·开发语言·网络协议·tcp/ip·http·java-ee·fiddler
蓝-萧5 小时前
Plugin ‘mysql_native_password‘ is not loaded`
java·后端
故事不长丨5 小时前
【Java SpringBoot+Vue 实现视频文件上传与存储】
java·javascript·spring boot·vscode·后端·vue·intellij-idea
不修×蝙蝠6 小时前
Java 日志演进:一文读懂主流框架
java·log4j·logback·log4j2·日志·slf4j