00:00
好,接下来呢,我们学习第二章spring与消息,这一章我们主要讨论spring BOO与消息队列的整合使用,包括呢,我们会介绍消息服务的两个常见规范啊,G Ms Java消息服务和我们这个AMM高级消息队列协议,而且呢,我们也会整合使用rabbit MQ来进行测试。其实呢,我们说在我们大多的应用中,我们都可以通过引入这些消息服务中间件来提升我们系统的异步通信能力以及扩展结构能力。说为什么会有这些消息服务中间件,比如我举上几个场景的例子,第一个呢,是我们这个异步处理,哎,我们以某个用户注册为例,用户呢,注册成功以后,我们将他的注册信息写进数据库,同时呢,我还想给他发一封邮件,并且呢发一封短信,如果是以前我们的方式,那进行同步调用,写完数据。
01:00
据库来调发邮件方法,再调发短信方法,每个方法50毫秒,那么我们合起来在150毫秒以后,我们来响应用户,这样呢是很慢的,因为发注册邮件跟发短信不是说下一毫秒立马就要做完,用户立马就要看效果的,你可以慢慢来处理,那我们可以你呢用第二种模式,有的同学我想到第二种模式怎么办呢?哎,当我用户呢,把注册信息我写进数据库,花了50毫秒以后,那接下来呢,我用,哎多线程的方式,比如我来并发执行两个操作,第一个操作呢,是啊,发送注册邮件,第二个呢发短信,两个呢,每个50毫秒,由于是并发,相当于只花了一个最长的时间,那合起来响应100毫秒,这样呢其实还是太慢,我们此时呢,就可以引入一个东西叫消息队列,这样呢,我们用户将注册好的信息写进数据库以后,它只需要呢,将相关我们后来要用的。
02:00
信息很快的写进消息队列里边,写进消息队列呢,需要几档的时间,比如五毫秒,那么只要他写进消息队列,立马返回用户,相当于在55毫秒就收到了响应,注册成功。而接下来呢,我们发送邮件以及发送短信这些服务呢,他们都可以通过异步读取的方式,自己来从消息队列里边取出刚才的这个用户信息,给用户来发邮件,发短信,这就行了,这是我们第一个场景来进行异步处理,来提升我们这个异步通信能力。第二个呢,是我们这个应用结耦,比如有我们这个订单系统跟库存系统,如果我们写在一个应用里边耦合起来,我来下一个单,下完单以后呢,我们要减库存啊,我们下完单我们就来调库存的这些方法,那么这样我们耦合起来也是很麻烦的,包括就跟我们刚才说的一样,也是挺慢的,那接下来呢,我可以怎么做呢?哎,我们把定。
03:00
单系统单独抽取出来,库存系统呢也单独抽取出来,我们可以用微服务的方式来抽取一个服务,那只要我们下单了,我们将下单的信息我们写进我们消息队列里边,那么库存系统呢,通过订阅消息队列里边的这些呃内容,只要消息队列里边有一个订单内容,库存系统呢立马就会收到这个订单的信息,然后库存系统在这儿计算库存相关的操作,好这就是呢,我们这个应用结耦,我们通过引入消息队列来传递传输数据来截耦两个应用,那么包括我们还可以有一个场景叫流量消峰,特别是用于我们秒杀,比如呢,我们有10万个人,我们这个商品呢,只有1万个,10万个人要同时来秒杀,如果每一个人请求都发过来,我们来淘开来处理,我们来判断库存有没有,这是不是啊,很麻烦,而且肯。
04:00
In class,那怎么做呢?我们用户的秒杀请求进来,秒杀请求呢,直接进消息队列里边,我给消息队列我可以来一个定成,我来上1万个,他只能呢存储1万个数据,那怎么办呢?10万个用户啊,谁快谁先进对,那么进对以后呢,后是后边9万个,只要进不了队列,立马抛弃请求给他响应秒杀失败,那么相当于他就抢占了一个座位,哎,很快的抢占到座位,那接下来呢,只要他抢占到座位了,消息队列里边有内容了,我们秒杀的这业务逻辑,慢慢的再从消息队列里边取出这些数据,将我们这些秒杀的信息,哎转化过来,这就是哎我们几个应用场景。通过那几个场景呢,我们来引入,我们为什么要使用这些消息服务中间件,包括我们这个消息队列,那么说起来呢,我们这个消息服务这里边呢,有两个重要的概念,一个呢叫消息代理,另外一个叫目的地,所谓的消息代理其实就是我们消息中间站的这个服务器,哎,我们要给消息队列里边存取内容,就要连啊,连接我们这个消息中间件的这些服务器,这个呢,我们称为这个消息代理我们。
05:18
我们这个消息发送者是将消息发送到我们这个消息代理,也就是发送到我们服务器,我们服务器呢,接管到消息以后,我们服务器要把这个消息发送到一个指定的目的地,哎,这就是我们要说的这个目的地,而目的地呢,可以有两种形式,第一种队列的形式,可以进行点对点通信和主题来进行发布订阅,这两种通信机制呢,我们来了解一下。我们说的这个点对点式其实指的呢,就是我们这个消息发送者,比如我们这个A把某一个消息呢,我来发送在放到一个队列里边,我们这个消息接收者呢,B可以从队列里边来取出这个消息,而且呢,消息一旦被取出以后,哎,我们这个消息队列里边的消息就会被移除,但是我们说消息啊,它只有一个唯一的发送者和接受者,但不是说只能有一个接收者,大家注意啊,接受者接收者,也就是说我们BCD可以同时都来收咱们这个消息队列里边的内容,但是我们说只要某一个人,比如B已经把这个数据拿到了,那C就不可能再来拿到了,也就说我们这个消息一旦被我们称为消费,那就会被删除,这是我们点对点式那。
06:48
啊,还有一种叫发布订阅式,发布订阅时呢,指的就是哎,我们消息呢发布者,比如A,他把消息呢发布到一个主题,哎,我们成为主题里边,哎,Topic,那我们多个接收者BCD,哎我们同时呢可以来订阅我们这个主题,也就是监听,哎我们可以监听这个里边的消息,只要这个消息一到达BCD同时呢都能收到消息,这叫发布订阅,而以前这个点对点是只有一个能收到这个消息。好,这是我们说的两个消息通信机制,接下来呢,我们再来说我们两个常见的消息服务的规范,第一个呢,我们叫gms Java消息服务,这是我们g two e给我们制定的基于JVM的消息代理规范,而大家听过的这个MQ就是机买MS。
07:48
此规范的一个实现,而另外一个消息代理规范呢,就是我们叫AMQP,它叫高级消息队列协议,它呢能兼容GMS,而大家听过的这个rabbit MQ,它就是我们这个高级消息队列协议的一个实现。那么这两个有什么不同呢?都是相当于消息代理的规范。
08:13
我们在这呢做一个简单的对比,首先呢,GMS这是我们Java规定的API,而AMQP呢,它是啊,我们这个网络级的一个协议,所以说呢,论跨语言和跨平台,那我们Java规定呢,自然只能用Java语言和我们Java平台,而我们AMQP系列的产品,它是跨语言跨平台的,而GMS规范呢,只提供了我们两种消息模型,就是我们前面呢说的第一种点对点消息模型和第二种发布订阅模型,而我们高级消息队列协议,它提供了五种消息模型,后来我们呃,在用rabbit MQ的时候呢,我们会来进行测试,那么这五种呢,其实第一种就是我们说的点对点,而后边这四种呢,都是我们发布订阅基本功,发布订阅差不多,只是呢它更细致,那么对于GMS来说。
09:13
能发送的消息啊,我们这有这么多的类型,而我们AMQ相关系列的产品,由于它是跨平台的,所以说你发的什么消息都是将消息序列化后再发送,相当都是一些字节数据,那么综合起来,我们这个GMS首先呢,它不是跨平台的,但是呢,如果我们都是Java应用,我们用面向GMS规范编程,那么我们无论用哪个GMS产品的实现,我们都不需要改代码,这是比较啊友好的,而我们am pop呢,它是跨平台的,所以说呢,这个在后来用的还是比较多的,但是呢来说你后来呢,不管选型使用GMS还是用AMQP,那spring呢,底层都是支持的,Spring底层呢由spring g Ms模块,它提供了对我们GMS相关系列产品的操作支持,包括呢由spring rabbit模块提供。
10:13
提供了对AMQP相关产品,特别是MQ的操作支持,那如果有了BOO,我们要用相应的场景,那就更简单了,你来到Bo里边,比如呢,你要操作GMS的,诶,这有GMS的两个操作产品,比如你用MQ的,还有这个的,你都可以导入相关的依赖,比如我们后来要测rabbit MQ的,那都可以在这儿导入相关的场景,我们来启动支持。当然有了他们以后呢,Spring在底层为我们提供了g Ms complete和complete来发送消息,那么如果我们想要接收来自消息代理给我们发布的这些消息,那么我们可以用两个什么提供的简化注解,如果是GMS的情况下,你可用g Ms listen来监听消息,如果是AMQP,也就是用rabbit MQ的情况下,你可以用listen来监听和接收消息包。
11:13
后呢,我们需要用这两个注解来开启相关的功能,支持GMS的情况下用它,而AMQP用rabbit MQ的情况下用它。这个呢,我后来进行测试,包括我们用了spring g Ms场景和rabbit MQ场景都是有相关的自动配置的,就是说我们只需要简单最少量的情况下,我配置一个我们消息代理的服务器地址就行了。
我来说两句