00:00
接下来我们就来使用代码完成一下延时队列的功能,那们还是参照我们之前的这个下单场景,那们现在呢,就想让订单一旦下单成功以后,我们过了30分钟没有人支付,我们会给他来进行一个自动的关单,那么说以前可以用定时任务来做,那我们现在呢就用延时队列完成,那既然要使用延时队列,你就得创建一些相关的交换机和我们的队列,那假设呢,我们就使用这个场景,好,现在呢,我们创建了这两个交换机,一个叫user orderle change,一个叫user order X change,然交换机名字随便我叫ABC都行,然后呢,我们还创建了两个队列,这个交换机呢绑定的是这个队列,这个交换机呢绑定的是这个队列,然后呢,我们整个关系应该是这样子,首先我们这个P生产者,那就是我们的订单服务,订单服务呢,只要完成了一个订单,相当我们这个下单成功,他呢就先给我们消息队列服务器,我们的。
01:00
Re MQ来发一个消息,这个消息呢用的路由件就叫order delay,然后这个消息呢,我们先发给我们这个交换机,叫user order delay exchange,然后我们这个交换机就一看,诶,我们有消息来了,用的是这个路由件,它呢找到我们这个队列跟他绑定,用的是这个路由件,好,那接下来把这个消息就沿着我们这个绑定关系,我们发给我们这个队列,但大家注意,那么这个叫user order delay q的队列,它呢是一个特殊的队列,那么设置了三个参数,第一个参数呢,叫X dead letter exchange,称为死性路由,相当于我们这个队列里边的消息内容,如果死了以后,我们应该交给我们这个交换机,我们这个交换机呢叫user order exchange,相当交给他,然后我们还配置了一个叫X letter RO k相当于我们这一块消息死了以后再交给别的交换机用的路由件呢,叫order,然后我们还指定了什么X message t TL。
02:00
现在我们队列里边的所有消息存活时间是6万毫秒,也就是一分钟,那我们将这个队列呢,我们其实就称为死性队列,它是一个特殊设置,每一个消息呢,有它的过期时间,而且死了以后交给哪我们都设置好了,而且大家注意,我们这个队列呢,没有人去消费,我们没有任何人去从队列里边拿数据,所以我们的消息生产者先发给我们这个交换机,然后呢,放到队列里边,它就存起来了,但一存只要一超过一分钟,我们这个re MQ就会从队列里边把这个消息拿出来,像这个消息变成死性了,原来拿出来的消息我们可以把它丢弃,但是我们说了,死了的信不要丢,交给我们这个隔壁的user order exchange,所以呢,我们这个信就会重新交给我们这个交换机,然后呢,这个交换机我们说交的时候用order路由件,然后这个交换机收到的这个信,由于路由件用的是order,他就找绑定关系,Order他呢找到了这个队列。
03:00
所以最终我们这一块的死性呢,我们就会跑到我们这个队列里边来,只要我们有消费者去来监听我们这个队列里边的内容,那这个队列里边的内容一定是我们这个生产者发的这些消息一分钟过期了的才会来到这儿,所以我们只要这个队列收到内容了,我们就可以给他判断我们这个订单,只要没支付,我可以给他关单,这么说的,这个延迟队列的场景,如果我们要做就这么来做,但是呢,基于我们这个业务的消息队列设计,我们现在业务里边呢,我们后来遵循每一个微服务有它自个儿的交换机,们是命名叫当前微服务,加上event,我们就是感知当前微服务各种事件的交换机,然后呢,这个交换机下边会拖很多的队列,我们都要遵循这种规范设计,那接下来呢,我们就按照这种规范设计,我把它呢重新升级一下,这是最简单的模式,我呢现在把它升级成这样一个模式,大家来看。
04:00
那能不能看懂这个,我们现在呢是这样,我们这个生产者就是我们的订单服务,只要一下订单成功,给我们re MQ发消息,发消息呢,先发给我们这个交换机叫order event exchange,像订单事物的这个交换机来订单这个事件的交换机,我们用到路由件叫order create order,然后呢,我们这个交换机收到我们这个订单创建成功的这个消息以后,它就会按照这个路由件找到我们对应的队列,我们会发现呢,这个交换机绑了两个队列,一个在这,一个在这,跟我们这个队列的绑定关系叫order create order,跟这个队列的绑定关系叫order release order。那这样的话呢,我们第一次创建完订单,我发的消息用的是order create order,那就跟着交换机,跟着这个绑定关系来到我们这个队列,当然呢,这个队列又是一个特殊的队列,它呢是一个延迟队列,比如我们的名字叫order delay q,那么这个延迟队列里边呢?
05:00
设置了三个,第一个叫我们的X dead letter exchange,我们这个死性队列里面说我们这个性死了交给我们这个路由,包括呢,我们性死了交出去的时候用这个路由件,包括我们这个信的存活时间是一分钟,所以我们只要订单一创建成功,这个消息呢,就会直接发给我们这个队列,那这个队列里边的消息,注意这个队列还是没有任何消费者来消费,所以这个队列里边的消息存了一分钟以后,他这个过期了,过期本来想要丢,但是呢,按照人家指定的规则,把过期的消息呢,必须交给我们这个交换机,然后呢,使用这个路由件,那接下来我们队列里边过期的消息就会来找这个交换机,Order event exchange,相当于呢,这个死性重新要交给我们订单服务的这个事件交换机,但是呢,此次交出去的这个消息用的路由件叫order release order,所以我们这个交换机呢,相当于收到了一个。
06:00
只不过人家是用这个路由件,所以他就找到我们这个绑定关系,那我们这个死性呢,顺着这个又回过头交到了我们这个order release q的这个队列,加上我们订单的释放队列,我们的订单释放服务,我们就专门来监听这个队列里边的所有内容,只要这个队列里边内容一到达,那都是我们刚创建完订单,过了一分钟以后我们到来的,那我们就可以在这来判断关单,那么接下来呢,就基于这种场景,我们来做我们的整个延迟队列。那想要做这个功能,我们就得先创建出这个交换机,这有一个交换机和两个队列,并且呢,跟他们的绑定关系我们都要创建好,那么来创建这个呢,我们来到我们的订单服务里边,好,现在呢,以关单为例,来到订单服务,那么订单服务想要用消息队列,我们先来看我们有没有导入我们的消息队列,AMQP我们什么都导了,那现在呢就来直接用,我们说呢,以前创建交换机之类的,我们可以使用这个am qpdmin,我们在这呢,直接指定来创建哪个交换机,创建哪个队列,创建哪个绑定关系,但是这样呢,其实都太麻烦了,在spring它呢,有一个非常简单的方法,就是我们来写一个,比如呢,我们叫MYMQ的配置,My MQ conf,好,我们的MQ配,然后呢,在spring里边,它呢,允许我们直接使用ATT并的方式,然后给容器中来加组件的方式,你可以把你的这些帮顶给容器中一放,包括。
07:33
后呢,把这些这些队列也好,交换机也好,我们只需要放到容器中,它呢默认就会生效我们这个队列,以及我们的这个交换机,所以我们接下来呢,就使用这种方式,那我们现在就来创建来,那现在at public,我们现来创建一个队列,Q,这个队列呢,我们使用amqp核心包的,好我们创建一个队列,这个队列呢,我们先来照着我们这个图创建第一个叫order delay q,好,我们这个队列呢,它是一个延时队列,我们也是死性队列,好这个队列里边的信只要过一段时间以后就会死掉,就会发给别人,好我们先创建这么一个队列,因为我们按照这个图先得创建两个队列,好,我们就来准备好两个队列。
08:20
我们把这个队列呢,一个方法放在这第二个方法,那第二个队列的名字,我们比如就按照这个名字来走,那我们这个名字呢,Order release。Order release order order。Q,好,那么现在呢,队列我们就叫这个名字,好,那么现在呢,准备创建两个队列,而且呢,还有一个交换机,我们就来写一个public exchange exchange。Amp核心包里边的exchange好,那么这个交换机呢?它的这个名字叫order event exchange把这个交换机也创建出来,就叫order event甚好,两个队列一个交换机,那既然有两个队列,这个交换机跟这些队列肯定又有两个绑定关系,所以呢,我们在这儿public来放两个帮顶。
09:13
帮定我们都先来写在这帮ing呢,还是amp核心邦,第一个帮定我们就叫create order的这个帮定好我们就叫order create border order,我们用路由件来做这个绑定关系好order create order。绑定,这是我们第一个绑定,然后呢第二个绑定,第二个绑定我们呢,就叫我们这个指定的order release order,我们的这个绑定关系好来到这儿,那现在呢就叫order release order,那现在呢,一个交换机,两个队列,两个绑定关系,那现呢准备在这儿,那我们接下来要做的事情就是我们来创建出这些在spring应用里边,它允许我们直接使用ATT并应的方式,只要把我们这个队列给容器中一放,那它呢就自动会连上rabbit MQ,把这些队列呢在我们MQ服务器里边创建出来,所以我们这个at b的作用就是容器中的,容器中的这些组件,无论是帮顶Q还是我们的exchange,它呢都会都会自动创建,都会自动创建,当然前提是我们这个re MQ里边没有啊re MQ没有的情况,如果rabbit MQ没有呢,你就会自动。
10:31
创建,所以我们将这些呢,都来先加到容器中,来加到容器中,每一个呢,我们都来加到容器中,我们让它自动来创建,好加到容器中,那先来访问我们的rabbit MQ,那rabbit MQ呢,我们来15672端口,那直接是1921685610,我们来找15672端口,我们来访问我们的rabbit MQ,先来确定一下,这个里边呢,现在默认队列就我们这五个,包括我们这个交换机,也没有我们指定的什么order之类的交换机,好下来呢,我们来就准备创建,来创建第一个队列,既然要创建队列,我就来写一个new,一个Q,好,那现在来创建一个队列。
11:15
那这个队列呢,我们创建的时候要用很多参数点进来,那用最长的这个参数啊,这最长的参数呢,有这么多我就复制过来,CTRLC,我们直接给这一放,第一个队列的名字order delay q,我们这个队列的名字呢,那就叫它order delay q好,我们创建第一个队列名字呢,叫它,然后呢,队列是不是持久化的来写一个处是不是排它的false,然后呢,是不是自动删除的false,然后我们这个队列里边。有没有一些自定义属性,好,我们先把这个队列呢创建过来,我们让它返回出去,Return一个Q,我们看如果我们创建第一个队列order delete q,那这个队列呢,由于它是一个死性队列,它有这三项设置才是我们的死性队列,所以我们呢,相当于有属性,我们要设置这三个属性,所以我们接下来就来给他设置,我们会发现呢,属性它要求我们传一个map string object,那么就来准备一下,我们这个队列呢,确实有一些特殊属性,我们就来准备好map object,好,我就叫arguments,这arguments呢,就等于又一个我们的哈西map来准备好,好我们把这个arguments放在最前边。
12:37
我们给他传的时候呢,你就来传我们要构造用的这个参数,那现在呢,相当于要构造这三个参数,那这三个参数呢,直接给map里边放就行了,好来map里边来一个一个放arguments,来put,第一个我们这块的K现在就叫X data later exchange,这都是官方文档里边列取的。
13:01
我们就直接来在这写好,我们现在呢指定的这个死性路由,死性路由呢,我们现在是指定为它,这是第一个,然后呢,我们再来放,就按照我们之前的规则把这些一放就行了,死性路由还有我们的这个死性用的路由件好,这是路由件好路由件呢,我们用的是这个叫order release order,然后呢,再来加上我们的这个消息过时间好点一个put put,我们消息过期时间是X message t TL,好,然后我们这个message呢,它是以毫秒为单位的,所以我写一个6万毫秒,那就是一分钟,那现在测试代码就用一分钟来测一下,我们也不等半个小时了。好,这是我们第一个队列就创建好了,那再来创建第二个队列,叫order release order,那就是这个队列,这是一个超普通的队列,好它的名字叫它,那么就来创建它,那我们把队列的这个创建,我们就直接复制过来,CTRLCCTRLV。
14:01
那第二个队列呢,它是一个超普通的队列,也没有什么参数设置,你就去掉,只有一个我们指定的名字叫它,那么就来指定过来,好,这是我们第二个队列,我们就来准备好了,那这两个队列准备好了,我再来准备一个交换机,那就是这个交换机,这个交换机呢,既然能绑定多个队列,按照路由键不停绑定,我们就可以给它设置一个topic交换机,特别我们说一个微服务,如果按照我们这个设计,只对应一个交换机,交换机来绑定多个队列的话,我们这个交换机呢,一般我们都要使用topic,我们可以由这个路由件模糊匹配的方式,这样呢功能就更强大了,所以我们应该创建一个topic类型的交换机,好,那现在呢,就在这有一个叫topic这个exchange,好,我们来创建出这个交换机,当然交换机要创建的参数有哪些,来点进最长的这个点过来,它呢,要用这三个参数。
15:00
CTRC来复制过来,把这三个参数我们来拿过来看一下,第一个是交换机的名字,那就按照我们图里边交换机叫啥名我们就来写啥名,它叫order,杠,Event exchange,好那我们的名字就是它包括呢,我们死性路由也会路由到我们这个交换机,好因子呢我们指定了,然后呢,再加上我们这个交换机呢,也是Du持久化的,不用自动删除,我们也没有任何参数,就是一个超普通的交换机,好来return出去,交换机也创建好了,然后呢,我们接下来交换机就跟这两个队列得有它的绑定关系,那么接下来就来创建两个绑定关系,直接来new一个帮顶,我们来创建绑定关系,这个绑定关系呢,要用超多参数啊,这个参数我们来直接给这一复制CTRLC来看一下我们每一个参数都要怎么用来第一个destination的目的地。还有我们的第二个目的地的类型,那相当于是要将这个交换机跟我们这个目的地进行绑定,所以我们现在先目的地,目的地呢,我们交换机跟第一个目的地,那就是这个队列进行绑定,我们先把这个队列我来复制过来,CTRLC,好,我们先跟这个队列order delay q,那这个delay q呢就在上边,就是它这个队列的名字就叫order delay q好,那现在跟它进行了绑定,然后呢,这个目的地类型,因为我们现在绑定的是一个队列,所以目的地类型destination type,好,这个type呢就是一个队列。
16:35
点一个Q,那这个目的地呢,是一个队列,然后呢,我们是哪个交换机跟我们这个目的地绑定的,那就是我们的order event exchange这个大交换机,那就是这个交换机跟这个队列绑定的,好,我们把交换机呢在给这一写,我们再来写一个叫ROK,我们的这个路由件,我们绑定的时候呢,我们给他们用的路由件是这个,那这个逗号呢,放在上边啊,我们看一下我们的图,这个跟这个绑定的路由件用的叫order create order ctrl c复制过来就放在这,然后呢,这是我们的路由件,再来后边我们还有一个。
17:14
Map arguments,我们现在也没有任何参数属性设置,因为这个绑定关系呢,就是一个普通的绑定关系,你就直接return出去就行了,好那这一块的绑定关系我们来看一下哪一块呢有问题,咱们这块有问题,目的地的类型,目的地的类型,好我们把这个目的地的类型来重新写一下。这块目的地的类型呢,他要用的是哪一个类下的点进来是这个。叫destination type来CRC来复制过来,那这个确实是我们destination type里边的队列好,那现在呢是这个队列好,那这一块呢就没啥问题。这儿多一个逗号,然后最后我们这一块呢,还要传参数,没啥参数,我们就来传一个now,它呢必须是一个全残构造的啊,那现在呢,这个绑定关系就写好了,那么相当于将我们这个交换机跟这个队列的绑定关系写好了,然后再来将这个交换机跟这个队列的绑定关系,我们用order release order好,我现在呢再来写一个绑定关系,CTRLC来复制过来,CTRLV,好,那现在呢,接下来要绑定到目的地,那就是这个队列了,CTRLC我们复制过来,然后呢,把这一块目的地来变一下,交换机呢,接下来跟这个队列绑定,然后呢,用的目的地类型就是它就是我们这个交换机,我们就从头到尾就这一个交换机,然后我们用的路由件,我们把这个复制过来叫order release order,好,那在这呢,复制过来。
18:48
走,那这样呢,我们就创建呢们这一个交换机拖了两个队列,一个队列呢是死性队列,这个队列呢比较特殊,那么现在来直接启动我们的订单服务,看一下我们里边能不能帮我们创建出这些队列,好,我们先来看一下我们的MQ里边这些队列呢,现在默认都没有来等待订单服务的重启,那现在呢,这个订单服务启动成功了,我们来看一下我们的队列里边的内容来刷新一下来我发现呢,就有两个,一个叫order delay q和order release order q,而且呢,我们来看这个Q队列呢,它很特殊,它的这个特性里边首先写了一个D,它是duable持久化的,然后呢,有一个叫DLX,相当于呢,它在这设置了一个这个死性路由,这个交换机exchange,还有一个叫DLK带letter RO k我们在这呢,也有指定了,包括我们还指定了消息的TT,我们看到X message t TL是6000。只不过这。
19:48
多了一个TTL0,那在这呢,应该没有设置TTL0,哦,就是这个,那说明整错了,那整错了的情况怎么办呢?如果我们再来重启它,是不是能把这个之前的错误覆盖掉,我们可以来看一下效果,来等待这个订单服务的重启,好现在我们这块呢,订单服务启动成功了,那前面这还报了一些错误,是西塔的,这个错误我们就不用管了,好那现在来看一下我们这一块的队列来刷新一下,我们发现呢,这一块的属性我们并没有覆盖,所以我们说一旦我们这个项目为我们MQ创建好队列以后,一旦创建好队列以后,一旦创建好队列,创建好队列相当于我们的这个MQ里边只要有,也就是rabbit MQ里边只要有我们以上的这些东西,那么MQ只要有,即使我们这一块呢,属性发生变化也不会覆盖,属性发生变化也不会覆盖。
20:47
所以我们这个at b应我们声明的这些属性发生这些变化呢,不会覆盖,所以我们现在呢,唯一的解决方案就是把我们这个队列啊,就是这个带Q,我们把它呢给它删掉就行了,好,我们直接呢在这来删除这个队列,走,我们把这个队列一删,我们重新再来启动一下就没问题,包括队列一删以后,我们这个订单的交换机,它这个绑定关系也会自动删掉啊,我们现在重新启动一下我们的订单服务啊,重新创建一下。
21:17
我们特别重要的就是这个设置消息的TTL,好,我们现在订单服务呢,启动成功了,你再来测试一下,来看一下我们的队列,队列里边这个呢,重新创建出来了,重新创建出来以后呢,它这专门还有一个TTL说明呢,我们这个是一个死刑队列消息呢,在里边如果过了存活时间就会变成死金,那接下来我们该怎么做,那现在呢,就来测试,那这个生产者发了一个订单,我们订单创建成功了,消息发出去以后,那一分钟以后能不能监听到这个消息,那么现在呢,就来写上一个方法,在我们的这个order订单服务里边行,我们也不给其他业务里边写了,我们就直接写到跟他的这个配置里边,我们来写一个人,他呢,专门来监听我们这个队列,他来监听哪个队列,那么这个消费者呢,必须来监听order release order这个队列,他只有监听这个队列,收到消息才是一分钟以后过期的,好,我们现在呢,就来让他监听这个。
22:17
的队列,比如我们来public VO,我们就叫listen,那现在呢,是监听们这个队列的,好那监听哪个队列,我们用一个注解叫rabbit listener走,那这个listen呢,是来监听指定的这个队列,那这个这个队列就是它那监听队列的这些消息内容,比如我们就来获取取他完整的这个message,或者我们直接发消息的时候呢,我们就指定会给他发一个订单实体,那么现在呢,就来监听我们这个订单实体,Order entity,好,我们就来监听我们的消息呢,假如就是这个类型消息,那我们在这儿控制台就输出,哎,我们这个收到收到收到我们这个过期的订单信息,然后呢,准备关闭订单,因为我们说只要能从这个队列里边收到消息,那他呢,一定都是过了这个时间的,所以我们接下来准备关闭订单,包括订单的这个信息是什么,我们可以打印一下订。
23:17
单点一个,打印一个订单号,咱们接下来写一个请求来测试产生订单。比如我们有一个order controller啊,或者我们在web里边来直接写一个好,就在hello controller里边来写上一个请求,这个请求呢,我们就叫create order test,我们创建订单的测试,我就随便测试创建了一个订单,At,一个test,不是at test at get map,你来发一个get请求,你就叫test测试,Create order测试创建订单。然后呢,我们接下来我们new一个order entity,创建一个订单实体,这样我们就认为这个订单呢就成功了,我们说订单只要下单成功,假设我们这个订单下单成功,你这个对象呢,自己也保存数据库了,这一串操作我们就不做了,我们就直接拗一个它,你就认为下单成功了,我们给他设置一个订单号,好,这个订单号呢,你就随便来一个u u ID run u u ID two spring,好,那我们现在呢,就下单成功了,下单成功以后呢,能给MQ发送消息,给MQ发送消息,我们这个订单成功的消息我们来发出去,我们要发消息,我们要使用这个rabbit tempt,好,我们来准备发消息owa。
24:36
那我们怎么发消息,Rabbit tot调用一个convert and send们要给哪个交换机发消息,我们全从头到尾就这一个交换机,那你就给他发,然后呢,我们第一次默认订单刚创建成功,发消息用的路由件是什么?来看一下,然后发的消息的对象,那就是这个订单实体对象,那么用到路由件是什么?那么对象呢,写在最后,路由件呢,就写在前边。好,那么现在想要把这个对象发出去,用到路由件,我们来看第一次只要订单创建成功,用到路由件叫order create order ctrl c来复制过来,就在这儿,只要你用这个路由件,消息呢,就会通过这个交换机抵达给我们这个延迟队列,经过一段延迟时间以后,你消费者消费的这个队列里边就能收到我们延迟以后的消息,那为了判断这个时间是不是一分钟以后收到的,你也可以给订单里边把他的这些时间都来set上,你自己在那获取的时候呢,也能看到,比如我们set一个modify time。
25:36
一个这个时间就叫用一个date,这个时间是多少,我们在这消费的时候时间是多少,我们都可以看到,好,只要下单成功,我们return一个OK。我们让他呢,Response body给我们来响应一个数据就行了,不是来跳转页面,而且呢,大家注意,由于我们这个订单服务,我们呢开启了手动确认模式,现在们在这呢得手动确认,那所以我们一旦自己收到消息以后呢,一定确认一下,说我们收到了,好,我们在这呢,既然收到消息了,那们就把他的这个通道拿来,Channel这个通道呢,那就是我们rabbit MQ的这个通道,那通过通道告诉他我们已经收到消息了,Basic AC这个AK呢,消息会有一个deliver tnk,这个deliver tnk呢,你要拿到原生消息,我就拿到原生的message,就是这三种类型的数据,我们说你随便写几个都行,写在哪个位置都可以,我们从message里边get properties获取到的他的deliver tank,并且呢,ACK告诉他成功了,是不是要批量告诉?
26:49
我们就告诉当前这一个就行了。那现在呢,就有这个ACK,我们直接一常往出一抛,那现在相当于我们这个订单服务,有一个人专门来监听我们这个release order q,那就是这个,然后呢,我们发的这个消息默认会发给他,第一次呢会抵达给这一分钟以后才会到达这所,我们现在来启动一下我们这个订单服务,测试一下我们这个定时关单,看能不能一分钟以后我们看到效果好,我们现在呢,直接发这个test create order请求,那所有的这个订单刚创建完默认的消息先会抵达延迟队列,延迟一段时间,最后再抵达这个队列,抵达这个队列以后呢,就会被消费,好我们来稍等一下,好,那现在订单服务呢,就启动起来了,你就直接来调用一下我们这个方法,好,我们来打开订单的这个端口号,订单服务的所有调用都得登录,那么就先来登录好,现在登录成功来重新来到我们的订单,然后现在这个订单服务order。
27:48
点一个鼓励ma com,好,我们现在呢会发一个这个请求叫test create order,走,我们返回了一个OK,来看我们消息队列,那消息队列我来刷新一下,诶,我们发现呢,延迟队列里边确实有一个消息,什么时候消失呢?来看一下我们控制台,控制台呢没有打印,我们说要关闭订单的这一块,哎,那我们什么时候会打印,我们在这儿呢等。
28:15
等上一分钟以后,我们只要这个队列里边的消息延迟时间一到,我们发出去以后,那在这儿呢才能看到,好我们可以来在这儿来做一个监控,我们来看一下这一块,我们创建订单好的消息已经发出去了,我们现在延迟队列先保持着,保持一阵时间,只需要一分钟,好我们发现呢,一分钟时间到了,我们这块显示他收到了这个过期的订单,那就是这个我们这一块呢,由于每隔五秒一刷新,所以我们这一块呢,看到了我们这个队列里边没有内容了,而且我们刚创建的这个订单确实是一分钟以后才收到的,所以我们可以批量创建上好多订单,一个两个,三个,四个,五个,我创建出五个订单,但是我们这个控制台,那现在呢,确认这些订单都发出去了,但是我们一分钟以后才能收到这五个订单的消息,然模拟了这个定时,那么就来稍等一分钟,好,那等了一分钟以后,我们看到刚才的这五个订单,那陆续就过来了,所以我们现在呢,就是一个定时的。
29:15
消息我们现在就过来了,那么下一节课呢,就使用我们这个延时队列来完成我们库存的自动解锁,来实现最终一致性。
我来说两句