00:00
好,同学们,我们走哈,注意。上一讲大概也给大家介绍了什么叫MQ的一步投递,然后呢,注意。这道题目它有这么一些问题啊,你说那杨哥看官网的话,这不废话吗?要么就是拖那个URLTCP的这个链接串里面以后拖参数啊,要么就是用connection factory用设置一不投递开启为错,要么就是connection设置一不投递开始为处,那么上一讲杨哥呢,就以这个对象作为举例,然后点SAT1不投地处OK,好老简单了,杨哥这有什么好讲的,不厉害吗?大哥,真这么简单,我不会选这道题目,看着。第一个这道题目是个连环扣这种题目啊,就是什么呢?70万某大场面试官问的明确的说了,而且不少上回谷的老学长栽在这道题上面,因为他被连环夺命扣的第二份问道。
01:00
首先同学们,我们要明白啊。发的快,处理的慢,我不想让发了,这个在这儿等着,但是注意。什么情况啊,如果你没有使用事物,且发送的是持久化的消息,那么每一次发送都会默认的,会变成同步,就会阻塞这个生产者,直到broker返回一个确认,那假设这种情况下你开了,但是我就这,诶你收到没,我这会有个等着,那么这个时候这个等这种情况下干嘛?他不能确保有效的消息什么发送成功,他这儿还有第二个坑爹的情况,那么。我明明不想让你等,而且你还不能够这种异步投递能保证消息发送的投递呢,确保成高,所以说他反过来问你,那么异步发送如何确保或者确认发送成功了呢?所以说什么是一步发送,异步发送用了干嘛允许在失败的情况下有少量的数据丢失,那你现在告诉我是哪一条数据丢失了,我允许你,那么现在我你给我100条里面有两条卦,98条成功,你能不能把那两条给我找出来。
02:09
那么所以说这个时候他就会追加你问一道最阴险的一道题目,异步发送,如何确保发送成功,那你要说编码,刚才咱们编了是不是set个处啊,是不是就搞定啊,不好意思啊,兄弟们这有道道过来。异步发送丢失的消息的场景是当我们设置生产者这个为处了,那么刚才杨哥演示过了,这拿这个api.set use,异步send等于搞定。那么在使用这个时候,Send的消息什么概念,我们下面是不是用send发送,我们一直是不是都用这个,那么这个时候请看,由于消息由于你是异步发送,就是不阻塞干嘛发的快嘛,一丢我就不管。第一个消息可能会丢失,第二个积压严重,那么干嘛生产者会理所应当的认为所有应该胜得的消息均被成功发送到MQ。
03:04
但是如果MQ突然挂了。此时生产者。端的内存尚未。被发送到MQ的消息就会丢失,所以说正确的异步发送是需要什么接收回调的,你需要自写什么回调方法,坑爹的是官网上他根本就没有告诉你,他讲完了以后他就告诉你啊简单,那么这个就请你开启这个性能就会好,然后呢,你把它设置错就完了,但是我就觉得我靠这个有什么好讲的,结果后来呢,深入的研究了以后,发现我们在这要看到。同步发售。等send不阻塞了,才表示一定发送成功了,异步发送需要回收。一个回调来判断是否发送成功,听懂了吗?如果是散,那么我就是一个什么可以会阻塞,呃,那个这位同学,你收到杨哥的短信了吗?杨哥我收到了,OK,那么这个时候一定是不阻塞了,他表示一定发送成功,这位同学你收到了吗?你不回我。
04:10
我一直在这堵塞,那么这种情况下我就不知道了,所以说异步发送可以用,但是它需要有一个回执,那么下面我们来看这么一个函数的编写,那么这节约时间么?杨哥,首先这是一个普通的发送,没问题吧,我拷贝了一份,那么放到这儿,那么来吧,跟刚才这个一模一样啊,同学们那么看着以前我们这也是非事物的,那么假设啊。我们这儿这个produce,我们也要给它进行发送,那么这个时候请看以前呢,我们就这么干。点2SET use,那么干嘛一步发送错,那么请看我们这的要求是什么?如果宕机了,生产端内存中尚未被发送到MQ的消息都会丢失啊,所以正确的异步发送方式是需要接收回调的。那么言下之,支线同学们这儿就变化了。
05:09
设置这么一个错,只不过是开启异步发送,让生产者发的更快,那么生产者发的更快,这是第一步啊,第二步要允许你有少量的消息发送失败,因为你求快,萝卜快了不洗泥质量就会下降,第二个需要有一个回调明白那么怎么产生回调呢?在这儿第二步这些代码都一样了啊,我就不多废话,那么第二步对于这个。生产者,我们以前叫message producer,那么还记不记得都叫这个,不好意思啊,现在我们要更加细力度,用active MQ message producer听懂,然后干什么呢?在这块了以后强制类型转换,然后接下来我们的对象,首先第二步对象已经变了啊,消息投递者是叫active MQ,哎,干脆这样吧。
06:00
把干掉FMQ,让他跟以前的不一样哈,那么这个呢,跟以前反正就是一个什么消息的投送者,那么以前产生了一个消息,好吧,字符串的message,然后send换说以前这个send我们呢,就一直认为它干嘛那边反馈收到了,然后呢,它结束之后我们关闭资源,但是现在用这个S的方法不行了。为啥根据我们的要求需要接收回调,所以说我们,而且我们用的什么消息的生产者也不再是以前那个message producer,是active MQ message producer更降一级,更加细腻度化的听懂,那么这个时候干嘛?也就是有点类似于说什么以前我们是不是用它的,可以说是一个更高级别的那个,那么现在我们用这个哈,那么这个算的方法去掉干嘛?接下来我们呢?这个message是我要发送的消息,然后呢,我们呢,切记我们以前讲消息头的时候,我们要干嘛确保是哪一条消息。
07:10
发送失败,哪些消息发送成功,那么最好是不是在这个消息上面加属性,还记不记得这个GS啊,干嘛message。ID啊,那么所以说我们这儿又有ID,这是我们假设我们自己编的哈,那么干嘛to string,那么这。我们针对于某个业务,比方说order业务。然后。At归国,那么这个时候我们加这么一个后缀位,听懂了吗?就代表我们的这个消息有我们自己的标识啊,然后因为message点。message.set GS messaged就是正对针对于我每一个发送的消息,这是一个消息内容,然后呢,就是消息的正门,但是我们每一个消息头,我们包了个ID,就是这个,那么以后我们拿这个,如果这么一条ID被签收了,就证明这条消息发送OK,否则没有这条,那么说明发送失败,那么这是第一个,第二个呢,我们来看。
08:12
设置了以后,我们string马上获得message ID,那么干什么呢?message.get GS消息ID,好吧,设一个我得一个,那么这个是不是就是我们自己生成的这这么一个东东,好了,那么生成完了以后干什么呢?接下来兄弟们变了啊,Active MQ message,诶,就是这个。听懂,那么producer点算的请看。第一个这个消息要发,第二个是不是有个异步的扩back回调函数啊,那么所以说我们这选这个方法,那么消息就是我们这个message,那么第二个参数就是尿这么一个来兄弟们请看他要成功了以后怎么样,失败了以后怎么样,那么这个时候是不是要符合我们的要求,正确的一步发送是需要接收回调的,听懂了吗?那么这个时候就是MQ会来调你这一个方法,告诉你是这条消息哪一条就是你加了标识的这一条,订单模块的艾特硅谷,这是成功,那么就走这个,失败那么就走这个,那么最终我们就看。
09:20
这个编号全部都在失失败的,那么就是全失败,全部都在成功的,就是在全成功,我们部分成功部分失败,到时候我们是不是按照message的ID,我们这个序列编号去收拾数据就OK呀,那么接下来那么再来看我们干什么呢?我们是不是out,然后呢,Message ID知道我上面为什么定义这个了吧,那么到这个模块如果打出来,那么。干什么呢,这个呢,就是孩子的。表示B干嘛?Success,或者还是B,就简单一点吧,OK。算的。好吧,那么接下来,接下来如果是异常呢?那么同学们,那么这个时候过了。
10:03
那么这个时候就是message ID fair。失败,那么这个时候每一个哪些失败哪些干嘛。成功了。我们呢,就一目了然,那么都有每一个消息都有一条编号,那么下面的就是什么关闭资源,那么发送消息,那么好,言下之意就是什么,如果你要用这个,你要知道为什么要用第二个,它可能会导致部分消息丢失,而且如果成功调用,最好写一个回调函数,好,那么同学们,我们下面一跑,那么这个时候如果一切顺利,我们就会看到这个ID,就是我们编写UID,结合我们的一个order硅谷,你看还是变sent OK,那么沿下支线。三一条肯定都不会一样,又有ID,那么我们这是不是内部记了编号啊,那么这个时候看一下我们的这个队列,那么这个时候大家看一眼我们这个队列每一条消息,对吧?那么比方说我们浏览一下,那么这个就是我们的什么东东,Message ID,这是它内部产生的,那么这个时候我们自己还看了一个我们自己后台的一个UUID的一个标识啊,那么我们就拿这一段。
11:17
不会重复的标识来进行消息的确认,OK,那么所以说这个时候干嘛异步发送需要接收回调,并由客户端再判断一次啊,是否发送成功。那么言下之际,如果到走这。干嘛打出这句话?是成功,如果有这个异常了,我们能丢得到这个异常信息了,听到,那么假设到异常了,这有异常丢出来,我们就说明发送失败,那么对应的这个设置的这条消息,那么可能你需要人工干预进行重发,好,那么这个就是异步发送,如何确保发送成功,以及对应的回调。
我来说两句