00:00
我们接下来讲预取值。预取值什么意思呢?就是我们刚刚讲完不公平分发,对,就是将消息。分发给多个消费者,那么分发给多个消费者,咱们之前都是按照一个一个发,哎,你发一个,我发一个,这个是轮训原则是吧,轮训。分发原则,你一个我一个,哎,你一个我一个,你一个我一个,后来我们又讲了一个不公平分发就是你一个。不止给我一个,为什么呢?是因为我干活比较快,那我就多给我两个,那么到底多给我几个呢?是吧,这到底多给我几个呢?所以这里面就牵扯到这么一个问题,来一起看一下。生产者。对发消息,发多少消息呢?咱们再设定一下,例如咱发。七条消息。
01:00
啊,这七字呢,我们特意呃想了一下七条消息。至于七条消息分别是谁呢?我们已经都想好了,准备发给队列。这个队列名字叫A下划线对吧,完了呢,发七条瞬间就发给队列了。分别都是哪些消息呢?我们可以简单的说一说。例如一一。完了呢,R。3344556677,诶发了这么七条数据。这七条数据一旦到达队列之后,有几个来接收队列的消息呢?有两个,诶有两个消费者,消费者。这是消费者一,我们就算一吧,起名其实叫C1啊,我们已经起了半天的名字了,完紧接着还有个消费者叫C2啊,所以把它放在这儿,这个是C2。完之后再往下呢,拿个箭头挪过来好。
02:00
他们两个都负责接收消息,那么这里又牵扯到一个词语叫预取值来写上交。欲取之。什么叫预期值呢?就是说你发消息不再是按照原来那种你一条我一条,或者是你就一条,其他条全给我。这种两种方式呢,我们也都学完了是吧,一个叫轮训分发,一个叫不公平分发,好能者多劳,那么预取值就不一样了,预取值就是确实是要分发,但是呢,指定C一分多少,指定C2分多少。举例子,我可以指定一个让C1分到,比如分到两条。对吧,分到两条的话,那么我们有个名字,这个欲取值的名字就是这个叫P。啊是吧,好像是一个。预取值的话,那来我们回来。
03:00
这个单词呢,就叫per。对,完了呢,获取单词是吧?哎,欲取值可以默认我们写的是一对吧。哎,默认是一一的话,就你一条我一条,但是我们可以指定,例如你拿两条吧,对,写个二。拿两条,你呢,可以设置其他条数,例如拿你拿一个五条吧。随便写是吧,这都是可以提前设定的。比如你拿五条。那么你拿两条,你拿五条,加起来多少条?七条。也就意味着可以指定到底分发多少,这样的话,一旦不管他执行快还是他执行慢,那么他一定会得到多少条两条,他一定会得到多少条五条。这就不是说你你能干你多干点儿,你不能干,你少干点儿。那么正常情况下呢,就是也会遵循谁能谁能干啊,谁多干点,但是如果你只有七条数据,那么就按照这种分配你两条。
04:07
他五条。不公平吗?不公平。这是提前设定好的一个叫预取值,七条数据分给他两条,分给他五条,这个也可以理解为是属于指定性的,指定你干两条才行,诶,你干五条才可以。即使你干的慢,那也要干完五条再说,如果七条之后再来第八条,第九条,那么可以优先给C1干,因为C1干的快,诶,C2干的慢。对吧,C1干得快,C2干的慢,但是他们两个一旦这么设定,至少前七条数据一定按这种分方式分配,C1即使干得快也是两条,C2干的慢也是五条。哎,这就是属于预取值。这就是预取值啊,提前设置在这个信道当中,因为这个箭头呢是信道啊,图上呢,文档上也有一张图,你看这张图呢,画的也很抽象是吧,但是应该也好理解,相当于被发消息预取值,预取值是几呢?是四,所以是5678。
05:14
相当于放了四条数据在这个信道里,就跟我们这张图一样啊,你这写二,那么就意味着在这个地方信道。就这个位置的这个地方是个新道是吧,在这里面就放上,放上几条数据呢?放两条啊一和二完了这个里面,哎有也是一个新道,放几条呢?放五条,放五条分别是34567。放放五条,哎,这就是预取值的一个真实的含义。那么按照文档上来说呢,就是说这个我们预取值是可以设置的,对吧,是可以设置的预取值呢,如果你设置好了,可能会出现例如呃,传送速率可能是最佳的。对吧,完了呢,可以呢,效率最高。
06:03
效率最高,因为你可以根据你的机器嘛进行指令,你的机器哪个性能好,哪个性能差,其实你本人应该是能够提前知道的。所以可以提前进行预取值的一个设定。接下来呢,给同学们演示一下子这个效果,用代码演示一下。那么我们依然回到呃,之前的代码,之前代码当中这个C1和C2以及生产者我们代码都写过了,无非就是更改一下预取值。这个是生产者,它是通过控制台进行输入的啊,我们等一会再输入完了这个呢,就是C1,你看上面写着C1用时较短,哎,只有一秒钟,所以它的这个预取值就是刚才设置的不公平分发的这个一。你要是默认是零。完了呢,你写成一就表示不公平分发,但是如果你写成二呢。对,这就表示是预取值了。
07:02
预取值是几呢?预取值值是二啊,预取。是二同时你把那边。另外一个消费者那边也给他,例如先注释掉。再加一个例如它的预取值,我们按照说的是几是五,所以把预取值改成五。它又可以当预许值使用。那么也就意味着将来这个执行慢的,因为每次执行多少多久,30秒执行非常慢的这个消费者,他将会预取到五条,我们一会儿打算在生产方。发几条呢?发七条。同学们就可以看到预计啊,就是他能收到两条,他能收到五条。对吧,他能收到五条,但是这个东西不是绝对的,不是绝对的,因为你发七条,他可能有个先来后到。
08:01
先来后道什么意思呢?哎,你发个112,哎都进到这里面了,完了你后面的来到这儿了。啊,由于我输入手速比较慢啊,有可能呃,半天才输入一个5566,那也就意味着七条不是马上出现的。对,七条不是马上出现的,可能是先出现个123,按照预期值来说,它有可能这个11122来进入到这里面了,当然了它不是呃连连续的,他一般是你一条我一条给的。什么意思呢,就这呢,一一的时候,你可能把它放到了这个心道里,完了二二的时候,他可能放到了这个心道里,完了三三呢,又放到了上面心道里,注意这个时候心道里面有几条。有两条吗?不一定。为什么呢?因为当你输入一一的时候,有可能信道里面这个一一已经执行完成了,对已经执行完成了,所以导致在你输入三三的时候,其实心道里有几条,只有一条,对,只有一条。
09:00
所以他这个预取值一定是消息堆积在这个信道里,而并不是说你传个一,一消费者消费者C1给消费掉了,那么你传个三三就能算两个不算,因为一已经被消费掉了。这个效果要要想能演示的出来,必须是通过谁演示呢?通过C2,因为C2的消费速度非常的慢,他大约得需要30秒的时间。对,他的消费能力比较差啊,消费结账。消费能力差多久呢?哎,30秒。才消费一条。消息。所以这个效果要想能演示的清晰,就必须得看C2了。怎么看实验呢?我们依然发七条。这七条当中势必会有五条对。进入到C2当中。对吧,进入到C2当中,但是由于C2执行非常的慢,30秒才执行一次,这个咱们这边输入的即使慢一点,这里面应该也会堆积。
10:10
多少条数据五条,为什么呢?因为连第一条都需要30秒才能执行完,那么后四条是不是就等着等的时间更久啊,而我们这边慢慢的输入也是来得及的,所以我们一会儿演示主要不要看C。看谁呀,看C2 C2是可以清晰的看到里面积压着五条数据,迟迟不能处理。那等于说那积压的信息不能让C处理吗?不能。由于你设置了预取值,这个预取值就相当于它已经在这个位置啊,已经排了队了。排了队的消息不可能再由C1去处理了。因为这些排了队的消息完全属于C2来处理,不可能由C一来处理。所以造成C2这个位置会积压几条五条数据。
11:01
好,我们来代码演示一下效果。首先呢,我们C2当中呢,由于执行多长时间30秒,那么下方你看预取值也设成五个了,那么C1呢,执行的比较快,预取值设成两个了,而C1是没法演示的啊,因为它太快了,一秒钟就执行完了。所以我们在生产者这边大约生产七条消息左右是吧。可以多点没有关系。好来咱们试一下啊,首先要将服务呢都重启一下。来重启一下。这个呢,C一起好了,C2呢也起好了,这个时候我们来试一下啊,首先呢,我们准备发消息。发消息这能重启一下啊,我们发一个11223344556677好。接下来我们看一下C1,它消费了三条,而这边一个都没消费呢,你可以再输入两个八八。
12:04
九九。实时。好完,这个时候重点看谁看C2啊,C2这里面在这个位置我们可以清晰的看到。C2的里面堆积了四条。对,堆积了四条啊,总结刷慢了,堆积了六条了。推进六条之后呢,紧接着我们再往下看,他已经处理了一条,还剩几条,还剩五条。对,那么它这个堆积是怎么造成的,是我们刚才又发了。已经发出超过七条了。那么正常情况下,他这里又堆积几条,堆积五条,那么为啥刚才堆积六条呢?是因为呃,C2马上就要消费掉一条,所以呢,这个队列认为这个他已经呃应答了,对,已经应答了,只要一应答。其实这里面有五条就会变成四条,但是还没来得及,他又往里面填了一条,变成了几条,变成了六条,而第六条发过来之后,这前面的消息是,呃,是五条的。
13:03
咱们可以看一下。咱们呢,可以再重新。发一遍啊,因为现在已经消费剩三条了,那我们其实这里面已经消费了几条了,哎,消费掉两条了,哎两条加三条是几条五条。对,这就是五条。所以呢,你看咱这线啊,这个线也足以证明他接收了多少条。你看现在已经降下来了,降上平均是四条,之前最高峰应该是五条,因为它这个预取值直接决定了这个位置的上限,你看这个位置的上限是几呢?是五,哎,就是说一直最高到五条,现在目前平均是四条,因为好半天啊,已经好半天我没有再发消息了。所以呢,这是上限是五,也就是预取值就是五。还也可以通过这个信道啊,这个信道这个位置也可以看到,哎,你看这呢,看到它的预取值是五,对另外一个信道呢,是我们预取值是节是二,你看都写着呢,预取值是五,预取值是二,这两个呢,就是我们的两个消费者。
14:08
通过这些位置都可以知道,我们的预期值确实是二和五。好,这就是我们的预取值的设置。
我来说两句