rocketmq面试

broker主从复制机制

同步复制
等Master和Slave均写成功后,才反馈给客户端写成功状态;
如果Master出故障, Slave上有全部的备份数据,容易恢复,但是同步复制会增大数据写入延迟,降低系统吞吐量。
异步复制
只要Master写成功,即可反馈给客户端写成功状态。后面再通过异步的方式和slave同步。
较低的延迟和较高的吞吐量,如果master故障,有可能因为某些数据没有被写入slave,造成丢失。

复制流程分为两步,元数据同步、消息数据复制
元数据同步:Slave Broker 定时任务每隔 10 秒会同步元数据,包括主题,消费进度,延迟消费进度,消费者配置。
同步主题时, Slave Broker 向 Master Broker 发送 RPC 请求,返回数据后,首先加入本地缓存里,然后持久化到本地。

消息数据复制
1、Master 启动监听指定端口
2、Slave 启动 HaClient 服务,和 Master 创建 TCP 链接
3、Slave 向 Master 上报存储进度
4、Master 接收进度,消息文件中检索该偏移量后的所有消息,并传输给 Slave
5、Slave 接收到数据后,将消息数据 append 到本地的消息存储。

Master和Slave之间是怎么同步数据的呢
通过raft协议
在broker收到消息后,会被标记为uncommitted状态
然后会把消息发送给所有的slave
slave在收到消息之后返回ack响应给master
master在收到超过半数的ack之后,把消息标记为committed
发送committed消息给所有slave,slave也修改状态为committed

工作流程

1、启动NameServer,NameServer启动后监听端口,等待Broker、Producer、Consumer连上来,相当于一个路由控制中心。
2、Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。
3、收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。
4、Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。
5、Consumer跟Producer类似,跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,开始消费消息。
Master支持读和写,Slave仅支持读,也就是 Producer只能和Master连接写入消息;Consumer可以连接 Master,也可以连接Slave来读取消息。

在这里插入图片描述

持久化机制(刷盘)

同步刷盘:在返回写成功状态时,消息已经被写入磁盘。具体流程是,消息写入内存的PAGECACHE后,立刻通知刷盘线程刷盘, 然后等待刷盘完成,刷盘线程执行完成后唤醒等待的线程,返回消息写成功的状态。响应时间比异步多10%,用在对消息可靠性比较高的

异步刷盘:在返回写成功状态时,消息可能只是被写入了内存的PAGECACHE,写操作的返回快,吞吐量大;当内存里的消息量积累到一定程度时,统一触发写磁盘动作,快速写入。用在吞吐量比较高的

配置:Broker配置文件里的flushDiskType,SYNC_FLUSH(同步刷盘)、ASYNC_FLUSH(异步刷盘)

如何保证消息不丢失,保证消息的可用性/可靠性

producer:消息成功发送
同步发送,broker返回成功后,表示数据送到了

broker:消息持久化
消息持久化到commitLog
刷盘,同步刷盘和异步刷盘,将消息存储
master和slave的同步机制,同步双写可以保证在master宕机时,slave还可以有消息给consumer消费。

consumer:标记已经消费的消息offset
consumer中也保存了一个offset,用来表示消费成功却已经发回broker的消息下标,发回失败时也会定时重试,offset是持久化的。

消息存储结构

