RocketMQ~高性能设计与实现(零拷贝技术)、多种集群模式

news2024/9/20 14:46:20

与Kafka类似,RocketMQ也使用了零拷贝技术、对于分区,其也有分队列的思维在。

零拷贝技术

传统的IO读写其实就是read+write的操作,整个过程会分为如下几步

  1. 用户调用read()方法,开始读取数据,此时发生一次上下文从用户态到内核态的切换,也就是图示的切换1,将磁盘数据通过DMA拷贝到内核缓存区。
  2. 将内核缓存区的数据拷贝到用户缓冲区,这样用户,也就是我们写的的代码就能拿到文件的数据read()方法返回,此时就会从内核态切换到用户态,也就是图示的切换2
  3. 当我们拿到数据之后,就可以调用write()方法,此时上下文会从用户态切换到内核态,即图示切换3,CPU将用户缓冲区的数据拷贝到Socket缓冲区,将Socket缓冲区数据拷贝至网卡
  4. write()方法返回,上下文重新从内核态切换到用户态,即图示力换4

整个过程发生了4次上下文切换和4次数据的拷贝,这在高并发场景下肯定会严重影响读写性能故引入了零拷贝技术。
在这里插入图片描述

mmap

mmap(memory map)是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系
简单地说就是内核缓冲区和应用缓冲区共享,从而减少了从读缓冲区到用户缓冲区的一次CPU拷贝。基于此上述架构图可变为:
在这里插入图片描述
基于mmapIO读写其实就变成mmap+write的操作,也就是用mmap替代传统IO中的read操作。

  • 当用户发起mmap调用的时候会发生上下文切换1,进行内存映射,然后数据被拷贝到内核缓冲区,建立文件磁盘地址的引用,返回给用户缓冲区
  • mmap返回,发生上下文切换2,返回内文件磁盘地址的引用
  • 随后用户调用write,发生上下文切换3,将地址传递,CPU直接将内核缓冲区的数据拷贝到Socket缓冲区,write返回,发生上下文切换4

但这种方式,仅适合数据的编辑工作,在用户缓冲区无法对数据进行读,但可以写

sendfile

sendfile()跟 mmap()一样,也会减少一次 CPU 拷贝,但是它同时也会减少两次上下文切换
在这里插入图片描述
如图,用户在发起sendfile()调用时会发生切换1,之后数据通过DMA拷贝到内核缓冲区,之后再将内核缓冲区的数据CPU拷贝到Socket缓冲区,最后拷贝到网卡,sendfile()返回,发生切换2。发生了3次拷贝和两次切换。

这种方式无法对文件有读写操作,而是直接将文件的数据传输到target目标缓冲区,也就是说,sendfile是无法知道文件的具体的数据的

但是mmap不一样,他是可以修改内核缓冲区的数据的。假设如果需要对文件的内容进行修改之后再传输,只有mmap可以满足。

通过上面的一些介绍,结论是基于零拷贝技术,可以减少CPU的拷贝次数和上下文切换次数,从而可以实现文件高效的读写操作。
RocketMQ内部主要是使用基于mmap实现的零拷贝(其实就是是调用上述提到的api),用来读写文件,这也是RocketMQ为什么快的一个很重要原因。

集群方式

