00:00
同学们,刚才呢,我们写了一个。多线程接收消息对吧,多个工作线程接收。消息,接收一个对立的消息。我们成功的完成了这个工作线程的一个消息。只能处理一次,不可以处理多次,三者之间的关系呢?是竞争关系。这个实验呢,我们已经完成了。但是呢,这里面呢,又出现了一个新的问题,这个新的问题就是。消息应答问题。文档上说,消费者完成一个任务可能需要一段时间。如果其中一个消费者处理一个长的任务,并仅只完成了部分,突然他就挂掉了。会发生什么情况呢?那么会发生什么情况呢?来,我们一起看一下。如果真的是工作线程说的是C1啊,他如果的工作时间如果非常的长,时间非常的长,那么就会造成。
01:03
一旦工作时间长,并且在工作过程当中。工作了一部分,突然C1的工作线程宕机了,或者是挂掉了,导致。导致什么导致任务并没有完成?那么队列当中如果把这个消息生产者发来的消息,例如a ABB CC发过来的消息给删除了,那么工作线程又没有完成。那么,这不就意味着消息是不是就丢失了呢?对,这就是丢失了,所以我们接下来要讲的内容就是消息的一个应答。为了防止消息丢失,你看这呢?他说,为了防止消息丢失,为了保证消息在发送过程当中不丢失。In MQ引入了消息应答机制。什么叫消息?应答就是。消费者在接收到消息并且处理该消息之后,告诉朱医师之后啊,一定要处理完消息之后告诉MQ。
02:09
他已经处理了MQ,此时可以将该消息删除了。那么也就意味着Q的删除应该在消费者应答之后再进行删除。那消费者什么时候会应答呢?当然是把消息处理完了。所以如果处理不完,就像这张图,如果没有处理完,C1就不可以向队列进行应答,只要你不进行应答,队列的消息是不会被删除的,只要不会被删除,消息就不丢失。那么一旦C1跟队列说我已经处理完了,那么你再删除也不迟是吧,也不迟。所以呢,就是这就是一个所谓的消息应答机制,保证了消息的不丢失。
03:02
好,这就是消息应答,那么消息应答又分为两种,第一种叫自动应答。第二种叫手动用的。啊,完了,第一种自动应答,它呢并不完善,也就并不并不是很好,你看自动应答呢,就是这种模式需要在高吞吐量和数据传输安全方面。做的比较权衡。说的话很抽象啊,实际上的意思就是说一定要保证在很多大量消息被发送过来,并且还要保证数据传输安全。的省方面做出权衡,就例如消息既不能丢失,完了呢,吞吐量呢,还尽量大一点。那尽量吞吐量大的原因就是刚才图上画的,当有大量发消息的时候,那么这些消息需要及时的去处理。那么消息越多,处理的就越慢。
04:02
那么在处理慢的时候还不能出问题?还不能出问题,那么这种情况是很难权衡的。所以在没有对传输消息数量进行限制的时候,这种模式仅适合于消费者可以高效并且以某种速率能够处理这些消息的情况下使用。这话呢,说得很抽象,但是实际的意思就是自动应答,相对不是很靠谱。它呢,必须要有一个良好的环境,哎,不能发生那种极端的情况下才能用自动应答,因为自动应答就是那种,只要我接到消息,马上就跟队列说,哎,我已经。完成,实际上他完成了吗?他并没有完成,他的后续代码还有很多没有执行的,但是他是以什么为准呢?只要以接收到消息为准。但是同学们都知道,接收到消息不是目的。你接到消息。
05:04
那同时你看,当我们在这儿接收到消息的时候,有可能下面还有很多点点点啊,还有很多代码在后续代码当中,如果出问题了,那么你的消息。是不是也就相当于丢失了,因为你这个位置写的是一个自动应答,也就说在这个位置的时候就已经应答成功了,但是在后续代码当中出现了问题。所以呢,这种方式呢是不可取的,所以自动应答在企业上班时。尽量少使用对吧?能用手动应答最好用手应答,那么手动应答又分为哪些方向方法呢?智能这个就是手动应答的方答。你看。例如用于。这个你看信道调取AC,你看这个AC表示应答的意思啊,用于肯定确认。到接收到消息。
06:01
此时此刻,Robin m克已经知道消息被接收并且成功处理了,就可以将其丢弃了。哎,你当你执行这个方法时。用于肯定确认了,就表示消息已经肯定处理成功了。那么如果你调取这个方法,你看在上面方法上这里多了一个N。表示用于否定确认。否定确认就是就意思就是不确定,不确定的意思,这是确定,这是不确定。第三个还有一个叫拒绝。就是也是否定,确认就是不确定。只不过它俩的区别就是。上方的这个带N的是比下面这个拒绝要少了一个参数,少了一个什么参数呢?少了一个。是否批量处理的参数。什么叫批量处理?我们后续再讲,你先记住。应答分为自动应答和手动应答,手动应答又分为三个方法。
07:05
三个方法当中,一个叫肯定确认,两个叫否定确认,而两个否定确认还相差一个参数。对,相差一个参数就是。这个叫批量处理参数。批量处理,那么这个批量是什么意思呢?我们接下来讲一讲手动应答的好处,就是可以批量应答,并且减少网络的一个阻塞。那么批量应答有什么意思呢?这呢在代码当中。当你进行应答时,后方第二个参数就是一个,问你是否是批量应答还是不批量,如果是true表示批量。如果是false,表示不批的。你看是批量用的和不批量用的,批量代表的是。你可以应答此信道上。关于56784个消息,如果四个消息都没有应答,你选择处表示你应答一次,四个消息全都被应答。
08:09
如果你选择false,那么只会应答当前这个消息第八个完了,这个文字说明呢,并呢并不好理解,我们呢,下方有一张图啊,这张图呢,可以充分的介绍。这个叫批量应答与不批量的区别。同学们都知道这个,心道,心道在哪个位置呢?在这个位置啊,我们切到我们的图里。这个就是信道,对吧,同学们知道这就是信道,当你通过信道哎,接收到消息的时候,这个信道里面可能只有一个消息,当然也可能有四个消息。也可能有很多消息,所以这个信道里面到底有多少个消息,取决于队列往信道里放了多少消息。当然了,这是队列的队列的情况啊,那么我们来看一下这张图,如果队列往信道里面放了四条数据,分别为5678,那么第八个明显会先被接收到,那么当前,你看当前。
09:12
消息是第八个,如果你批量用处的话,表示批量应答,这时候它会将第八个应答,第七个应答,第六个、第五个都应答,将此信道当中的所有的消息都会确认应答。这就是批量应答的一个好处。那么如果你批量应答,不进行批量,哎,使用的是副对使用的是false,那么这个时候只会应答。当前的这个消息,也就当前消息是第八个,那么567就不应答了。但是我们写代码的时候呢,强烈建议呃改成true,改成false,改成false,这样呢只应答第八个,因为只有八处理完了才会应答,那么765,呃由于你也不确定到底处理成不成功,只是信道当中有567,这样呢批量应答呢,也会出现一些问题,就是一旦处理七或六的时候,如果处理一部分代码。
10:12
就失败了,那么这时候就会造成567有可能呃也会消息丢失,所以呢,在写代码的时候呢,强烈建议呃批量处理,不要批量false,对,只应答当前的已经成功处理完的消息,至于还没有处理完的消息,尽量不要应答,虽然说都应答速度会快,减少网络的压力,但是呢,呃确实会造成消息丢失的可能。只能是可能啊,可能消息丢失。所以强烈建议,呃。不批量的。这就是我们关于消息应答的相关解释和介绍。
我来说两句