消息中间件 MQ(也称消息队列)的基本功能是传递和转发消息,其最重要的作用是能够解耦业务及系统架构,可以说是一个系统发展壮大到一定阶段绕不开的东西。
而 RabbitMQ 是对 AMQP(高级消息队列协议)的实现,成熟可靠并且开源,本系列文章将会讲述如何在 node 中入门这一利器。
01
—
RabbitMQ 概述
先来简单的了解一下 RabbitMQ 相关的基本概念:
Producer :生产者,生成消息并把消息发送给 RabbitMQ 。
Consumer :消费者,从 RabbitMQ 中接收消息。
Exchange :交换器,具有路由的作用,将生产者传递的消息根据不同的路由规则传递到对应的队列中。交换器具有四种不同的类型,每种类型对应不同的路由规则。
Queue :队列,实际存储消息的地方,消费者通过订阅队列来获取队列中的消息。
Binding :绑定交换器和队列,只有绑定后消息才能被交换器分发到具体的队列中,用一个字符串来代表 Binding Key 。
消息是如何由生产者传递到消费者:
1、生产者 Producer 生成消息 msg ,并指定这条消息的路由键 Routing Key ,然后将消息传递给交换器 Exchange 。
2、交换器 Exchange 接收到消息后根据 Exchange Type 也就是交换器类型以及交换器和队列的 Binding 绑定关系来判断路由规则并分发消息到具体的队列 Queue 中。
3、消费者 Consumer 通过订阅具体的队列,一旦队列接收到消息便会将其传递给消费者。
这里的 Routing Key 和 Binding 我是按照自己的理解解释的,与某些参考资料是有出入的,读者理解就好。
当然完成上述三个步骤还缺少两个关键的东西:
Connection :连接,不论生产者还是消费者想要使用 RabbitMQ 都必须首先建立到 RabbitMQ 的 TCP 连接。
Channel :信道,建立完 TCP 连接后还必须建立一个信道,消息都是在信道中传递和操作的。
上图形象的展示了连接和信道之间的关系,一个连接中可以建立多个信道,而且每个信道之间都是完全隔离的,同时我们需要记住的是创建和销毁 TCP 连接是很消耗资源的,而信道则不是,所以能够通过创建多个信道来隔离环境的不要通过创建多个连接。
02
—
交换器类型
交换器具有路由分发消息的作用,其有四种不同的类型,每种类型对应不同的路由规则:
fanout :广播,将消息传递给所有该交换器绑定的队列。
direct :直连,将消息传递给 Routing Key 与 Binding Key完全一致的队列中,可以有多个队列。
topic :模糊匹配,Binding Key 是一个可以用符号 . 分隔单词的字符串,模糊匹配下,符号 * 用于匹配任意一个单词,符号 # 用于匹配零个或多个单词。
headers :这个比较特殊,是根据消息中具体内容的 header 属性来作为路由规则的,这种类型对资源消耗太大,一般很少使用,前面三种类型就够了。
作为入门系列的第一篇文章,本文简单讲述了 RabbitMQ 中的一些基本概念,熟悉了这些概念之后有助于我们后续操作 RabbitMQ ,而后续的文章将会给出具体的代码继续入门。