消息中间件——RabbitMQ—基础(二)

核心概念

  1. Connection

    Connection是RabbitMQ内部对象之一,用于管理每个到RabbitMQ的TCP网络连接。

  2. Producer与Consumer

    生产者与消费者相对于RabbitMQ服务器来说,都是RabbitMQ服务器的客户端。

    生产者(Producer):连到RabbitMQ服务器,将消息发送到RabbitMQ服务器的队列,是消息的发送方。

    消费者(Consumer):连接到RabbitMQ则是为了消费队列中的消息,是消息的接收方。

    生产者与消费者一般由我们的应用程序充当。

  3. Channel

    Channel是我们与RabbitMQ打交道的最重要的一个接口,我们大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等

  4. Exchnage

    消息交换机,作用是接收来自生产者的消息,并根据路由键转发消息到所绑定的队列。

    生产者发送上的消息,就是先通过Exchnage按照绑定(binding)规则转发到队列的。

    交换机类型(Exchange Type)有四种:fanout、direct、topic,headers,其中headers并不常用。

    • fanout:这种类型不处理路由键(RoutingKey),很像子网广播,每台子网内的主机都获得了一份复制的消息,发布/订阅模式就是指使用fanout交换机类型,fanout类型交换机转发消息是最快的。

    • direct:模式处理路由键,需要路由键完全匹配的队列才能收到消息,路由模式使用的是direct类型的交换机。

    • topic:将路由键和某模式进行匹配。主题模式使用的是topic类型的交换机。

      路由模式,发布订阅模式,主题模式,这些工作模式我们下面会讲。

  5. Queue

    Queue,即队列,RabbitMQ内部用于存储消息的对象,是真正用存储消息的结构,在生产端,生产者的消息最终发送到指定队列,而消费者也是通过订阅某个队列,达到获取消息的目的。

  6. RoutingKey(路由键)

    用于把生成者的数据分配到交换器上;

  7. BindingKey(绑定键)

    用于把交换器的消息绑定到队列上;

  8. Virtual Host

    Virutal host也叫虚拟主机,一个VirtualHost下面有一组不同Exchnage与Queue,不同的Virtual host的Exchnage与Queue之间互相不影响。

    应用隔离与权限划分,Virtual host是RabbitMQ中最小颗粒的权限单位划分。

    如果要类比的话,我们可以把Virtual host比作MySQL中的数据库,通常我们在使用MySQL时,会为不同的项目指定不同的数据库,同样的,在使用RabbitMQ时,我们可以为不同的应用程序指定不同的Virtual host。

消息传递过程

首先客户端必须连接到 RabbitMQ 服务器才能发布和消费消息,客户端和 rabbit server 之间会创建一个 tcp 连接,一旦 tcp 打开并通过了认证(认证就是你发送给 rabbit 服务器的用户名和密码),你的客户端和 RabbitMQ 就创建了一条 amqp 信道(channel),信道是创建在“真实” tcp 上的虚拟连接,amqp 命令都是通过信道发送出去的,每个信道都会有一个唯一的 id,不论是发布消息,订阅队列都是通过这个信道完成的。

为什么不直接通过TCP协议?

因为其代价高昂,如果有成千上万个请求,是否要建立成千上万个TCP连接?

  1. 发送消息

    • 生产者和Broker建立TCP连接。
    • 生产者和Broker建立通道。
    • 生产者通过通道消息发送给Broker,由Exchange将消息进行转发。
    • Exchange将消息转发到指定的Queue(队列)
  2. 接受消息

    • 消费者和Broker建立TCP连接
    • 消费者和Broker建立通道
    • 消费者监听指定的Queue(队列)
    • 当有消息到达Queue时Broker默认将消息推送给消费者。

工作模式

  1. 简单(simple)模式

    simple模式,是RabbitMQ几种模式中最简单的一种模式,其结构如下图所示:

    消息中间件——RabbitMQ—工作模式(三)_2020-07-10-14-53-52.png

    从上面的示意图,我们可以看出simple模式有以下几个特征:

    • 只有一个生产者、一个消费者和一个队列。
    • 生产者和消费者在发送和接收消息时,只需要指定队列名,而不需要指定发送到哪个Exchange,RabbitMQ服务器会自动使用Virtual host的默认的Exchange,默认Exchange的type为direct。
  2. 工作(work)模式

    在simple模式下只有一个生产者和消费者,当生产者生产消息的速度大于消费者的消费速度时,我们可以添加一个或多个消费者来加快消费速度,这种在simple模式下增加消费者的模式,称为work模式,如下图所示:

    消息中间件——RabbitMQ—工作模式(三)_2020-07-10-14-54-11.png

    work模式有以下两个特征:

    • 可以有多个消费者,但一条消息只能被一个消费者获取。
    • 发送到队列中的消息,由服务器平均分配给不同消费者进行消费。
  3. 发布/订阅(pub/sub)模式

    work模式可以将消息转到多个消费者,但每条消息只能由一个消费者获取,如果我们想一条消息可以同时给多个消费者消费呢?

    这时候就需要发布/订阅模式,其示意图如下所示:

    消息中间件——RabbitMQ—工作模式(三)_2020-07-10-14-54-28.png

    从上面的示意图我们可以看出来,在发布/订阅模式下,需要指定发送到哪个Exchange中,上面图中的X表示Exchange。
    发布/订阅模式中,Echange的type为fanout。

    • 生产者发送消息时,不需要指定具体的队列名,Exchange会将收到的消息转发到所绑定的队列。
    • 消息被Exchange转到多个队列,一条消息可以被多个消费者获取。
  4. 路由(routing)模式

    前面几种模式,消息的目标队列无法由生产者指定,而在路由模式下,消息的目标队列,可以由生产者指定,其示意图如下所示:

    从上面示意图,我们可以看出路由模式有以下特征:

    消息中间件——RabbitMQ—工作模式(三)_2020-07-10-14-54-44.png

    • 路由模式下Exchange的type为direct。

    • 消息的目标队列可以由生产者按照routingKey规则指定。

    • 一条消息队可以被多个消息者获取。只有RoutingKey与BidingKey相匹配的队列才会收到消息。

      RoutingKey用于生产者指定Exchange最终将消息路由到哪个队列,BindingKey用于消费者绑定到某个队列。

  5. 主题(topic)模式

    主题模式是在路由模式的基础上,将路由键和某模式进行匹配。其中#表示匹配多个词,*表示匹配一个词,消费者可以通过某种模式的BindKey来达到订阅某个主题消息的目的,如示意图如下所示:

    消息中间件——RabbitMQ—工作模式(三)_2020-07-10-14-55-00.png

    • 主题模式Exchange的type取值为topic。
    • 一条消息可以被多个消费者获取。
文章目录
  1. 1. 核心概念
  2. 2. 消息传递过程
  3. 3. 工作模式
|