• 云原生中间件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的复制方式,这样即使有一台机器出故障,仍然可以保证数据不丢。

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

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

    在这里插入图片描述

  • 相关阅读:
    代码随想录算法训练营第二十七天| LeetCode39. 组合总和、LeetCode40. 组合总和 II、LeetCode131. 分割回文串
    【QT】ROS2 Humble联合使用QT教程
    ceph 数据恢复和回填速度 重建osd 加快数据恢复
    什么是指标体系,怎么搭建一套完整的指标体系?(附PDF素材)
    [C#]JCoder.Db4Net.ORM,基于JCoder.Db4Net的ORM库,轻量的MIT协议类库
    RabbitMQ_Windows系统下安装RabbitMQ详细教程
    【从优秀源码中学习设计模式】--- 模板方法模式
    C#实现顺序表定义、插入、删除、查找操作
    vernemq 一个可用的入门指南之一:Mac下的安装及使用,使用MQTTX访问verneMQ
    SpringBoot 异步任务-Guava 中EventBus
  • 原文地址:https://blog.csdn.net/qq_35427589/article/details/126618092