00:00
同学们,我们本节课呢,讲一下发布确认的高级内容。什么叫发布确认的高级内容呢?就是我们。在实际企业当中,在生产情况下有一些不明原因。导致了一个rabbit MQ的一个重启。也就意味着这都牵扯到什么问题了,牵扯到MQ的服务器被重启了。那服务器是谁呢?就是他呀。对吧,就是他呀,是吧,这个服务器呢,正常情况下,我们之前在发消息和接收消息的时候,从来没有考虑过他,如果万一。宕机了,哎,不明原因啊,不知道什么原因重启了。那么这个时候就引发了一些什么问题呢?引发了这个叫生产者消息投递失败。导致消息丢失。需要手动处理和恢复。尤其是in q,如果它宕机了,那么它的重启一定是手动处理。
01:07
不可能是自动的。于是呢,我们开始考虑如何才能进行rapq消息可靠的投递呢?特别是在这种比较极端的情况下。即使有Ruby的集群也是不可用的。那我们后面会讲到集群啊,因为一台就这单台rap q肯定会出现问题,那么集群呢,这个出现问题的可能性呢不大,所以说情况比较极端。完了,这种极极端情况下无法投递消息,该如何处理呢?下方呢是一张是一个一段代码是吧,一段抛异常的代码。这个异常为什么叫监听器是吧?Rabbit MQ监听器阻塞队列。消费者异常在第。
02:02
620行代码是吧,抛出这种异常呢,这个问题你看产生的原因是。队列不能够接收到的这么一个立场。也就是意味着这个队列呢不存在,或者是这个不存在,那么这些报错呢,都指向了Q已经。宕机了,对,服务器已经宕机了。那么宕机的主要的过程,来我们看一下它宕机的原因是按照这个图来说。是这样的。首先呢,你作为生产者发消息。这边呢,势必会有一个消费者C啊,消费者消费消息,但是呢,生产者发消息,将消息发给交换机的时候。这个交换机跟。咱们后面的队列,它们之间是什么呢?这儿呢?
03:00
他们之间这呢啊这呢啊,这是消费者是吧?哎,生产者消费者他们两个是在MQ对在服务器上。那么如果这个位置宕机了,就相当于交换机没了,队列也没了。那交换机没了,队列没了,那自然发送的消息自然也就丢失了。对吧,丢失了,那么丢失之后呢,你看。丢失之后怎么办呢?丢失之后生产者的消息是真没了吗?是真的没了,因为没有任何的,呃,保存的措施就是一旦发给交换机,发现交换机不存在消息丢失。当然也有可能交换机怎么呢?交换机存在,注意啊,第二种情况也可能交换机是存在的,但是队列不存在。那么一旦交换机存在,你看,当交换机收到消息,从缓存中清除已收到的消息完了呢?怎么队列不存在了?那么它是不是也会将消息丢弃呢?
04:03
也会丢弃。所以,不管怎么分析,就是交换,你在也好,不在也好,或者队列在也好,不在也好,只要他们两个有一个不在了,那么消息势必就会丢失。对吧?完了,他说,如果你真的是交换机在,但是队列不在,你交换机中的消息是不是可以存放到缓存当中,就例如交换机如果收到消息了,但是队列收不到。你是不是应该把它存放到缓存当中。是的,那如果再来说交换机也也收不到对吧,生产者发消息交换机收不到,队列也收不到,这两项他都收不到,那么你是不是应该也将消息怎么的临时到放到缓存当中,采用定时任务对未成功发送的消息进行重新投递,但是现在出现什么问题?
05:01
不是你想放到缓存就放到缓存的,是因为一旦发完消息了,作为生产者根本就不知道没有交换机。也没有队列。所以导致消息发过去之后。就如同石沉大海一样。再也没有婚姻了,所以也没有下面这个箭头,对,也没有这个缓存没有注意没有。所以呢,我们的确认机制方案到底想干什么呢?想干的就是如果真的发生这种情况。应不应该有个缓存呢?应该有缓存。应该有个缓存,临时存储一下,完了呢,用定时任务对未发未成功发送的消息进行重新投递,对。但是这个机制你要是不加,现在是发完消息根本就没有了。对,因为交换机没有了。对吧,咱们之前。
06:01
之前的课程当中一直都没有考虑这个问题。对,没有考虑什么问题,没有考虑这个叫发布确认高级内容。对,什么高级内容?就是生产者发消息给交换机,如果交换机收不到,你应该想办法把它放到缓存当中重新发。所以我们本节课要解决什么问题?要解决的。正是。生产者发消息给交换机或者是队列,当然整体是一个MQ啊,就可以理解为发消息给MQ收不到。我们怎么要进行?确认机子处理。那么代码的方案在这呢?代码的方案是这么的,我们打算这么写代码。用生产者。发消息给交换机,哎,交换机的名字叫这名啊,是一个类型为直接类型的,母对直接类型的交换机。
07:03
那么一旦交换机。对,一旦交换机接收不到消息,我们要对这个交换机。接收不到的消息进行呃,缓存方式的处理。好吧,哎,就是按照这个图走。那么如果你正常发消息没问题,应该先先走到交换机,再通过K1走到队列完再走给消费者,诶,这是一个正常没有任何问题的一个过程,但是就怕有问题。有问的地方,地方有几处呢?有两处。其中一处是交换机,另外一处是队列,我们得一个一个解决啊,先解决交换机,如果收不到消息,我们应该怎么处理?
我来说两句