00:02
好,那我们看一下啊,这个延迟消息到底是怎么样工作的,它的实验原理是什么。大家看这个图啊,我整体先给大家说一下大概是什么,大概是这样的,就是我们,呃,生产者啊,发送一条消息啊给我们worker。那么他当然在生在发送这条消息的时候,需要指定这个延时等级啊,你是几级的?然后呢,呃,然后这个消息就会写到我们的。写到commit log,我们大家知道写到以后啊,它需要给它分发到相应的这个consume q,就我们的,呃,相应的这个这个这个。我们的Q队列里边。当然这是按照什么进行分类的是吧?不过在这就是他先会发送给一个比较特殊的topic,叫top叉叉,叉叉。
01:03
会发给这个鲍比。里边的这个这个我们的Q是吧,Q队列,然后这个Q队列里面啊,它具体的实际上这个队列是个什么队列,实际上就是我们那个叫。呃,延迟等级,把那个延迟等级作为我们的。QID。它会创建这样一个,呃,叫consume文件啊。然后呢,然后当然它它这里边会有一个东西啊叫schedule message service,就是我们的,呃,叫延迟消息啊,延迟消息或者定时消息是吧,延迟消息呃,服务。他。会,它里边实际上定义着我们的定时器开门。哎,然后呢,会按照你指定的一个时间啊,去执行这个定时任务。
02:00
然后到这个时间以后,他会把这个消息再次发送给谁,我们的lo。你说这次他充当了我们的生产者了?把这个消息重新再发一次。发给我们的lo。这次发的时候这个消息啊,就没有这个延迟了。啊,这就属于正常的消息了,然后这个消息呢,呃发给他以后,他会重新再写,写到呃,那个那个叫什么,这个这个呃,我们相应的目标。我们相应的目标逃避。呃。这样就完成了。我们整个。这个延迟啊,整个这个延迟具体。实际上还是有些复杂的啊,我们来看。呃,是这样的。Producer啊,把消息发送到ER以后,那么会首先将消息写入到我们的computer lock文件是吧,就是第一步,这肯定要写到这儿,对吧?然后需要将其分发到相应的。
03:07
Consume cute。不过在开发之前,系统会先判断消息里边是否带有延迟等级。DN等级啊,是需要我们设置的,比如说我们先可以看一眼啊。我们可以看一眼。That。我在这设置一个烟台等级三是吧,他就你你是可以设置的啊。呃,这个判断是否带有延制等级,如果没有则直接正常分发,就你我们以前的分都是没有的嘛,对吧,你你往那一放分发就分发到它里边,这正常分发,但如果说有呢。若有,则需要经历一个复杂的过程。首先。我们修改消息的topic。变成他了,你注意啊,我们现在要改套贝壳了,改成他了。
04:00
然后呢,根据延迟等级。在Q目录的这个主题下创建相应的。QID。目录创建线的QID目录与这个与这个文件。那家长说了,如果没有这些目录和文件的话,我就成又有,我就不用了,大家看这什么custom q。是吧,然后呢,这是它的这个schedule public叉叉叉是吧,然后这创建你注意啊,这里边儿01234,这是什么?这实际上这个是QID。定的目录。这是这个cons q文件对吧?这个目录就是QID是什么?同时它也是我们的。这个这个这个这个这个叫什么?呃,延迟等级,也就是说啊,我们这里边儿。哎,大家需要注意啊,我们的QID是从零开始计数的,而我们的刚才说了,呃,这个这个这个这个延迟等级是从一开始计数的啊,所以。
05:10
这里边儿啊,呃,写上一句话。写上句话啊,就是呃,延迟。等级。呃。你嘞。Level。啊,与。Q。ID的对应。关系。嗯,喂。QID。等于。呃。Let。Level。减去一。因为delay level是从一开始计数的,对吧,他们之间的关系啊。呃,需要我们大家注意啊,你看它里边写的这个,呃,给大家抓了一个这样的图啊,这个其实你不要理解错了。
06:06
不要理解错了,就是他这个这个这个QID对应的这个延迟等级,对应的这个QID目录啊,不是一下把这。所有的目录全都给你创建了。你用到哪个了,他给你创建哪个。明白吧,他不会说把这里边儿所有的都给你创建。啊,这是这是我们需要注意的一点啊啊。需要。注意。嗯。在。创建。QID。呃,目录目录时,呃并不是一次性的将所有所有呃延迟等于对应的,呃,这个目录啊,全部。创建。完毕。而是而是呃,用到哪个。
07:06
延迟等级。啊,创建哪个。是吧,啊,这是。呃,我们需要需要注意的啊。呃,继续我们看啊,然后紧接着这不是这不是创建了目录了吗?创建目录,大家想一下,创建目录以后,紧接着我们要做什么,我们是不是要把这些。这些,呃,Cons q文件里边是不是写我们的那个索引目录。索引条目是吧,而这个索引条目也改了,所以这需要修改消息的索引单元,索引单元的内容。顺单中的。Message tag后我们大家知道所单元,你看我们在哪讲了啊。索引,呃,在这。
08:03
消息的存储它。所以条目。是吧?我们这个索引条目不是三部分吗?这是log set是吧?这消息的长度,这放的是不是消息的tag,只不过tag的值。是吧,那现在改了要给他改。要给它改,改成什么呢?把这个message tag code啊,这部分内容就像我跟我们刚才那个是一样的啊。把它原本放的是呃,Tag的code的值,现在。现修改为消息的,注意消息的投递时间。现在改了。改成消息的投递时间了,什么是投递时间啊?投递时间是指这个消息被重新修改为原来的topic后,再次被写入到的时间。就这样,我们看这个图。
09:06
就他会把这个消息重新再给他。那这个时间叫什么?叫投递时间?这个时间要投递时间,按照这个投递时间啊,在这里面放的投递时间。那投递时间到底是什么呢?大家看,投递时间实际上是消息存储时间加上延迟等级时间。投递时间。投递时间等于消息存储时间加延迟等级时间,消息存储时间就是我们消息被发送到broke的时间戳,也就是这个里边就我们生着把消息往它里边往brokeer一发,哎,这这个时间戳。啊,这个时间车,这个时间圈,再加上谁呢,延迟时间,你比如说我们刚才说了这指定。
10:00
啊,三级,三级延迟是十秒,那就是加十秒。加十秒,就是你发送到我的博客以后十秒钟。你发生了博克以后啊,十秒钟以后,我再把这个消息重新再投递一次。明白吧,就这个意思。我把这个消息单元内容改了啊,然后将消息所引写入到这个里边,你形成以后他肯定要写。是吧,就写到这这这些文件里边,当然。也就是写到。呃,写到这这个的Q,那我们刚才说了三级012就写到它里边。就写到写到这个文件里面,写到这个文件里面。012不是三级吗?啊,这是写进去以后啊,紧接着我要投递延迟消息了,所谓的投递延迟消息,就是说我们把这个消息啊,要给他重新再发到博ER啊,你看怎么做啊。
11:02
呃。呃,这里边儿啊。其实其实说到这儿啊,老雷又又想到一个,呃。比较深入的问题就是关于关于这个投递时间点啊,我又想到一个更加呃更深入一些的问题,我们把这个问题再再讨论一下啊,再讨论一下。就是这个。就这个啊,我们不是说刚才写到它里边了吗。Let you go。里边啊,放的这些消息单元。这些索引单元啊。他是。怎么样?存放的。或者说他是如何排序的。它是如何排序的?咱们深入的说一下,因为这个是它会影响到我们后续的内容啊,会影响到后续,所以我们呃,深入的理解一下他啊。
12:05
也就是,嗯。这个。嗯。目录这个目录中,呃,各个。延时。呃,等级。Q。中的消息。而是如何。排序的这个问题。这个排序啊,给大家说是什么,是按照。消息投递投投。呃,投递时间。排序的,这结果就按照这个投递时间排序的。为什么啊?呃。或者说。或者说呃。
13:04
我们刚才说啊,是按照投递时间排序的,这个投递时间排序实际上是按照什么排序的呢。大家看这个投递时间等于什么?等于这个这个消息存储时间加上延迟等级时间。大家需要清楚一点啊,就是我们一个里边啊一个。AR中。同一等级。的所有。延迟消息。会被写入到。什么这个这个这个这个。Consume目录。中。就这个。啊,目录下目目录。下相同。这他会写到同一个,就你整个博里边啊,只要你是一个等级的。
14:05
这个消息我不管你原来的topic是什是什么,只要你是一个等级的,我都会写到相同的,比如说都是三级的,我都会写到它里面。都会写到它里边,都会写到它里边。那。也就是说啊这啊一个Q,就我们这样一个Q啊中消息。OD时间的什么?延迟。等级事件。而是。也是我们这个延迟等级时间是一模一样的。整个只要是这个。Q,里边的。呃,消息它的延时等级时间都是一模一样的。那所以。那么。投的。头顶。时间就。
15:01
取决,取决于谁啦。是不是我们这个消息。存储时间。肯定要取决于这个消息。一时间了。是吧,也就是说按照消息投递时间排序,其实就是按照你消息。啊。发送到。等事件进行。是吧,那当然其实当然想一下,当然是这样,就是你过来一个消息咔叉,比如说啊,我这过来十个,过来十条消息,他们都是呃三等级的,你先来一个,肯定先进到Q队列,再来一个再进到Q队列,再来一个再进到Q队列。他们都是进入到比如说。是不是这个这个里边,所以这里边儿的排序肯定是按照什么排序的。
16:03
存储时间就是到到了博克的这个时间并排序的。那这个我们深入的说一下,它,因为对于我后后边这个啊,呃,就是我们要用到这样一个概念。
我来说两句