前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RabbitMQ 入门系列(三)

RabbitMQ 入门系列(三)

作者头像
凌虚
发布2020-07-17 12:13:44
3250
发布2020-07-17 12:13:44
举报
文章被收录于专栏:Node Python Go全栈开发

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 进行不同的处理。通过本文了解了不同的交换器类型,有助于你在此基础上进行具体的路由规则设计。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Node Python Go全栈开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档