00:00
接下来我们来说一下消息中间件的一些常用概念,首先我们来说,在我们这个分布式系统中,我们通过引入消息服务中间件,可以提升我们系统的异步能力以及扩展结构能力,就像我们之前说的这些场景一样,那在我们这个消息服务,也就是我们消息中间件中有两个比较重要的概念,我们先来理解一下,首先第一个呢,叫消息代理,消息代理顾名思义,我们这个代理呢,就是代我们来做一件事情,那就带我们来发送接收消息的人,那这就称为消息代理,那消息代理呢,其实这么来理解,那就是安装了我们消息中间这样的服务器,我发消息呢也给他发,然后呢,我们想要接收消息,我们也得连上他来拿消息,所以呢,我们把这个就称为消息代理,还有一个呢,叫我们的目的地。整个目的地呢,就是我们消息将要发给哪儿,那它的流程就应该是我们一个消息的发送者,诶我们有一个人想要发送消息,我们也可以把它叫消息生产者,也可以叫消息发送者,这发送者呢,会将我们这一个消息message,然后呢把它先发给我们的消息代理,也就是说安装了我们消息中间件的服务器,发给消息代理以后呢,我们消息代理会将我们这个消息发给我们指定的目的地,而在我们这个消息中间,这中我们有两种形式的目的地,这个两种形式目的地一个叫队列,一个叫主题,队列呢就是我们说的点对点通信,主题是发布订阅,那这两个是什么?我们可以来详细说一下,首先来说我们这个点对点,也就是队列,我们这个一个消息,好,我们消息的发送者,他先呢准备了一个消息,消息呢先得发给我们的消息代理,Message broker,我们这个消息代理收到。
01:52
到以后,然后他把这个消息,如果我们这个发送者说把它要发给一个队列,那这个消息呢,就会存到一个队列里边,队列呢都是先进先出,我们消息先进来,那就会先取到,哎,我们这个消息1234进来,进来以后呢,我们别人想要获取这里边的消息怎么办?别人呢就可以监听我们这个队列里边的消息内容,而我们这个一旦队列里边有消息,我们这个人呢,就可以拿到我们这个消息,而且这一块呢,有一个细节点,就是我们这个队列,它可以允许我们很多人同时来监听这个队列,就是我们说的这个消息呢,有唯一的发送者和接受者,比如说谁发送消息,这是肯定的,谁最终拿到消息,这也是肯定的,但并不是说只能有一个接收者,接收者意思就是呢,我们可以很多人都去来接收这个队列里边的消息。但如果是队列方式,我们称。
02:52
会点对点方式,那消息一抵他队列以后,最终只会交给一个人,谁先抢到了,那谁拿到,这是我们说的点对点模式,而且呢,消息一旦被别人获取到以后,就会从队列中移除,那队列里面就没有这个消息了,所以呢,这是我们说的消息队列,我们的第一个目的地队列,也就是我们点对点式通信,当然我们的消息呢,还可以发给我们的上边的这个称为叫主题,主题就是我们说的发布订阅模式,这是什么呢?我们首先一个消息的发送者,然后呢,他准备了一个消息,先发给我们的消息中间件,这个服务器消息代理,那消息代理如果他发的这个消息,他说要发给一个主题,那消息代理呢,就会交给我们这一个主题,但这个主题呢,可以有多个人同时来监听,跟队列一样,都可以有多个人同时来监听,但如果是一个队列,如果是一个Q。
03:52
如果是队列,多个人监听,只有一个人能收到消息,但如果是一个主题,主题呢是我们说的发布订阅,我们只要所有订阅了这个主题的人,消息一到达,大家都能收到,就像大家订了报一样,只要新报纸到达,我们所有订报的人都可以收到。所以呢,这就是我们说的发布订阅模式,所有的消息中间件,只要它是消息中间件,它一定会有这两种模式,而且呢,对于我们这个消息中间件,我们有非常多的规范和协议,比如我们非常常用的一个叫GMS,我们称为叫Java消息服务,这个Java消息服务呢,其实是我们这个上公司制定的一些标准,制定呢,我们这个GVM的消息代理规范,我们的一些市面上的MQ产品,比如MQMQ等等,他们呢,就是GMS的一个实现,还有我们的一种消息队列协议,叫AMQP,叫高级消息。
04:52
列协议,这个高级消息队列协议呢,它可以兼容我们这个GMS,而我们这个rabbit MQ呢,它就是一个高级消息队列协议的实现,但是呢,在我们这个分布式开发里边,那到底是要用我们GMS规范的这些产品的实现,还是用AMQP产品的实现,那么就可以来做一个简单的对比,首先GMS我们全称叫Java message service叫Java消息服务,它是我们这个Java定义的规范,那理所应当它只是适用于我们整个Java平台,用了它的好处就是说,如果我们使用GMS相关的产品,我们无论我们这个产品怎么切换,只要你都是遵循GMS规范,我们这个Java平台呢,编码只需要一次编码,我们无论产品怎么切换,我们无需修改API,这类似于什么呢?就类似于我们用的JDBC一样。大家会发现我们数据库已。
05:52
引录的去驱动MYSQL版本从五到六到七到八,我们引了非常多,但是我们接BBC的这些代码我们从来没变过,要说因为我它是制定好的一些规范APIAPI都已经制定好了,所以我们只需要用它的面向接口编程,实现呢,我们到时候只需要导入各自的实现就行了,所以我们用它,它的最大好处就是在我们这个Java平台下无缝兼容,而我们这个跨语言嘛,不跨,因为我们这个是Java平台制定的规范,跨平台嘛,我们只兼容整个Java平台,其实我们说这个Java呢,它是跨平台的,我们Linux Windows这些都能用,那听起来它应该是跨平台的,实际上呢,我们说的这个跨平台就是是否能兼容我们这个Java平台,兼容其他的PHP平台等等各种,而我们这个Q就不一样了,我们amq呢,它是一个协议,就跟HTTP一样,它叫超文本传输协议。
06:52
协议,只要遵循了这个协议的人我们都可以用,所以呢,他也是一个网络县级协议,也就是一个我们底层一些制定的协议,跟HTV一样,所以呢,它是一个完全的跨语言,跨平台,无论是C语言,C加加go各种语言,只要呢遵循了这种协议去来实现,我们都可以包括跨平台,跟HTV一样,任何平台我们都可以用这些协议,而我们这个GMS它呢,提供了两种消息模型,比如我们之前说的点对点p two p模型和发布订阅p two p呢,那这不就是我们的队列模型Q,还有我们的这个主题模型topic,而我们高级消息队列协议呢,提供了五种消息模型,虽然五种消息模型非常多,当然呢,第一种其实呢就是对于我们队列的实现,后四种呢,其实就是我们发布订阅的一些变形实现,所以呢,其实也都是遵循了两种实现,一个订阅。
07:52
的模式,就是我们发布订阅主题模式,还有一个队列模式,Q,我们的这个点对点通信,那基于这两种呢,可能两个都差不多,当然我们后边的这些我们详细再来解释。而我们这个消息支持的各种类型,我们这个GMS规范,因为在Java平台,我们Java的这个对象类型非常多,所以它支持非常多种我们类型的消息,比如纯文本的消息,Map的字节数据的流的,包括我们任何对象的,包括只有我们这个消息头和属性的这个。
08:26
简单消息,所以呢,我们这个GMS规范支持非常多种消息,但是AMMQP呢,它只支持一种叫bit,其实呢,我们说网络间传输,万物皆流,你能支持流了,那就是我们什么都能支持,如果我们有一个对象想要传出去,那它只支持流怎么办?我们把它序列化成我们这个杰森,杰森呢就是一个字符串,把字符串呢,以流的数据把字节的方式传出去,这不就是万物皆支持吗?然后接下来整个综合评价。就是如果我们整个平台的建设全部都是Java,我们没有掺杂任何一种其他的新语言,当然我们不不算这些前端,前端是我们前后分离的结果,那么我们可以首选GMS,因为有了它我们无需修改任何API,只需要用人家原生的API,无论产品如何切换,比如我们说的active MQ就是GMS的实现,MQ我们再怎么升级,我们都不需要修改我们的任何账号代码。而如果我们平台会有多语言,比如我们订单系统是使用Java写的,而库存系统呢,我有可能还是引入的第三方的一个PHP,写到这些东西,他们之间呢,要互相交互,还要发消息,那么就可以引入我们整个跨平台的这些,我们就就是AMQP协议相关的实现。所以呢,我们这个rabbit MQ最终呢,它是一个QP协议的实现,而且呢,它也兼容我们。
09:59
GMS还支持其他的比如MQTT这些协议,但这协议呢,现在不是我们研究的重点,所以我们最终选择来使用active MQ,而且active MQ呢,所以我们最终选择使用rabbit MQ,而且这个rabbit MQ呢,它最大的好处就是它的设计非常的标准化,但是呢,带来的问题就是它的设计里边有一些非常复杂多的概念,只要我们学通了rabbit MQ这个相当于一个比较复杂的消息队列,消息中间件,那学其他的消息中间件那就非常简单了,因为其他的消息中间件里边根本都没有它这么多复杂概念,这是第一个我们选rabbit MQ的原因。第二个rabbit MQ在现在的大互联网公司也用的非常多,所以我们选用它也可以让大家无缝对接到自己的业务里边,当然市面上的消息中间件产品有非常多,那我们学完。
10:59
MQ以后,我们知道了大概的这些使用方法以后,我们再对市面上的所有产品来再做一个详细的对比,回过头再来考虑一下我们为什么选择了re MQ,但是呢,我们无论是选择active MQ re MQ或者其他MQ产品,我们要最终要整合我们的代码,我们spring呢,会支持非常多的MQ的整合,首先spring的GMS模块就提供了对我们Java消息服务的这实现的各种整合支持,而且呢,Spring rabbit也提供了对我们AMQP,特别是rabbit MQ的支持,而且大家注意这个rabbit MQ,包括我们现在用的spring全系列框架,以及大家用的V虚拟机,这其实都是一个公司的整个系列产品,所以呢,理所应当,我们spring也是对他们这一系列支持度还是非常好的,那对于我们整合来说,我们无论使用哪个。
11:59
息对列,也就是说消息中间件,那我们最终呢,都要连上他们,那我们spring呢,都是需要让我们创建这些连接工厂来连上我们的消息中间件。
12:10
但是有了spring boot,肯定这些都是自动配置的,我们不用考虑,而且呢,也整合了我们的gms templatet和ret templatet,相当它抽取了两个templatet,大家的这些叉叉叉templatet大家其实用的已经非常多了,我们spring家如果发这些get post delete这些请求,那它可以有一个rest complete,他抽取了一个这个,而且呢,我们以前给他讲解过JDBBC的一个小工具jdbc tempt,它来帮我们执行circle,进行增删改查,还有我们各种的tempt rabbit tempt gms tempt,包括我们连mongo DB数据库,还有mongo templatet以及elas search,它也抽取了elastic templatet等等一大堆。所以呢,Spring这就是它的一个设计模式,整合第三方,它一般呢都会抽取一个什么什么templatet来操作我们这些第三方相关的API功能,而且呢,SP为了简化我们整个消息队列的开发和使用,它呢抽取了我们这常用的两个注解,一个叫g Ms listener,一个叫rabbit listener gms listen呢一听这就是来监听我们GMS这些消息中间加的这些消息的,它是一个用来监听消息的,然后呢还有我们监听rabbit MQ里边消息的,所以呢,我们可以有了spring,只需要两个注解就直接可以拿到我们消息中间键里边的消息,非常简单,当然要使用它们,无论是使用GMS还是rabbit MQ,我们都per都提供了这两个注解的支持,一个是enable gms,一个是aable rabbit,只要我们标了这两个注解,我们就能快速的开启它们的功能,而且只要开启了他们的功能加就会。
14:00
对它做好自动配置,自动配置呢主要有这两个,一个是gms auto configuration,我们一听那就是它是来自动配置我们这些Java消息服务规范的GMS,还有一个我们如果整合了rabbit MQ,还有我们的rabbit auto configuration这一块呢,都有相关的自动配置,一句话,无论用哪个消息中间键,其实要跟spring boot整合起来都非常简单,STEM boot已经原生支持了GMS和它支持了我们的rabbit MQ,要整合其他的消息中间件,肯定也有相应的相关的场景启动器start,我们只需要来引入支持就行了。当然市面上MQ的产品非常多,Active MQ MQ rocket MQ、卡夫卡、zero zero MQ等等等等一大堆,我们后来呢,再对他们来做一个详细的对比,那这一块呢,主要希望大家来理解我们这个消息中间件,我们消息服务里边。
15:00
跟的两大规范,常用的两大规范,一个呢是我们的g Ms Java消息服务,一个是我们的AMQP高级消息队列协议,那么RAMQ呢,就是对于amqp的一个实现,同时它也兼容GMS,所以我们最终使用re MQ。来作为我们后来分布式系统里面的消息中间项。
我来说两句