当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/565347.html

相关文章:

  • JAVA国际版同城打车源码同城服务线下结账系统源码适配PAD支持Android+IOS+H5
  • Milvus:数据字段-主字段和自动识别(五)
  • 【深入浅出PyTorch】--8.1.PyTorch生态--torchvision
  • Blender新手入门,超详细!!!
  • Milvus:数据库层操作详解(二)
  • Blender入门学习09 - 制作动画
  • 网站建设终身不用维护网络推广主要内容
  • 金融知识详解:隔日差错处理机制与银行实战场景
  • 网站运营编辑浙江久天建设有限公司网站
  • 做网站销售说辞有赞商城官网登录
  • MATLAB实现基于RPCA的图像稀疏低秩分解
  • 象山企业门户网站建设扬州高端网站制作
  • 服务器网站建设维护app制作定制开发
  • php企业网站开发方案服装外贸网站建设
  • 【Go】--互斥锁和读写锁
  • 《从适配器本质到面试题:一文掌握 C++ 栈、队列与优先级队列核心》
  • 心理咨询网站模板做网站手机
  • 光学3D表面轮廓仪中Rz代表什么?如何精准测量Rz?
  • ps做登录网站北京网站制作工作室
  • git rebase提交
  • vue3引入icon-font
  • 基于开源操作系统搭建K8S高可用集群
  • 学做网站论坛 可以吗做网站是不是太麻烦了
  • leetcode 1578 使绳子变成彩色的最短时间
  • 中国建设银行网上银行官方网站长沙优秀网站建设
  • 1.7 Foundry介绍
  • 什么是向量数据库?主流产品介绍与实战演练
  • redission实现延时队列
  • 浏览器端缓存地图请求:使用 IndexedDB + ajax-hook 提升地图加载速度
  • 地铁工程建设论文投稿网站谷歌广告代运营