RabbitMQ 入门系列(一)讲述了 RabbitMQ 有关的基本概念。RabbitMQ 入门系列(二)通过两个示例实现了基本的消息投递和接收功能,但示例中使用的均是默认的交换器,且并未对其进行深入描述,本文则将会继续通过示例重点讲述交换器的几种不同类型。
01
—
回顾
我们再来回顾一遍 RabbitMQ 的一般使用流程:
1、建立到 RabbitMQ 的连接。
2、创建信道。
3、声明交换器。
4、声明队列。
5、绑定交换器和队列。
6、消息操作。生产者:生成并发布消息;消费者:订阅并消费消息。
7、关闭信道。
8、关闭连接。
交换器 Exchange 的四种类型:
1、fanout:广播,将消息传递给所有该交换器绑定的队列。
2、direct :直连,将消息传递给 Routing Key 与 Binding Key完全一致的队列中,可以有多个队列。
3、topic :模糊匹配,Binding Key 是一个可以用符号 . 分隔单词的字符串,模糊匹配下,符号 * 用于匹配任意一个单词,符号 # 用于匹配零个或多个单词。
4、headers :根据消息中具体内容的 header 属性来作为路由规则的,这种类型对资源消耗太大且很少使用,本文不对此类型进行讲述。
02
—
Publish/Subscribe
此示例重点关注交换器 Exchange 的 fanout 类型。
消费者接收消息(receive_log.js):
生产者投递消息(emit_log.js):
fanout 类型的交换器会直接将消息广播到所有与其绑定的队列,所以绑定交换器与队列时无需指定 binding key (空字符串),投递消息时也无需指定 routing key (空字符串)。
交换器与队列一样具有 durable 属性,此属性表示是否对交换器进行持久化,也就是保存到磁盘上,一旦 RabbitMQ 服务器重启,持久化的交换器可以被重新恢复。
这里在声明队列时,我们使用的是一种临时的队列,我们无需指定该队列的名称,RabbitMQ 会自动为其生成一个随机的名称,同时 exclusive 属性表明该队列是否只会被当前连接使用,也就是说连接一旦关闭则此队列也会被删除。
03
—
Routing
此示例重点关注交换器 Exchange 的 direct 类型。
消费者接收消息(receive_log_direct.js):
生产者投递消息(emit_log_direct.js):
交换器为 direct 类型,路由规则是 routing key 与 binding key 完全一致,这就是说与上例 fanout 类型不同的是,我们必须指定绑定交换器和队列的 binding key ,投递消息时也需要指定路由的 routing key 。其余地方基本一致。
04
—
Topics
此示例重点关注交换器 Exchange 的 topic 类型。
消费者接收消息(receive_log_topic.js):
生产者投递消息(emit_log_topic.js):
交换器的 topic 类型,只需注意模糊匹配的规则即可,绑定交换器和队列的 binding key 以符号 . 将字符串分隔为不同的单词(不一定是真实的单词,理解为一个部分就行了),符号 * 用于匹配任意一个单词,符号 # 用于匹配零个或多个单词。
05
—
结语
其实你会发现本文三个示例中的大部分地方都是类似的,唯一不同的地方就是不同的交换器类型需要对 binding key 和 routing key 进行不同的处理。通过本文了解了不同的交换器类型,有助于你在此基础上进行具体的路由规则设计。