MQ[0]-RabbitMQ 起步
文章目录
基本概念
Queue
Queue(队列)RabbitMQ 的作用是存储消息,队列的特性是先进先出。上图可以清晰地看到 Client A 和 Client B 是生产者,生产者生产消息最终被送到 RabbitMQ 的内部对象 Queue 中去,而消费者则是从 Queue 队列中取出数据。可以简化成表示为:
生产者 Send Message “A”被传送到 Queue 中,消费者发现消息队列 Queue 中有订阅的消息,就会将这条消息 A 读取出来进行一些列的业务操作。这里只是一个消费正对应一个队列 Queue,也可以多个消费者订阅同一个队列 Queue,当然这里就会将 Queue 里面的消息平分给其他的消费者,但是会存在一个一个问题就是如果每个消息的处理时间不同,就会导致某些消费者一直在忙碌中,而有的消费者处理完了消息后一直处于空闲状态,因为前面已经提及到了 Queue 会平分这些消息给相应的消费者。这里我们就可以使用 prefetchCount 来限制每次发送给消费者消息的个数。详情见下图所示:
这里的 prefetchCount=1 是指每次从 Queue 中发送一条消息来。等消费者处理完这条消息后 Queue 会再发送一条消息给消费者。
Exchange
首先明确一点就是生产者产生的消息并不是直接发送给消息队列 Queue 的,而是要经过 Exchange(交换器),由 Exchange 再将消息路由到一个或多个 Queue,当然这里还会对不符合路由规则的消息进行丢弃掉,这里指的是后续要谈到的 Exchange Type。那么 Exchange 是怎样将消息准确的推送到对应的 Queue 的呢?那么这里的功劳最大的当属 Binding,RabbitMQ 是通过 Binding 将 Exchange 和 Queue 链接在一起,这样 Exchange 就知道如何将消息准确的推送到 Queue 中去。简单示意图如下所示:
在绑定(Binding)Exchange 和 Queue 的同时,一般会指定一个 Binding Key,生产者将消息发送给 Exchange 的时候,一般会产生一个 Routing Key,当 Routing Key 和 Binding Key 对应上的时候,消息就会发送到对应的 Queue 中去。那么 Exchange 有四种类型,不同的类型有着不同的策略。也就是表明不同的类型将决定绑定的 Queue 不同,换言之就是说生产者发送了一个消息,Routing Key 的规则是 A,那么生产者会将 Routing Key=A 的消息推送到 Exchange 中,这时候 Exchange 中会有自己的规则,对应的规则去筛选生产者发来的消息,如果能够对应上 Exchange 的内部规则就将消息推送到对应的 Queue 中去。那么接下来就来详细讲解下 Exchange 里面类型。
Exchange Type
fanout
把所有发送到该 Exchange 的消息路由到所有与它绑定的 Queue 中。
上图所示,生产者(P)生产消息 1 将消息 1 推送到 Exchange,由于 Exchange Type=fanout 这时候会遵循 fanout 的规则将消息推送到所有与它绑定 Queue,也就是图上的两个 Queue 最后两个消费者消费。
direct
把消息路由到那些 binding key 与 routing key 完全匹配的 Queue 中
当生产者(P)发送消息时 Rotuing key=booking 时,这时候将消息传送给 Exchange,Exchange 获取到生产者发送过来消息后,会根据自身的规则进行与匹配相应的 Queue,这时发现 Queue1 和 Queue2 都符合,就会将消息传送给这两个队列,如果我们以 Rotuing key=create 和 Rotuing key=confirm 发送消息时,这时消息只会被推送到 Queue2 队列中,其他 Routing Key 的消息将会被丢弃。
topic
topic 这个规则就是模糊匹配,可以通过通配符满足一部分规则就可以传送。它的约定是:
- routing key 为一个句点号
.
分隔的字符串(我们将被句点号.
分隔开的每一段独立的字符串称为一个单词),如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit” - binding key 与 routing key 一样也是句点号
.
分隔的字符串 - binding key 中可以存在两种特殊字符
*
与#
,用于做模糊匹配,其中_
用于匹配一个单词,#
用于匹配多个单词(可以是零个)
当生产者发送消息 Routing Key=F.C.E 的时候,这时候只满足 Queue1,所以会被路由到 Queue 中,如果 Routing Key=A.C.E 这时候会被同是路由到 Queue1 和 Queue2 中,如果 Routing Key=A.F.B 时,这里只会发送一条消息到 Queue2 中。
headers
headers 类型的 Exchange 不依赖于 routing key 与 binding key 的匹配规则来路由消息,而是根据发送的消息内容中的 headers 属性进行匹配。
在绑定 Queue 与 Exchange 时指定一组键值对;当消息发送到 Exchange 时,RabbitMQ 会取到该消息的 headers(也是一个键值对的形式),对比其中的键值对是否完全匹配 Queue 与 Exchange 绑定时指定的键值对;如果完全匹配则消息会路由到该 Queue,否则不会路由到该 Queue。
(ing…)