CommitLog
消息主体与元数据的存储主体,文件默认大小是1G,CommitLog 存储的数据是在当前这个broker中的所有的topic的数据
consumerQueue
只记录具体某个topic下的数据,一个topic下有多个consumerQueue,作为消费索引,它记录了指定topic的队列消息在CommitLog中的位置(物理位置偏移量offset

indexFile
indexes 里记录了 key的hash值,在commitLog中的偏移量,与 beginTimestamp的差值,下一个索引的值(记录key和offset的对应关系。

零拷贝

RocketMQ为什么速度快

是因为使用了顺序存储、Page Cache和异步刷盘。

我们在写入commitlog的时候是顺序写入的,这样比随机写入的性能就会提高很多

写入commitlog的时候并不是直接写入磁盘,而是先写入操作系统的PageCache

最后由操作系统异步将缓存中的数据刷到磁盘

如何保证顺序

顺序由producer发送到broker的消息队列是满足FIFO的,所以发送是顺序的,单个queue里的消息是顺序的。多个Queue同时消费是无法绝对保证消息的有序性的。所以,同一个topic,同一个queue,发消息的时候一个线程发送消息,消费的时候一个线程去消费一个queue里的消息。RocketMQ给我们提供了MessageQueueSelector接口,可以重写里面的接口,实现自己的算法,比如判断i%2==0,那就发送消息到queue1否则发送到queue2。

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

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

相关文章

工作流引擎数据库表UML图

RepositoryService RepositoryService DeploymentQuery: 用于查询部署信息。 ProcessDefinitionQuery: 用于查询流程定义信息。 流程定义与部署 流程关联表 RuntimeService : RuntimeService ExecutionQuery: 用于查询执行实例…

智能革命:未来人工智能创业的天地

智能革命:未来人工智能创业的天地 一、引言 在这个数字化迅速变革的时代,人工智能(AI)已经从一个边缘科学发展成为推动未来经济和社会发展的关键动力。这一技术领域的飞速进步,不仅影响着科技行业的每一个角落,更是为创业者提供了…

Day20-【Java SE高级】单元测试 反射 注解 动态代理

一、单元测试 就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。 1. 咱们之前是如何进行单元测试的?有啥问题? 只能在main方法编写测试代码,去调用其他方法进行测试。无法实现自动化测试,一个方法测试失败,可能…

【数据结构】泛型(分享重点)

什么是泛型&#xff1f; 泛型就是适用于许多许多类型&#xff0c;对类型参数化。 怎么创建一个泛型呢 class 泛型类名称<类型形参列表> { // 这里可以使用类型参数 } class ClassName<T1, T2, ..., Tn> { } class 泛型类名称<类型形参列表> extends 继承类…

2024年阿里云优惠券领取攻略

阿里云作为国内领先的云计算服务提供商&#xff0c;以其稳定、高效、安全的服务赢得了众多用户的青睐。为了吸引用户上云&#xff0c;阿里云经常推出各种优惠活动&#xff0c;其中就包括阿里云优惠券。本文将为大家详细解读2024年阿里云优惠券的领券攻略&#xff0c;帮助大家轻…

IP协议

IP协议 1. 网络层简介2. IP协议2.1 基本概念2.2 IP协议的格式 3. 分片与组装4. 网段划分5. 特殊IP地址6. IP地址的数量限制7. 私网IP地址与公网IP地址8. 路由9. 路由表生成算法 1. 网络层简介 网络层介于传输层和数据链路层之间&#xff0c;其主要作用是实现两个不同网络系统之…

2024.4.19 Python爬虫复习day07 可视化3

综合案例 需求: 已知2020年疫情数据,都是json数据,需要从文件中读出,进行处理和分析,最终实现数据可视化折线图 相关知识点: json json简介: 本质是一个特定格式的字符串 举例: [{},{},{}] 或者 {}python中json包: import jsonpython数据转为json数据: 变量接收json…

深入理解计算机网络分层结构

一、 为什么要分层&#xff1f; 计算机网络分层的主要目的是将复杂的网络通信过程分解为多个相互独立的层次&#xff0c;每个层次负责特定的功能。这样做有以下几个好处&#xff1a; 模块化设计&#xff1a;每个层次都有清晰定义的功能和接口&#xff0c;使得网络系统更易于设…

通讯录的实现(顺序表版本)

我们知道通讯录是基于顺序表的前提下&#xff0c;要写好通讯录我们就要深入了解好顺序表。我们先来看看什么是顺序表。&#xff08;注意今天代码量有点多&#xff0c;坚持一下&#xff09;。冲啊&#xff01;兄弟们&#xff01; 顺序表的简单理解 对于顺序表&#xff0c;我们首…

HTML常用标签

标签页&#xff08;title&#xff09;&#xff1a; ~title 表示标题标签&#xff0c;文字会显示到标签页 ~主要与SEO有关&#xff08;了解&#xff09; &#xff08;搜索引擎在抓取页面时&#xff0c;会通过title来识别网站内容&#xff09; 标题&#xff08;共6级&#xff09;…

深入理解DES算法:原理、实现与应用

title: 深入理解DES算法&#xff1a;原理、实现与应用 date: 2024/4/14 21:30:21 updated: 2024/4/14 21:30:21 tags: DES加密对称加密分组密码密钥管理S盒P盒安全性分析替代算法 DES算法简介 历史 DES&#xff08;Data Encryption Standard&#xff09;算法是由IBM研发&…

二极管分类及用途

二极管分类及用途 通用开关二极管 特点&#xff1a;电流小&#xff0c;工作频率高 选型依据&#xff1a;正向电流、正向压降、功耗&#xff0c;反向最大电压&#xff0c;反向恢复时间&#xff0c;封装等 类型&#xff1a;BAS316 ; IN4148WS 应用电路: 说明&#xff1a;应用…