RabbitMQ的核心运行机制,首先在我们高级消息队列的路由机制,这个和JMS是有大差别的,他给我们增加了Exchange和Bindding,
Exchange就是我们介绍的交换器,和Binding绑定的路由规则,那我们一个消息是如何从一个生产者到消费者呢,它是这样的,
首先我们这个生产者,他给我们生产了一个消息,准备发布到哪个队列上,我们生产者先把消息发给Broker,也就是我们的消息代理,
也就是我们的服务器,而这个服务器呢,收到消息以后,他把这个消息,给到一个合适的交换器,这个交换器呢,它是和我们这个消息队列
来进行绑定的,我们服务器中有非常多的交换器,有非常多的消息队列,消息给交换器以后,交换器根据消息携带过来的路由件,来判断,
我是要交给你这个队列,还是交给这个队列,还是交给这个队列,还是我一起都交给他们,交换器通过这个绑定规则,交给队列以后,
我们接下来消费者,就可以连接上这些队列,来取出相应的消息了,核心就是这个交换器,和绑定规则,交换器不同,绑定规则不同,那我们派发
消息的这个结果,就不一样
之前我们介绍交换器有四种类型,一种是direct,还有fanout,topic,还有headers,headers我们就不说了,
后来用的呢非常少,他不是路由件来判断的,而是由高级消息队列的消息头,那我们就直接来说前三种,第一种我们
叫direct,这个是直连型的交换器,他的作用呢,就是当我们发送消息时的这个路由件,和我们绑定件一模一样的时候,
消息就会派发给这个队列,举一个例子,我们这里有一个交换器,他的类型呢,是direct,他下边绑定了几个消息队列,
比如是接收路由为dog的消息,而这个绑定规则,是来接收路由key为dogpuppy这个消息,如果我们发了一个消息,我们自己的
路由件,叫dog,那么直连就会找到dog这个规则,对应的这个消息队列,把这个消息放进去,其他的都不会放,只有发消息的
路由件,跟我们绑定的路由件,完全一致的时候,我们才会给你发过来,这就是典型的点对点通信模型
Fanout Exchange这个就非常简单了,如果说我们有一个交换器,是Fanout类型,他下面绑定了比如几个消息队列,
当我们一个消息抵达fanout交换器以后,不管你这个消息的路由件是什么,它会把这个消息给里面的所有队列,每人
都去发一份,这个就是我们说的广播模式,这个发送消息的速度,是最快的,这也是我们实现JMS里边,发布订阅模型的,
一个参考实现,还有我们Topic Exchange,他就更复杂了,它允许我们对路由件,来做一些模糊匹配,然后有选择性的,
把它发给某一个队列,比如我们Exchange是Topic Exchange,他下面绑定了四个队列,而第一个队列他绑定时,用的是
usa.#,这个#是一个通配符,通配符允许#和*,#可以匹配0个或多个单词,*能匹配一个单词,他们是单词级别的匹配,我们
回过来说,如果Exchange下边绑定了四个消息队列,第一个绑定线叫usa.#,相当于后边可以是任意一个单词,第二个叫#.news,
前面可以是任意一个单词,#weather,前面是任意一个单词,后面是weather,europe.#,这个是后边是任意单词,前面是europe,
那如果我们来发送消息,第一个消息我们写的键,叫usa.news,那符合哪个呢,首先usa.#是符合的,只要是usa开头的,不管后边是
哪个单词,都行,那么这个消息会被放到这个队列,还会放到哪个队列呢,还会放到#.news,因为它是usa.news,它是一个新闻,
我们这一块绑定的key是news,前面这个单词我们无所谓,都可以来进行模糊匹配,他就可以来发给这个内容,所以这个消息可以
发到这两个队列上去,那剩下的也都一样,比如所有是weather的,不管是usa的还是europe的,都会来带weather的消息队列里面,
所有以europe开头的,不管你是news还是weather的消息,都会根据规则来到这个队列里面,所有以news结尾的,不管你是usa的
news还是europe的news,都会来到这个队列里边,这就是我们说的有选择性的,进行某种模式进匹配以后,我们再来决定发给
哪个消息队列,那么总结起来来说,第一个根据路由件将消息发给指定的队列,我们说的单播模式,第二种,我们不管路由件发给
我们绑定的交换器的所有消息队列,就是我们说的广播模式,第三种是根据路由件的匹配,我们有选择性的进行广播