00:00
呃,大家好,今天开始会给大家录制一系列的消息队列相关的那个视频教程啊,然后这一部分的话,主要是以原理加那个原理的啊,就是理论加原理的方式来介绍,主要目的呢有两个,第一个的话是记录之前自己啊学习消息队列过程中的一段历程,第二个的话就是啊,找到志同道合的呃,对消息队列感兴趣的小伙伴一起来继续。进行技术的交流讨论,然后啊,这一次系列的那个相关的一些啊素材或者是材料会放在我自己个人公众号上面,同时的话,呃,然后有些消息队列的一些文章或者资料也会啊,及时更新在我自己的公众号后面啊,大家如果有需要的留意一下。啊,其实这一系列会主要包含以下几部分内容,第一部分内容的话就是呃,会从整体上介绍消息队列的一些设计思想啊,包括它的主流的一些啊,消息队列的模型以及。
01:11
存储方案的选型啊,以及啊消息队列的消费模型,队列模型和发布订阅模型啊,以及就是他们之间的一些数据啊同步,以及不同的消息队列之间的一些啊架构上面的差异等等啊,其实在第二在后面的内容的话,会主呃就是比较经典或者比较啊用的比较多的一些消息队列分别来去啊,探索他们内部的一个实现原理啊,然后整个会覆盖到啊MQ卡夫卡,MQ以及萨啊这几款用的啊,现在比较用的多的消息队列啊,其中主要会介绍他们的一些内部的实现原理啊,这就是整个这一系列内容啊,其实想去啊。
02:03
呈现出来的一些东西吧。嗯,这一节我们主要来介绍第一部分内容,就是消息队列的设计思想,然后消息队列的设计思想的话啊,其实主要会包含以下几部分内容,第一部分就是消息队列的啊适用场景,然后第二部分内容的话,就是消息队列的一个主体的模型,然后第三部分会介绍消息队列的存储的选型,第四部分呢,介绍消息队列整体的一个消费模型啊,最后呢,再加啊前面提到的几种像。啊,卡夫卡rie MQ以及帕他们的啊几个整体的架构,然后做一些对比,首先做一个整体上面的。总结,然后跟前面的内容呢,做一个啊,融会贯通啊,这是这是第一部分主要会介绍的一个内容。
03:00
呃,然后我们首先来看啊第一部分内容吧,就是整个消息队列,它整体的一个背景就是消息队列主要是用在啊以下三个场景里面嘛,这也是他用的比较多的一些场景,当然还有其他的场景,第二呢,主要以啊用的最适合他的场景来举例啊第一个的话就是异步的场景,然后异步里面的话,以啊其实类比于现实生活中的例子的话比较啊好接受。啊,其实啊,以送以快递的这个例子为例的话,就是啊,用户在网上下单之后,那快递员会给用户来送快递,当送快递的过程中啊,在这个过程中,那就需要等,就是送到快递之后,等用户来签收这个快递,那如果这时候用户在上班或者是他不方便啊,那就导致呢,这个快递一直没法签收啊,从从而呢,会影响快递员送快递的一个效率啊,也影响他的一个工作上面的一些啊。
04:02
工作的一些效果啊,那其实接下来。这种情况的话,其实后面我们在生活中的话,也就出现了快递柜嘛,快递柜的话,也就是快递员在送快递的过程中啊,他家快递呢,就会送到之后,放到离这个用户最近的快递柜里面,然后啊用户呢,再从,然后他再通过短信或者其他的方式去通知用户啊,这个短信,这个快递的一些信息,然后呢,用户直接从快递柜去拿取快递,那在这种情况下面的话啊,快递员呢,也不用等待用户来,一直在签收啊,在这个场景下面,其实就啊通过快递柜将快递员和用户得到的一个结果,这也是啊得到了一个异步吧,这也是他们之间的一个。啊,其实快递柜起到了一个作用,其实快递柜的话主要也就是起到一个快递暂存的这样一个能力啊,所以呢,这也是其实是异步的一个场景啊,第二个场景就是解耦,这个解耦怎么来理解呢?啊,其实解耦的话,我们以现在推荐系统其实在。
05:12
在现在的这个世界里面,其实用的很多啊,我们以一个抖音或者快手这种,就是U其C这类这一类APP来说的话,那对于用户而言,就是发布视频的话,就是一个生产者,那我们去观看视频就是一个消费者啊以以这个来举例的话,就是我们甚至发布的内容呢啊,他们的内容首先会啊发布出去经通过审核之后呢,啊,一般会经过几个用途啊,那第一个的话就是用户去,就是平台方去做一个内容的一个存储,内容的入库,那第二部分的话就是啊,他们用户呢,会去考虑将这样一部分特征呢?啊内容呢,用作我们计算我们人的一些画像或者特征。同时呢,这一部分内容在推荐的过程中会用作。
06:01
啊,会有所推荐池啊,这个推荐池的话,一般就是我们新发的内容会啊通过冷启动或者其他的方式来去构建啊,那其实啊,这就是最常用的几个,那如果说我们后面的内容呢,啊,还需要一些其他的用途,比如说去离散的去计算一些内容的一些内容相关的一些信息的话,那这时候如果我们这个地方啊,每次需要需要去一个用途啊,需要去在这边通过代码去扩展一个逻辑的话,那其实它的可扩展性比较差啊,同时呢,其实在这种情况下面也不够能够支持我们系统的一个灵活的去扩展啊,那接下来其实就会啊,通常呢,在。呃,通常的做法就是啊,生产到我们的内容通过审核之后呢,啊,会发送一份到这个消息队列里面,然后消息队列里面呢,啊会存储,将我们的内容存储下来,那接下来下游的消费者呢,啊,比如说像内容的入库或者计算特征,以及这种启动能启动的这种推荐池啊,这些呢,其实都可以看作是他们想去使用消息队列里面的这一份数据啊,那作为消费者的角色呢去啊从消息队列里面拿取数据,然后再去做消费啊,如果说下游有其他一些新的业务或者新的场景需要使用这一份特定的数据啊,那其实直接啊,再通过新增加一个消费者啊,消费者组。
07:28
啊,到角色去消费这一部数据就好了,上游的生产者呢,不会做任何的改动,所以呢,这个过程其实就是一个啊完整的一个解耦啊,那第三个案例的话,其实就是消分啊,这个呢,其实在啊像秒杀的活动场景里面,其实用的比较多啊,比如说像我们的双11或者是618这种大型的购物活动里面啊,那通常呢,就是主要呢,它解决的问题是啊,上游的生产者生产的数据呢,是远远大于下游,下游的消费者能够处理的一个速率,那这时候呢,会造成一个啊,如果说没有消息队列的话,那通常会造成一个啊,上游生产者啊的速率远远大游消费者的时候,导致下游消费者呢,服务靠不住啊,出现一个服务的瘫痪这种情况,那通过消峰的作用呢,就是啊,主要采用消息队列啊,消息队列一个暂存消息的这个能力啊,生产者呢,将数据啊生产出来丢到消息队列里面。
08:28
然后下游的消费者呢,根据自己的速率,然后去消息队列里面拉取数据,然后做一个消费啊,起到高峰期的时候对流量做一个消分,然后呢啊,然后起到一个保护下游服务,同时呢,保证整个服务可用性的一个啊能力,这就是。第三个作用消峰,所以总结一下的话,其实是消息队列,它整体的一个使用场景呢,就是主要有三个,第一个的话就是异步处理数据的这种场景,第二个的话就是啊,进行系统应用间的解耦,第三个的话就是业务流量的一个消分,然后。
09:04
用一句话来总结的话就是消息队列它其实啊,主要是用在啊,不要求实时处理,同时呢,一份数据啊,要多处使用的这种场景里面,同时这种多处使用呢,是啊,不同的消费方,他们的消费速度往往是不同的啊,所以这是消息队列它整个啊,它解决的一一个问题。啊,那接下来其实再介绍一下。既然解决这一类问题,那业界里面有哪些解决的方案呢?其实也就是消息队列的一些主流的一些产品吧,就是下面这张图呢,是随着时间线以来的一个啊演进过程,那从最早的可能就是active active MQ啊,到后面啊大概是零六年左右出现的MQ,以及再到后面发展到啊其实大数据时代的卡夫卡啊,成为一代新一代的一个消息队列代名啊在后面啊也出现的像阿里开源的rocket MQ啊,这两这这些大数据时代的消息队列,然后再到云原生时代呢,又出现了啊像帕萨这一类新的消息队列,就是这些消息队列呢,他们主要解决的场景呢,其实也就是上面提到的这些问题,但是呢,他们。
10:17
在具体内部啊,实现和内内部的一些设计上面呢,又有各自的一些差异点啊,这其实。啊,就是整个消息队列的一个现状,那接下来。我们就要去,首先要看那消息队列有很多,当然也仅仅局限于这些啊,那其他的消息,这些消息队列到底在设计的时候啊,需要考虑哪些问题,那有哪些主要的一些思路仅供去参考呢?啊,接下来我们会来介绍这一部分的内容。啊,那接下来我们来看啊上面这些消息队列他们的一个对比,我们从不同的维度来做一个对比吧。啊首先从单机吞吐量方面的话,我们可以看到啊,那整个单机通量方面,其实呃,Active MQ和Y的MQ他们呢属于一个量级,但是呢比rocket m和卡卡这些呢要低一个量级啊,同时呢,Rocket MQ,卡夫卡其实他们属于同一个时代,他们呢呃量来说都是差不多啊,但同时呢卡MQ有一个特性,就是在后期的版本,其实支持的那个强一在强一致性的这种特点,这个版幕下面,其实它的吞吐量呢会稍低一些,然后卡夫卡呢,主要就是呃高通吐量,然后它配合一些大数据类的系统呢,实时做一些数据的计算,日志采集等等啊,然后在帕萨这一代啊,它又是永原生时代的新一代的消息队列。
11:46
同时它的架构跟前面的价格两种一些消息队列呢也不同啊,所以它其实的吞吐量要比前面要稍高一些啊,同时呢,支持强一致性的这种特性。
12:00
啊,因为消息队列里面都会,尤其像rock q,卡夫卡,帕萨里面都会提到一个啊,Topic的一个概念,这个后面我们会介绍啊,那在这里的话,我们也对topic数量啊,他们的上升对吞吐量的一个影响做一个分析啊,其实在卡不卡里面啊,主要就会存在一个啊,如果topic从。呃,增加一个量级的话,那就会导致它的吞吐量呢,会大幅度的下降啊,主要的原因呢,也是因为卡不卡,它本身设计上面的一个存在的一些呃问题吧,会出现导致导致这个情况啊,那我们来看,其实如in MQ呢,也是基于卡不卡这个啊,它存在的这个问题呢啊,通过他自己的解决方案去解决掉的这样的一个问题啊,避免了出现这种情况,那在。MQ里面啊,它的topic呢,可以支持到比卡啊更多的一个量级,同时呢啊,它的topic的上升也不会对通吐量呢造成一个啊很大性能的一个影响啊,这是rocket MQ的一个啊优势。
13:08
然后帕萨的话,它是本身采用一个存在分离的架构啊,那些数据层呢,它其实采用的是阿拉吉的bookkeper来存储,上次的broken呢是无状的在代理,所以它也是在这种架构下面呢,它的topic的个数呢,不会对吞吐量造成一个很显著的一个影响啊,时效性方面的话,这些消息队列基本上都是一个呃,毫秒级的一个时延,然后那这也其实能够满足我们大部分的一些业务场景的一些诉求,然后接下来在可用性方面的话,Active MQ呢和MQ他们呢都是啊,也比较高,然后都是基于主的架构去设计。啊,而rock MQ它的话要分两个版本来看,就是4.5以前其实是啊,典型的它有一些啊,就是储存同步复制以及主存异部复制这些集群的架构,而在4.5以后呢,它又新增加了啊社区版的顶立志架构,然后顶立志架构这个里面的话啊,它其实就支持了强一致性的这种特性啊。
14:12
就是MQ它的一个可用性啊,卡不卡的话,它本身它就是设计的时候就是非有分布式的啊,可用性呢非常高,同时呢,它的数据的复制呢,也是采用的是IR这种啊富部级的复制,所以呢,它的可用性是要比啊,就是常规的主图复制还要高啊帕A的话,它本身呢是上层的是broke是代理,呃无状的代理啊,动态可以扩容,然后在存储层也是啊采用。呃,没有去中心化的这种设计思路,所以呢它本身也没有一些不可用的这种风险,可用性呢也非常高啊,消息可靠性方面的话,那rocket MQ和帕萨他们呢,本身都是啊支采用支持强制性的特点,所以呢这一类消息可用性要高一些,而卡和卡的话,它机构参数的一些啊,优化配置之后呢,呃,其实可以做到最小概率的一些不丢失,呃,Active MQ和rabbit MQ呢,他们呢都支持消息的一个持久化,但是呢啊还是比起强一致性这种是差一些意思。
15:18
啊功能方面的话,那呃active MQ和rabbit MQ他们的功能知功能方面一个是啊非常完备,第二个的话呢,社区里面的一个活跃度也很高啊,但主要呢,这两者呢,是真是在以前的一些,就是啊早期的时候用的比较多的一些消息中介线,因为他们主要也就是基于IP这种啊高级队列协议去实现的一些特性,而后面的像呃呃rockie m卡卡都是在大数据时代,甚至是永生时代产生的新一代消息啊,那其实他们甚至他们是消息消息平台嘛,然后。MQ它的社区相比卡的话也不是那么的活,MQ它是阿里自的一款消息队嘛,也是交给阿帕奇在去啊管理,而卡夫卡基本上就是消息队列,大家最熟悉的啊,成为一个新一代的一个消息队列的代名词啊,它的社区和功能上面都是可以说都是绝佳,然后帕萨的话也是永远生时代迭代非常快的啊,新一代消息队列啊,很多的,其实后面很多的特性呢,其实。
16:31
啊,卡夫卡很多的特性,帕萨也都在支持,都在都在那个迭代,然后基本上甚至有些项目呢,都以都在去用帕萨来替代卡夫卡啊,这也是他们整体这些消息队列的一些啊,全方位的一些对比吧。呃,前面其实介绍完了消息队列的一个啊,整体的一及它解决的问题,以及有哪些解决方案,以及这些方案这样的一些啊特点,那这一节的话,我们主要来看消息队列它的一个核心的模型,然后其实上面的所有的消息队列呢,它都逃离不了啊,这一节要介绍的一个消息队列的整体的一个模型,其实消息队列从整体上来看的话,它可以分为呃,三。
17:16
各大的部分啊,那从数据的一个流向来看的话,那首先数据要有一个啊,生产数据的生产方,也就是生产者啊,接下来呢,生产的数据呢,会啊,那有个地方需要去做消息的一个暂存,那也就是消息队列啊,它存储的消息呢啊,它存储下来的之后会做一些消息啊,后面有第三方,就是存储的数据需要有其他方来消费,那也就是消费者啊,那在消息队列内部呢,会将存储的消息转发给消费者去消费,其实整个的一个数据流向来看,那就是生产者消息队列啊,以及消费者这三方啊,然后我们分别来看每一方之间啊,对于生产者而言,其实他的角色呢,主要就是生产消息啊,同时发布给消发送给消息队列啊,那这个生产消息呢,通常会啊,在发送的时候呢,一般都会有同步发送或者是异步发送的这这些方式,而消息队列内部的话,它主要去存储我们的。
18:16
啊,消息同时呢,将这种消息以某种方式去告知消费者啊,一般呢,消息队列内部呢,都会支持存储以及消息的过滤转发等等的这些功能啊,同时呢,也会做消息的一些分类啊,那也就是我们经常都知道的topic这样一个主题啊,然后呢,他在内部的时候,一般一个主题会划分成多个啊,就是逻辑上的一个队列去存储我们的消息。啊,那第三第三个呢,就是消息队列中的消费者,那消费者呢,其实他啊消费者这里啊,第一个的话是他跟消息队列去获取数据的方式呢,有两种,第一对第一类的话就是推送数据,消息队列推给消费者,第二类的话就是他主动去拉取数据啊这两种方式不同的消费不同的组件也都有采用啊去实现。
19:09
对应的能力,然后第二个的话就是在消费者这边,其实也会存在一些啊,需要数据按照顺序的方式去消费,以及啊金属消费等等这些能力。啊,这就是他整体的一个模型,其实可以看到啊,我们后面也会来再加以论证,其实。上面的消费者,上面的消息队列,基本上都是以这样一套模型作为基础去啊构建它整个系统的。啊,那就。其实我们在介绍完它的核心模型之后,那就接着那个消息队列要存储数据的这样一个话题,再往下来看的话,那对于内部的话,消息队列其实存储那就离不开一个存储方案的选型啊,在计算机里面,其实我们大的存储可以分为两大方向吧,第一类的话就是啊,采用意识性的这种存储介质来去存储数据啊,也就是主要也就是以内存为代表嘛,然后第二类的话就是采用非意识性的这种存储介质啊,存储数据啊,也就是我们。
20:15
最经典的就是我们的磁盘。啊,那在这个过程中我们来看,其实内存跟硬盘他们呢,都有一些各自的一些特点啊,像啊内存的话,它存储的数据呢啊,会有面临一个断裂之后丢数据的问题,而硬盘呢,它又不会丢数据,呃,第二个的话就是啊,内存它本身访问速度要比啊硬盘要快得多,但是它的容量呢是要比硬盘要小,而它的价格呢又是要比啊那硬盘要高,所以这其实就。存在了一个就是啊相同成本,下面如果说啊要访问速度特别快,那其实内存。内存基本上是比较合适,然后如果说存储的数据据量又巨大,然后呢,还有数据不能丢,那其实就可能绝大部分就会去采用硬盘的方案去存储,而硬盘在这里的话,其实它的访问速度啊,通常要结合啊,随机IO和顺序IO这两种来看,就是随机访问和顺序访问啊,这个后面我们一解再来去详细介绍啊,我们这里再来。
21:19
补充一些内容吧,其实在整个呃,计算机里面的一些底层,底层组件或者是中间件里面可以看到啊,不同啊,有有很多是采用内存去存储数据的,也有很多是采用硬盘去存储的。啊,那其实采用内存存储的话,它主要面临啊几个问题,第一个的话就是啊不是内存的容量比较小啊,那同时呢啊需要去存储数据的话,就需要去考虑啊,怎么样在数据结构方面去做一些啊特定的选型以及压缩等等,第二个的话就是啊,那内存容量小,同时如果数据存不下的时候啊,数据是要选择去淘汰掉,还是说要选择去啊。
22:05
淘汰掉的时候就需要去选择具体的一些对应的淘汰算法,像LRU或者l fu等等啊,那第二种的话就是啊,如果数据本身又存不下,但是又想去啊,不想淘汰数据,那可能又会去考虑集群的方式,将数据做一个分片,分散在多台机器上面啊,只是它针对内存呃,容量小的这个特点,触发的一个第一个挑战,第二个挑战就是它断电的时候啊,数据呢又容易丢失啊,那针对这个问题的话,往往其实也会去啊,考虑采用硬盘去做一个数据的持久化,然后呢,尽可能降低这个数据丢失的一个风险,呃,其实像啊彩用内存呢,就像最经典的就是red这种啊,缓存中间键或者是啊像。M,这里这些。而采用硬盘的话,最多的可能就是大家最熟悉的啊,像关系型数据库MYS或者Oracle这些啊,其实他们在内部存储的时候呢,它面临的主要的挑战点就在于啊,第一个的话是啊,磁盘的一个访问速度很慢啊,那在这种场景下面的话有啊两种解决的一个思路,第一种的话就是尽可能的去利用磁盘的一个顺序IO读写啊,一个数序IO要比随机IO远远远远快,第二个的话就是减少磁盘。
23:25
访问磁盘的一个次数啊,频率啊,然后在减少的时候,其实啊有些呢,就是采用啊m map内存映射方案去做一个磁盘的一个数据的一个映射啊,第二种的话,其实就是去采尽可能的结合内存的一个,充分的利用内存,然后做一些数据的一些缓存以及呢啊,从而降低一个访问硬盘的一个开销啊,整个这就是一个啊采用硬盘的时候,同时呢,硬盘这其实还有一个优化,也就是尽可能的啊,像有些组件呢,会去将数据也格式方面做一些特定的设计,然后呢,尽可能的利用磁盘的啊,操作系统提供的一个啊。
24:10
就是呃,磁盘阅读等等这些能力去加速一个系统的一个性能,这其实就是内存和硬盘啊,两种不同存储介质选型的时候啊,可能会出现的一个问题。同时呢,针对不同的问题,要去解决不同的一些挑战啊,一些难点。啊,接着前面介绍的一个磁盘的数据访问和随机访问的一个,呃话题我们接着来看,那其实为什么磁盘会存在一个随机访问和数序访问的时候,他们很大的一个读写差异呢?啊这个其实主要跟磁盘的一个结构有关啊,本身磁盘的话,以机械磁盘啊为例的话,其实它主要是啊会由啊像盘片,也就是盘面以及啊盘片柱面啊磁头扇区等等这些东西去构成,然后呢,通常会将盘面啊划分成一些啊。
25:06
多个像就是磁道,然后每个磁道优化分上区去读写数据,而在这个过程中的话,主要呢,一一个磁盘的访问时间,它其实要有三部分构成啊,第一个就是雄道时间,第二个的话就是旋转时间,第三个的话传输时间,而在这个过程中,雄道时间其实主要占据了大大头主啊主归其原因呢,主要是啊磁盘它的一个雄道呢,是需要将磁头移动到对应的磁道上面,而这个磁头的移动呢,它其实原理是啊马达驱动。磁壁,然后呢,移动磁头到对应的磁道啊,在这个过程中,马达的驱动呢,就是一种机械运动啊,也就是磁头移动是一种机械运动啊,那这种机械运动呢,它的啊。速度呢,是相对会比较慢的啊,这也是这也是啊,整个一个熊闹时间是占大头的一个主要原因,而在这个过程中的话,那我们来看啊,尽可能利用随机IO哦,尽可能去避免随机IO,充分利用顺序IO的话,也就是去啊减少寻道时间,因为啊数据IO的话,其实它的。
26:16
就不用再去减啊,因为呃,顺序I的时候呢,其实就会减少,大大减少熊道的一个时间,所以呢,就会整体提升磁盘访问的一个速度。啊,那右边这个图呢,是啊,其实是从一篇论文上面摘过来,主要呢,其实啊是去他描述的是啊,像磁盘的一个随机访问和数序访问,以及啊,机械硬盘的随机访问和顺序访问,以及内存的随机访问和数序访问的一个速率对比,啊这张图其实比较早了,但其实我们从这张图可以得出一个结论,是啊,针对。同一种介质它的呃,顺序访问呢,要要比随机访问的速度,速度啊是要远远的快,基本上要高高一一到几个量级。
27:05
啊,这是有,而且针对内存来说也是这样一个特点啊,那其实。啊,有了这样一个结论之后,那我们其实就知道,如果采用磁盘的话,那就尽可能去充分利用它的一个顺序IO,避免随机IO啊,第二个的话就是机械磁盘和固态硬盘,它们的构成其实是不一样的啊,这儿的特点呢,其实主要是针对机械磁盘,因为固态硬盘呢,其实它的随机写的那个影响,随机读写影响没有机械硬盘这么大啊,主要呢是机械硬盘其实它是采用啊电磁的一个存储,通过电磁信号转变成控制信号读写嘛。啊,而固态硬盘呢,它是采用半导体的存储啊,采用啊电子存储芯片阵列以及存储单元这些东西,这些组件去构成,内部呢是由闪存的颗粒来组成,速度呢比较快,同时它的成本呢,也比机械硬盘要啊高很多。
28:02
接下来我们再来看啊,那数据磁磁盘组织的几种模型吧,啊这些呢,其实是在。可以说这些是啊,如果采用磁盘去存储数据的话,是啊,经常会去涉及到一些方案啊,那主要的方案呢,其实会有两种,第一类的话就是啊,读多处理读多写少的这种场景啊,第二类的话就是处理写多读少的场景啊,读多写少的话,那典型的就是关系型数据库啊,也就是最。大家最熟悉的就是像MY的in DB这一类重重引擎就是典型的,就是采用读多写少啊的方式去构建的,而像报的DB也是这一类。啊,以独独写手的这一类我们来介绍的话,其实它往往的做法就是将我们的磁盘呢,啊划分成了以叶作为一个单位,然后呢采内部呢采用采用必将数据组织数据,啊它所属的一个分类呢,就是原地更新而。
29:02
另外一类写多读少的场景里面呢,啊,典型的就是主要就是lsm这一这一派戏吧,Lsm里面又会分为像bit cost这一类,Lsm哈西的这一类啊,实现以及l SM ary啊,还有最出名的就是l SM tree这一类。这一对实现,其实他们本质的特点呢,就是尽可能的去利用磁盘的一个顺序IO,去保证大量写的一个性能。同时呢,在写的时候呢,其实啊,又会存在数据块,是否要需要有序的这一这一类选型啊,像如果像l SM tree或者是lsm瑞这一类的话,它本身存储的数据就已经有序啊,这一类的话,像它们会内部会采用跳表或者是红黑数等等啊这些有序的组件去内图里面组织好数据,然后呢,再啊持久化到磁盘上面去,然后磁盘的数据呢,会按照分。分小块的文件去存放,以及呢,其实这一类的话,他们都属于非原地更新,就是说所有的数据的更新操作,其实都是采用啊追加的方式去啊写到磁盘里面,而不是一个原地的去更新啊,这一类组件的话,其实往往都需要去面临啊数据压缩或者合并的这一类特点啊,往往呢,其实也就是将同一份数据啊,同一次同一个数据的一个修改或者更新的一些啊多次的数据的做一个合并,或者是将一些啊前面有很多的操作,最后呢,将这些数据删除的这些记录啊做一个合并啊,起到一个降低它的一个空间放大,同时呢降低啊图放大的一个问题啊,这就是磁盘上面选习的几种方案吧。
我来说两句