00:00
各位同学大家好,我是上硅谷Java医学科讲师孟庆祥,接下来呢,我给大家分享一道面试题,面试题的题目是消息队列在项目中的使用,首先呢,我们先来聊一聊消息队列产生的一个背景。在面试的过程之中呢,很多同学都会被问到。什么呢?在分布式系统中是如何处理高并发的?那么这个问题呢?其实就可以使用消息队列来。解决。那么在分布式系统中,高并发也是分布式系统的最大的一个特点,那么消息队列产生的原因就在于高并发。由于在高并发的环境下。
01:01
啊,高并发的环境下。来不及同步处理用户发送的请求。则会导致。星球。发生什么呢?发生阻塞啊,发生阻塞,比如给大家举个例子啊,比如说在某一时间段内,同时。大量的。Us。大量的什么呢,音色的或者是up的之类的情景。Up之类的请求同时到达数据库,谁呢买circle的时候,那么这个时候呢,会直接。
02:02
导致。无数的。行所什么呢?表锁会出现行锁和表锁。甚至。啊,甚至。甚至。会。导致请求什么呢?堆积很多,导致请求堆积很多。从而。从而去触发我们的一个错误。什么错误呢?Two many connections。也就是说我数据库处理不了这么多的请求啊,处理不了这么多请求,那怎么办呢?所以这就是高频发在分布式项目中给我们带来的一个啊问题啊,那么我们怎么去解决呢?使用消息队列可以解决啊,可以解决,使用消息队列什么可以解决?
03:15
异步通信啊,使用消息队列中的异步通信可以解决,那么接下来我们来看看这个图。消息队列的一步,那么异步这块,下边这张图呢,有两个案例,一个是同步,一个是一步,我们先来看一下同步,同步是指当你这个业务在写入数据库的时候,要发送一个通知,发送短信通知给谁呢?给缓存,告诉这个缓存我数据库有变化了,那么同时让缓存也发生变化,所以整个过程之中都是串联在一起的啊,都是串联在一起的,那么时间呢?写数据库需要200毫秒,发送短信需要发送短信通知需要300,那么更新缓存呢需要100,那么总共它的时间需要600毫秒,这是同步,那么异步如何操作呢?
04:10
写数据库的同时并发送消息队列,并发送一个消息告诉缓存啊,我这个数据库啊,已经有数据变化了,你意味着要去更新缓存,但是但是。什么样的情况下算是我的业务成功呢?我只要发送消息队列就算成功了。来看一下这个图,那么写数据库并发送消息队列需要200毫秒,那么发送消息的时候呢,需要20毫秒,那么到这大家可以看一下,这有了分支,那么发送完消息队列之后。此时业务完成,那么总共时间需要220毫秒,那么相对于上边的同步。节省了很多时间,但是有人可能会在想,在问,那你的更新缓存到底是成功还是失败?
05:10
你不需要管吗?对,在这里我们不需要去。关注缓存到底是否更新,我只关心发送消息即可,所以这就是一个异步啊,这就是一个异步,那么它能够为我们节省很大的时间。那么发送完消息之后呢,那么我们会利用消息中间键去接收消息,接收消息干嘛呢?再去更新缓存啊,这个呢,我们在后续的硅谷的官网上都有详细的解释啊,大家如果有兴趣可以去我们官网去看一下消息队列的这个讲解,那么第二个消息队列还可以,还可以做什么呢?还可以做并行,那么同时有一个业务进来之后呢,我可以数据库并发送消息队列,我可以发送很多个消息啊,很多个消息队列发送很多通知,所以这个是一个什么并行,那么还有第三个什么呢?排队啊排队,来看一下排队。
06:17
什么在高并发的情况下啊,高并发的情况下,在很多人同时进行访问数据库中,那么这个时候怎么办呢?我消息队列啊,消息队列可以采用这种排队的方式,一个一个的进去处理,而不像刚刚我们上述所描述的同时进来,并没有做一个排队处理。如果你做了排队处理,数据库会就不会导致发生to many connection。啊,所以这个呢,是一个。排队处理啊,消息队列,那么在接下来我们去看一看我们消息队列,消息队列在。电商啊,在这呢,老师给举个例子,在电商中的一个使用场景。
07:06
来看下这个图。那么消息队列在电商中使用场景呢?什么情况下会使用呢?在支付付款的时候,我们买完东西之后向支付宝去。支付啊,支付的时候,支付宝呢,会有一个回调啊,会有个回调通知,回调通知给谁呢?给我们的。支付模块啊,给支付模块,那么支付模块呢,再去。得到。支付宝的结果发送给谁呢?发送给订单,发送给订单模块,那么这订单模块如果得到你支付宝相应的标志,支付成功的标志呢?它会发送给谁呢?库存模块,那么库存再根据你的订单成功啊,它对应的去减少库存,所以总共的步骤就是这五步,第一步要得到支付宝的一个回调通知,发送在支付模块,而支付模块。
08:14
要再发送通知给谁呢?给订单,那么订单得到你支付模块中的成功标志,成功标志之后。订单模块再去发送。消息给什么呢?给库存,那么库存在对当前的订单减库存,这是一个同步的操作,这是一个同步操作,而如果我们要使用消息队列,消息队列。怎么去使用呢?可以在这个地方发送完。成在这儿,支付完成之后,支付完成之后,我就可以直接通知让这个订,让这个订单系统通知谁呢?通知库存准备减库存而后续。
09:07
后续的操作我们不需要关注,不需要管,所以在这个地方,在这个地方可以达到一个异不解耦的操作,亦不结耦操作,这就是消息队列。的使用场景啊,这就是消息队列使用的场景,那么说到消息队列使用的场景,那么后续咱们还会有相应的问题消息。队列的弊端啊,消息队列有弊端,那么消息列队列的弊端是什么呢?就是。发送消息。就是消息的不。确定性啊,这就是消息队列的弊端,那么怎么去解决消息的不确定性?我们采用什么呢?延迟队列啊和轮询技术来解决。
10:08
该问题即可。那在这呢,我举一个简单的例子。比如说我订单模块,我已经发送了。消息给谁呢?给库存,那么具体你支付宝,支付宝到底支付成功还是支付失败,有可能我这个订单模块还没有收到,那怎么办呢?我可以做一个什么呢?延迟队列,延迟队列让订单模块去。主动的访问支付宝去查询一下。当前的订单支付是否成功?这就是消息队列,这就是消息队列。在项目中的应用。
11:00
好,那么在这里啊,消息队列可以有很多啊,在这里我们主要啊推荐。大家使用active MQ啊,推荐使用它,因为它呢。环境都是什么呢?阿帕奇的都是使用Java的,所以在这呢,推荐大家使用active MQ啊,当然了,这个具体使用哪一款消息队列还需要根据。当前的实际项目需求,比如说大数据,它就需要使用什么呢?卡夫卡。OK,那么这个消息队列在项目中如何使用,以及是如何产生的,在这儿就讲解完了。
我来说两句