RabbitMQ学习之入门篇-笔记1

112 阅读3分钟

image.png Producer: 生产者,就是投递消息的一方。生产者创建消息,然后发布到RabbitMQ中。消息一般可以包含 两个部分:消息体和标签

Consumer: 消费者,就是接收消息的一方。消费者连接到RabbitMQ服务器,并订阅到队列上,当消费者消费 一条消息时,只是消费消息的消息体

Broker: 消息中间件的服务节点。对RabbitMQ来说,RabbitMQ Broker简单看作RabbitMQ服务节点

image.png

该图展示了生产者将消息存入rabbitMQ Broker,以及消费者消费Broker中消费数据的流程。

一、队列

Queue: 队列,是RabbitMQ的内部对象,用于存储消息。

多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊,给多个消费者进行处理,而不是每个消费者都收到所有的消息井处理

image.png

二、交换器,路由键,绑定

Exchange: 交换器。生产者将消息发送到Exchange,由交换器将消息路由到一个或者多个队列中。如果路由不到,或许会返回给生产者,或许直接丢弃。

image.png

RoutingKey: 路由键。生产者将消息发给交换器的时候,一般会指定一个RoutingKey,用来指定这个消息的路由策略,RoutingKey需要与交换器类型和绑定键(BindingKey)配合使用才能最终生效。

Binding: 绑定。RabbitMQ中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键(BindingKey) ,这样RabbitMQ就知道如何正确将消息路由到队列了

image.png

三、交换器的类型

1.direct:它会把消息路由到那些 BindingKey RoutingKey完全匹配的队列中。及一对一。 image.png 在发送消息的时候设置路由键为" info" 或者 "debug" ,消息只会路由到 Queue2。

2.fanout:它会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。

3.headers:该类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中headers属性进行匹配。headers 类型的交换器性能会很差,而且也不实用,基本上不会看到它的存在。

4.topic:将消息路由 BindingKey和RoutingKey相匹配的队列中,但这里的匹配规则有些不同。

  1. RoutingKey为一个点号"."分隔的字符串,如 "com.rabbitmq.client","java.util.current"
  2. BindingKey和RoutingKey一样也是点号"."分隔的字符串;
  3. BindingKey中可以存在两种特殊字符串""和"#",用于做模糊匹配,其中"#"用于匹配一单词,""用于匹配多规格单词(可以是零个)。 image.png
  • 路由键为"com.rabbitmq.client" 的消息会同时路由到Queue1和Queue2;
  • 路由键为"com.hidden.client" 的消息只会路由到Queue2中;

四、RabbitMQ流程

生产者生产消息到投递信息:

  1. 生产者连接RabbitMQ Broker,然后创建一个Connection,开启一个信道Channel。
  2. 生产者创建交换器,并设置一些属性,如交换机类型,是否持久化等。
  3. 生产者创建一个队列,设置一些属性,如是否排他,是否持久化等。
  4. 然后将队列与交换器进行绑定,通过routingKey。
  5. 生产者发送消息至RabbitMQ Broker中,其中包含路由键,交换器等信息
  6. 相应的交换器,根据路由键寻找合适的队列。
  7. 找到,则将消息放入到队列中,找不到,则将消息丢弃或者返回给生产者。
  8. 关闭信道,关闭连接。

消费者消费信息流程:

  1. 消费者连接RabbitMQ Broker,创建一个Conection,开启一个信道Channel.
  2. 消费者向RabbitMQ Broker请求消费相应的队列中的消息。
  3. 等待RabbitMQ Broker回应并投递相应队列中的消息,消费消息。
  4. 消费者确认ack收到消息。
  5. RabbitMQ从队列中删除以消费的消息。
  6. 关闭信道,关闭连接。