00:00
接下来呢,我们先来学习一下在re MQ使用过程中的一些复杂概念,那只有掌握了re MQ里边的这些概念,我们学习了,其他任何MQ产品都会变得非常简单,而它的这些概念呢,都一些比较复杂,我们就来画一个图来表示,首先我们要发送消息,我们就得有一个消息的生产者,也就是我们的发送者,我们称为publisher,好,把这个生产者先画过来,现在呢,我们有一个人准备要发送一个消息给我们的这个中间件,好,那这个呢,我们就把它称为publisher,这个是我们的消息的生产者。那么这个生产者呢,他负责产生一个消息,他将我们要发出去的数据来产生出来,假设呢,我们在这儿呢,又准备了一个消息来插入一个消息,好,这个呢,就是我们将要发出去的message,我们称为消息,而且消息呢,我们由很多部分组成,那么这个消息呢,是由消息头和消息体,消息是不具名的,也就是消息是没有名字的,它由头和体组成,类似于我们HTBP里边的消息头、消息体一样,消息体是不透明的,所谓的不透明就是我们可以看得见的,自己需要定义的这些东西。消息头呢是有一些属性,这些属性呢,就类似于我们HTP头,它可以对我们这个消息来做出一些设置,比如最关键的有我们一个属性叫路由件,好,我们先把这个路由件放在这儿,它是什么,我们一会儿再说,那消息里边呢,有头加体头。
01:40
加体,体里边呢,是我们真正要用的这个内容,我们把这个内容呢,先放在这头加体,然后呢,我们这个消息图里边有一些非常多的设置项,其中有一个设置项叫route key,我把这个设置项呢单独放过来,这个设置项呢,它叫root k叫路由件。
02:03
好,Root key我们称为路由件,至于作用我们一会儿才能知道,好,我们先放在这,证明这个路由件,这是我们的消息,消息呢里边有一个重要的头部信息,就是我们这个路由件好,我们这个生产者呢,准备好了一个消息,接下来呢,他肯定要把消息发送给我们的服务器,所以我们接下来呢就得有一个消息服务器,我们来画一个消息服务器,这个消息中间这服务器好,我们就画在这,这是我们的消息中间件服务器,那么这个消息中间件服务器它的这个概念,我们之前给它起了一个名字叫message broker,这个broker就是代表我们的服务器好,我们在这儿呢,又多了一个概念叫broker broker代表我们当前的这个消息服务器,这个服务器呢,你可以装多个,也可以暂时只装上一台服务器,然后接下来我们这个生产者就会将我们的消息好来准备一个。
03:03
生产者呢,先会产生一个我们这个消息,然后将我们这个消息发送给我们的服务器,发送给我们的服务器,然后呢,再由这个服务器要派发给一个目的地,但是在这个派发之前,我们再来说一下它里边的一些概念,首先在我们这个消息服务器里边有一个东西叫exchange交换器,我们也可以称为交换机,那这个交换机呢,跟我们现实生活中的交换机,比如教室后后边放的这一台交换机,交换机里边呢,有非常多的网线口,这个网口连接了大家的电脑,但是交换机呢,有一根网口,这个网口呢是来连接外网的,那大家比如叫经常去来上网,外网来的这个数据。那怎么知道要发给哪个电脑,就是通过交换机来决定的,每一根网线呢,都绑定上一台电脑,每一根网线都绑定上一台电脑,这样数据一过来,交换机一看这个数据是给哪个电脑的,你就顺着这个网线发给这个电脑。所以在我们rabbit MQ里边,Exchange这个交换器,交换机也是这个功能,它呢是用来接收生产者发送的消息,并将这些消息路由给服务器中的队列。所以我们接下来看一下,在我们这个消息代理里边,首先有一个交换机,而且这个交换机不止有一个,我们可能有非常多的交换机,好,我来画上好几个,我们就叫exchange X exchange,这就是我们说的交换机。所以我们这个消息发来,不是一下就存到我们这个队列里边的消息发来呢,先会发给我们这些交换机,好,我们来给这儿画一个,我们再来画一个比。
04:49
我们这个消息呢,同时都发给了这两个交换机都可以,好,我们先来到消息代理消息服务器的,我们称为这个消息代理,那就是我们安装了消息中间这样的这个服务器,那先来到服务器里边的exchange交换机。
05:07
这个交换机负责接收消息,好,它的这个作用就是来接收消息,负责接收。消息,那我们这个交换机来到以后,接下来它就把这个消息要分配给我们指定的队列,我们说消息中间件里边最重要的就是它将所有的数据都需要保存到队列里边,然后呢,别人就可以从队列里边取数据,好假设呢,我们这个消息中间键里边有非常多的消息队列,来放上三个消息队列,这三个消息队列呢,所有的消息将来都要保存到这个队列里边,这是一个Q,好,哎,这也是一个Q。Q,我们里边呢,可以有非常多的队列,那交换机拿到消息以后,他就要发给一个个的队列,但是呢,他发给哪个队列,我们要怎么确定?跟我们现实生活中一样,交换机就是我们教室后边放的这个大交换机,有非常多的网口,而队列就类似于大家的电脑,那交换机呢,就得跟队列有一个一个的绑定关系,那在现实生活中,我们这个交换机跟我们电脑的绑定都是用IP地址之类进行绑定的,好,那么现在这一块呢,我们先给它画上我们的这个绑定关系,所以我们这个交换机要知道他发给哪个队列,首先得知道我们这个交换机下边拖了几个队列,诶,这是一拖三呢还是一拖四呢?我们都来画上,好把这个加上。
06:43
这是我们说的这个队列,假设这个交换机后边拖了这么多的队列,那交换机跟队列之间的这个关系,我们就成为绑定关系,好,这是我们的队列,队列呢,它负责来存储消息,存储消息,存储消息,我们都知道交换机是接收消息,它把接收来的消息放到队列里边,队列来存储消息,而交换机跟队列之间的关系,我们就需要用一个东西叫绑定,它来绑定我们它们之间的关系,所以呢,交换机跟队列之间会有对应的绑定关系,绑定。
07:23
我们这个交换机呢,现在来绑定上了我们一个个的队列,好,我们来给它填充上这个颜色,好,这是我们的这个绑定关系,而这个绑定关系呢,我们把它写全,它的这个全名叫帮顶,好,这是我们的英文名字叫帮顶,那我们的这个绑定关系。假设我们就用字母来表示,Abcd来表示,那接下来我们假设交换机跟第一个队列的绑定关系叫A,它跟第二个队列的绑定关系叫B,好,我们来复制上几个,它跟第三个队列的绑定关系叫C,那这样我们这个一个消息怎么能到达我们的这个队列,所以接下来最重要的就在这儿了,录邮件,我们生产者在发消息,消息虽然被接收交换机先接收到,但我们发消息的时候呢,必须来指定一个路由件,比如我们一开始发这个消息,我们指定的这个路由件我们叫B,那接下来我们的生产者将消息一发到我们的代理里边,那这个消息呢,接下来就会先来到交换机,交换机一看这个路由件叫B,那接下来呢,他就来找B,这个交换机跟B的绑定关系,那它最终将消息就存储到了这个队列里边。
08:43
所以这是我们说的这个路由件B,它呢就是一个叫路由件,我们就叫r k root k啊这是我们的说的路由件,那接下来还有我们的这些,比如叫连接和信道,那么首先来说我们现在消息呢,是来发给我们的代理拿从交换机最终达到队列,而我们想要接收消息,那我们肯定得从这里边获取消息,那获取呢就要连接上我们这些东西,那所以呢,我们接下来就得有一个专门来接收消息的人,那我们把这个人呢,我们可以称为我们叫消息的接收者,我们也可以叫消费者,消费者呢,我们这个全称们英文名字我们就叫consumer。
09:29
好,Consumer呢,就是来负责接收我们这个消息的消费者,那无论是我们生产者发消息,还是我们消费者接消息,他们呢都必须跟我们这个服务器建立一个连接,所以我们接下来我来画一个连接,这个连接呢很大,是这个样子,来画一个箭头样子的连接,好。那我们呢,想要接消息,发消息也好,我们都必须跟服务器先建立连接,诶这个连接呢,我们就叫connection,我们把这个放大,我们现在呢,要跟服务器来建立连接,只有建立连接我们才能互相通信,建立连接,但是呢,现在问题又来了,我们这个消费者呢,未来有很多,而且可能要发送很多消息,比如我们这个订单服务要收发消息,库存服务要收发消息,用户服务要收发消息等等等等,那么来画上多个服务,比如呢,我们这消费者里边呢,有非常多,我们这有订单的,库存的等等等等,那接下来呢,而且我们要收发很多消息,假设呢,我们这个消费者呢,他是我们这个用户服务的用户的,那他来收发消息,每收一个消息都要建立一条连接吗?我说不是的,我们一个客户端只需要建立一条连接,所以这一块。
10:54
呢非常重要,而且呢,这个连接是一个长连接,就是一直保持着,所以我们这一块一个客户端,一个客户端,所谓的客户端就是跟我们这个服务器建立连接的,它要收发数据的,一个客户端只会建立一条连接,那么这条连接里呢,我们就来进行收发数据,而怎么收发数据,它呢,就是在连接里边们这一整条连接,比如我们这个消费者,我们现在是用户服务,既要监听这个队列的消息,还要拿这个消息,还要拿这个消息,所以呢,接下来他呢,就不是说这一个用户要跟三个队列,每一个建一条连接,每一个建一条连接,每一个建一条连接,或者呢收发一次消息,建一条连接,接下来呢,他在中间就会用我们一个东西叫信道,我们的通道channel,这个channel呢,在Java的NIO里边也有我们这个信道,那么接下来呢,就是通过。
11:55
一条连接上开辟多条信道,就像我们这个连接,就像高速公路,我们只需要建一条高速公路,然后呢,我们开上八个车道,那这八个车道每一个车道做自己的事,比如这四个车道是过去的,这四个车道是过来的,那这就行了。所以呢,这个连接不是说每一次收发消息都建立的,我们在连接里边会有非常多的通道来画上一些通道,来画上一个个的这个通道,通道呢我们就来画成一个这个条的,这是我们说的这个叫信道,好,我们就叫信道,信道我们呢只需要建立一个一个的信道就行了,一个客户端建立一条连接,我们在这个通道里边来传输数据,同样的生产者这边也一样,他们呢都是在通道里边建立一条连接,我们来画上一条连接,然后呢,使用非常多的通道,我们这个连接就画在这儿。
12:55
这只需要一条连接,然后呢,很多channel通道就行了,好,我们这一块呢,就叫一条连接,而且呢是连接。
13:07
很多channel,很多通道,所以接下来我们就是整个流程就是这样子的。我们生产者先跟我们的消息代理建立上一条连接,然后呢,接下来在连接里边开辟上一条通道来进行发送数据,然后这个数据呢,就是我们的消息,每一个消息都必须指定路由件,消息先到达我们的消息代理,也是我们服务器,由服务器呢交给我们的交换机,交换机再根据它和队列的绑定关系,决定我们将这个消息要最终放到哪个队列里边,那接下来这些队列里边呢,就专门有人去来监听这些队列,当然任何一个客户端都是通过与我们整个消息代理建立一个连接就行了,他要监听的所有队列的内容都是通过信道来传输的,好,我们在这个信道里边来画上。
14:09
比如我们现在要监听很多队列,我们比如监听这个队列,我就来画上,而比如这个信道呢,我们是来监听这个队列收发消息的,我我们在这儿呢,也可以来画上。这就是我们说的整个这一块的交互。那在这个流程里边呢,我们说了消息队列,存数据的消费者呢,可以从这里边把数据拿走,绑定关系是主要来决定我们交换机和我们的队列他们之间的关系,还有我们的消费者是来真正要消费数据拿数据的,而我们在re MQ里边还有一个东西叫虚拟主机,虚拟主机呢表示一批交换器、消息队列和相关对象。举一个例子,假设呢,我们现在有两套系统,一个是Java,一个是呢PHP,我们想要发消息,如果我们全部都发给rabbit MQ,我们这个Java呢,假设发消息导致我们这个消息队列崩溃,各种问题可能都会导致我们PHP系统不好用,那怎么办呢?我们这个MQ啊,还给我们有一种机制叫虚拟主机,所以呢,我们这一批的交换机和队列,它可以默认放在一个虚拟主机。所谓的虚拟主。
15:26
就是我们不需要再安装一个re MQ,我们直接把它们隔离,就相当于把这一堆我们来隔离起来,那么把这一堆呢,隔离起来,我们就叫一个虚拟主机,好,我们把这一堆我们拿过来,它呢就可以构成一个我们称为虚拟主机。好,我们把它们呢都叫虚拟主机,它呢是一个v host,诶我们称为。V host,而且虚拟主机呢,是以路径表示的,假设呢,我们这个就叫杠Java,然后呢,接下来我们PHP系统呢,我们可以给rabbit MQ里边再来开辟一个虚拟主机,下面再来开辟一个隔离的区间,虚拟主机跟虚拟主机之间是互相隔离的,所以呢,一个有问题了,不会影响另外一个,而且他们之间互相隔离,虚拟主机这个we host,比如它的路径叫杠PHP,以后PHP系统之间想要发消息了,给这个里边发,咱俩之间想要发消息了,给这个里边发,这个里边有任何问题都不会影响我们这个虚拟主机的所有配置,而且配置呢也是互相隔离,相当于你完全安装了另外一台rabbit MQ,特别是呢,我们也可以用于生产环境和开发环境的隔离,比如我们开发环境里边,我们将所有的一套配置,我们放。
16:55
在这个虚拟主机下们,比如就叫杠dev,接下来我们开发整个圈都测试完了,我们以后呢,上线以后,我们让它连上我们真正的这个虚拟主机,比如我们生产环境这样呢,两套都是隔离的,互不影响的,那至此这就是我们整个re MQ牵扯到的所有的概念,那理解清了我们整个这个概念流程图,我们用MQ就会非常简单了,我们再来梳理一遍,整个就是呢,无论是生产者往出发消息,还是消费者想要接消息,他们都必须跟re MQ来建立一条连接,然后所有的收发数据都在连接里边开辟信道来进行收发,但这一块是网络底层的,大家可以不用去来理解,想要收发呢,都是收发的是消息,所以我们要构造一个消息,消息呢,有头有体,头呢相当于对消息的一些参数设置命令体,那就是消息的真正内容。而在。
17:55
但我们这个消息里边最重要的一个就是我们路由件,我们将消息相当于指定好路由件要发给谁以后,消息首先来到我们消息代理,相当于rabbit MQ服务器指定的一个虚拟主机里边,由虚拟主机里边指定的这个交换机,所以相当于我们要发消息的时候,还要指定好发给哪个交换机,不然我们也不知道要送给哪个交换机,然后呢,有指定的交换机收到以后,它根据我们消息的路由件,通过交换机跟其他队列的绑定关系,最终决定将这个消息抵达给哪个队列,然后呢,我们消费者就会监听这个队列,队列里边的内容就会被他们实时拿到,当然也是通过信道来拿到的。
18:45
而建立常链接的好处就是一旦我们这个消费者出现了问题,宕机,或者各种连接中断了,那rabbit MQ呢,就会实时的感知有消费者下线,我这个消息的没办法往出派发了,他就会再次存储起来,不造成我们大面积的消息丢失等等。比如他不知道我们这个消费者已经断线了,他还把消息啪发出去,他认为自己发出去了,再把消息一删,那不就丢失了吗?所以我们这个长链接也是有非常大的好处,那这是我们整个MQ的概念。
我来说两句