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

云原生中间件RocketMQ-核心原理之同步_异步刷盘,同步_异步复制解析

文章目录

    • 发送逻辑
    • 消费逻辑
    • 刷盘机制
      • 同步刷盘
      • 异步刷盘
      • 配置
    • 同步/异步复制解析
      • 异步复制
      • 同步复制
      • 配置
      • 推荐使用

发送逻辑

发送时,Producer将不同topic的所有消息都会顺序写入Commit Log中,Broker端的后台服务线程—ReputMessageService不停地分发请求并异步构建ConsumeQueue(逻辑消费队列)和IndexFile(索引文件)数据,不停的轮询,将当前的consumeQueue中的offSet和commitLog中的offSet进行对比,将多出来的offSet进行解析,然后put到consumeQueue中的MapedFile中。
ConsumeQueue(逻辑消费队列)作为消费消息的索引,保存了指定Topic下的队列消息在CommitLog中的起始物理偏移量offset,消息大小size和消息Tag的HashCode值。而IndexFile(索引文件)则只是为了消息查询提供了一种通过key或时间区间来查询消息的方法(ps:这种通过IndexFile来查找消息的方法不影响发送与消费消息的主流程)。

消费逻辑

消费者在消费的时候先从consumequeue中根据偏移量定位到具体的commitlog物理文件,然后根据一定的规则(offset和文件大小取模)在commitlog中快速定位。

刷盘机制

消息先存到内存中,然后根据刷盘策略刷到磁盘上。
RocketMQ的消息是存储到磁盘上的,这样既能保证断电后恢复, 又可以让存储的消息量超出内存的限制。RocketMQ为了提高性能,会尽可能地保证磁盘的顺序写。消息在通过Producer写入RocketMQ的时 候,有两种写磁盘方式,分布式同步刷盘和异步刷盘。
在这里插入图片描述

同步刷盘

在返回写成功状态时,消息已经被写入磁盘。具体流程是,消息写入内存的PAGECACHE后,立刻通知刷盘线程刷盘, 然后等待刷盘完成,刷盘线程执行完成后唤醒等待的线程,返回消息写成功的状态。同步刷盘对MQ消息可靠性来说是一种不错的保障,但是性能上会有较大影响,一般适用于金融业务应用领域。

异步刷盘

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

配置

同步刷盘还是异步刷盘,是通过Broker配置文件里的flushDiskType参数设置的,这个参数被设置成SYNC_FLUSH、ASYNC_FLUSH中的一个。

同步/异步复制解析

如果一个Broker组有Master和Slave,消息需要从Master复制到Slave 上,有同步和异步两种复制方式。
同一组Broker有Master - Slave角色

异步复制

同步复制方式是等Master和Slave均写 成功后才反馈给客户端写成功状态;
在同步复制方式下,如果Master出故障,Slave上有全部的备份数据,容易恢复,但是同步复制会增大数据写入延迟,降低系统吞吐量。

同步复制

异步复制方式是只要Master写成功 即可反馈给客户端写成功状态。
在异步复制方式下,系统拥有较低的延迟和较高的吞吐量,但是如果Master出了故障,有些数据因为没有被写 入Slave,有可能会丢失;

配置

同步复制和异步复制是通过Broker配置文件里的brokerRole参数进行设置的,这个参数可以被设置成ASYNC_MASTER、 SYNC_MASTER、SLAVE三个值中的一个。
Broker的配置文件默认路径:/opt/rocket/conf/broker.conf

推荐使用

实际应用中要结合业务场景,合理设置刷盘方式和主从复制方式,尤其是SYNC_FLUSH方式,由于频繁
的触发写磁盘动作,会明显降低性能。
通常情况下,应该把Master和Slave设置成ASYNC_FLUSH的刷盘方式,主从之间配置成SYNC_MASTER的复制方式,这样即使有一台机器出故障,仍然可以保证数据不丢。

本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位大佬指出。
主页:共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃

在这里插入图片描述

相关文章:

  • 计算机网络——数据链路层の选择题整理
  • joi:定义多个自定义错误信息
  • 限流相关算法
  • java计算机毕业设计阳明湖风景区订票系统源码+数据库+系统+lw文档+mybatis+运行部署
  • Java 中所有的锁
  • 【基于Arduino的垃圾分类装置开发教程二传感器执行器操作】
  • java中static关键字具有什么功能呢?
  • springcloud 之gateway配置注意事项
  • JS BOM
  • 领英工具-领英精灵群发消息功能解析
  • [答疑]微信餐馆案例中,“启动二维码对应的程序”这个用例合理吗
  • Defocus(散焦)
  • jvm中对象内存空间的分配与回收
  • Shiro 550、721
  • Mybatis开启日志
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 0基础学习移动端适配
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Android Volley源码解析
  • ES6系列(二)变量的解构赋值
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Meteor的表单提交:Form
  • Next.js之基础概念(二)
  • 聊聊directory traversal attack
  • 前端面试题总结
  • 小程序测试方案初探
  • 新书推荐|Windows黑客编程技术详解
  • # 计算机视觉入门
  • #pragma预处理命令
  • #在 README.md 中生成项目目录结构
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (day 12)JavaScript学习笔记(数组3)
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (离散数学)逻辑连接词
  • (三)模仿学习-Action数据的模仿
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)可以带来幸福的一本书
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net core 控制台应用程序读取配置文件app.config
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net mvc部分视图
  • .NET分布式缓存Memcached从入门到实战
  • .NET中winform传递参数至Url并获得返回值或文件
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @private @protected @public
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [《百万宝贝》观后]To be or not to be?
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [C语言]——C语言常见概念(1)
  • [hdu 3065] 病毒侵袭持续中 [AC自动机] [病毒特征码匹配]
  • [java/jdbc]插入数据时获取自增长主键的值
  • [javaSE] GUI(事件监听机制)