RocketMQ有3种集群模式,分别是单Master模式、多Master模式以及多Master多Slave模式。

  1. 单Master集群:这是一种最简单的集群方式,只包含一个Master节点和若干个Slave节点。所有的写入操作都由Master节点负责处理,Slave节点主要用于提供读取服务。当Mastter节点宕机时,集群将无法继续工作。

  2. 多Master集群:这种集群方式包含多个Master节点,不部署Slave节点。这种方式的优点是配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠;消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高;缺点是单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到影响。

  3. 多Master多Slave集群:这种集群方式包含多个Master节点和多个Slave节点。每个Master节点都可以处理写入操作,并且有自己的一组Slave节点。当其中一个Master节点宕机时,消费者仍然可以从Slave消费。优点是数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务务可用性与数据可用性都非常高;缺点是性能比异步复制模式略低(大约低10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Storage:Keeping memories in the brain(存储:把记忆保存在大脑中)

Once you’ve encoded information, you now need to store it. Unfortunately, forgetting is a major part of how our brains work.Most of us can’t remember what we had for dinner Tuesday, three weeks ago.However, we can all remember our first kiss. 一旦完成了信…

工厂模式和策略模式的区别和各自的实现

工厂模式和策略模式是两种不同的设计模式,它们分别解决的是创建对象和定义算法家族的问题。 工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,它提供了一种创建对象的方式,使得创建对象的过程与使…

如何发布年会通知?

在组织年会等重要活动时,确保每位参与者都能及时接收到通知至关重要。本文将指导您如何利用云分组平台发布年会通知,并通过查询功能为参与者提供座位号等信息。一、电脑端上传查询信息 1. 登录云分组官网 访问官网并通过微信扫码登录。2. 进入查询菜单 在…

通过因子分析识别消费者偏好的潜在因素的案例

因子分析是一种统计方法,用于研究变量之间的潜在关系。它是一种降维技术,通过识别较少数量的因子(或称为维度、成分)来解释多个观测变量之间的相关性。这些因子是不可观测的潜在变量,它们被认为是原始变量的潜在原因。…

厦门凯酷全科技有限公司抖音小店的新蓝海开启电商新篇章

在数字经济的浪潮中,电子商务以其独特的魅力和无限潜力,正以前所未有的速度改变着我们的消费方式和商业模式。作为这股浪潮中的佼佼者,厦门凯酷全科技有限公司凭借其敏锐的市场洞察力和前瞻性的战略布局,成功在抖音小店这一新兴平…

乐凡北斗卫星通信终端,多场景应用

北斗卫星通信终端在民生保障、抗险减灾、野外搜救、海洋渔业、交通运输、边境巡防等多个领域都有广阔的应用空间。在不同场景下,乐凡北斗卫星通信终端发挥着各自独特而关键的作用,其强大的定位功能和北斗三代短报文功能保障了信息的高效传递和任务的顺利…

Context-dependence:Why your environment matters(情境依赖:为什么环境很重要)

Consider an everyday situation:You get up from your desk to have a cup of tea.Once you arrive in the kitchen, you forget what you wanted.However, when you get back to your desk, you suddenly remember. 考虑一个日常会遇到的情况:你从桌旁起身想要倒杯茶&#xf…

内存管理篇-09伙伴系统初始化一:memblock管理

1.伙伴系统的初始化概述 硬件初始化:计算机加电后进行硬件检测。加载引导程序,将Linux内核加载到内存中。 内核初始化:内核被加载后开始初始化各个子系统。进行CPU架构相关的初始化。初始化内存控制器和其他设备驱动。 内存管理初始化&…

Chat App 项目之解析(四)

Chat App 项目介绍与解析(一)-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序,旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录,还提供了管理员登录功能,以便管理员可以…

Nature Communications | 全球草地土壤碳储量随植物多样性的增加而增加

在许多生态系统中物多样性与土壤有机碳(SOC)储量呈正相关。最可能的原因是植物多样性积极影响植物生产力,从而影响土壤的有机碳输入量。大多数关于植物多样性对植物生产力和有机碳储量影响的证据都是基于控制植物物种丰富度的小规模实验。然而,那些短期的…

Flink入门(五)--Flink算子

Map DataStream → DataStream 一个接受一个元素并产生一个元素的函数。 示例 dataStream.map { x > x * 2 } FlatMap DataStream → DataStream 一个接受一个元素并产生零个、一个或多个元素的函数。 例如 dataStream.flatMap { str > str.split(" ") }…

把直播间搬到工厂,淘宝直播打造卖爆新路径

又一年中秋将至,电商平台们再度开启了月饼生意。 8月21日,杭州,淘宝直播的主播们组成“白月光”队和“黑月牙”队,下工厂,探访体验馆,开始了一场“寻月之旅”。“我们米月饼的饼皮是根据南宋糕点改良而来”…

C语言小项目源码大全(60套)

C语言小项目源码大全60套 目录源码文件 目录 纯c语言迷宫源码.exe . c语言五子棋源码.exe c语言24点游戏源码.exe c语言万年历源码.exe c语言别踩白块儿(双人版)源码.exe c语言奔跑的火柴人游戏源码.exe c语言吃逗游戏源码.exe C语言超市管理系统.exe c语言对对碰游戏…

【CSP:202212-2】训练计划(Java)

题目链接 202212-2 训练计划 题目描述 求解思路 模拟: over表示能否按时完成所有训练项目rely[i]表示第i个项目的依赖项目编号(每个项目最多有一个依赖项目)days[i]用来记录第i个项目完成需要的天数allDays[i]表示加上该项目的所有前置依赖…

面向对象09:instanceof和类型转换

‌ 本节内容视频链接:https://www.bilibili.com/video/BV12J41137hu?p72&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p72&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 instanceof是Java中的一个二元运算符&…

浅谈【数据结构】栈和队列之队列

目录 1、队列 1.1思想 2、队列的两类 2.1顺序队列 2.2链式队列 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错,说的就是你,不用再怀疑!!! 希望我的文章内容能对你有帮助,一起努力吧&a…

MATLAB 沿任意方向分层点云(82)

MATLAB 沿任意方向分层点云(82) 一、算法介绍二、算法实现1.代码2.效果更多内容参考: MATLAB点云处理学习 一、算法介绍 沿着某个方向,将点云分割为多层,每层点云使用不同颜色进行可视化显示,具体代码和不同方向的分层效果如下: 二、算法实现 1.代码 % Load point c…

学生信息管理系统的设计与实现(包含文档、源码、sql脚本、导入视频教程)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 学生信息管理系统拥有三种角色,分别为学生、教师和管理员,功能更加完善,可以作为初学者参照学习课程设计。 学生:班级通讯录查询、个人信息…

一键生成PPT只需这一步!AI先行者全面指南

在当今快节奏的工作生活中,我们需要不断地准备各种报告和演示文稿。传统的PPT制作方式往往耗费大量时间和精力,而AI先行者的出现改变了这一切。这款强大的智能工具能够帮助您快速生成高质量的PPT,提高工作效率。今天,我们将为您带…

CLASS1:文献管理软件使用

1 文献查阅 引新(3年内)不引旧引用经典2 文献检索网站汇总 Web of Science(论文中了之后下载证明) Author Search - Web of Science Core Collection (clarivate.cn) X-MOL(查阅文献) X-MOL学术平台 计算机, 热门类期刊, - X-MOL Scidown(下载原文) Sci论文期刊检索|