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

相关推荐
SuperherRo1 小时前
JAVA攻防-Shiro专题&断点调试&有key利用链&URL&CC&CB&原生反序列化&加密逻辑
java·shiro·反序列化·有key·利用链·原生反序列化·加密逻辑
桦说编程1 小时前
简单方法实现子任务耗时统计
java·后端·监控
爱笑的眼睛111 小时前
超越可视化:降维算法组件的深度解析与工程实践
java·人工智能·python·ai
盖世英雄酱581361 小时前
物品超领取损失1万事故复盘(一)
java·后端
CryptoRzz1 小时前
印度尼西亚(IDX)股票数据对接开发
java·后端·websocket·web3·区块链
你怎么知道我是队长2 小时前
C语言---文件读写
java·c语言·开发语言
wszy18093 小时前
外部链接跳转:从 App 打开浏览器的正确姿势
java·javascript·react native·react.js·harmonyos
期待のcode3 小时前
认识Java虚拟机
java·开发语言·jvm
raining_peidx3 小时前
xxljob源码
java·开发语言