RabbitMQ入门 | 青训营

56 阅读5分钟

RabbitMQ是一个消息代理。它的工作就是接收和转发消息。你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处。在这个比喻中,RabbitMQ就扮演着邮箱、邮局以及邮递员的角色。

RabbitMQ和邮局的主要区别在于,它处理纸张,而是接收、存储和发送消息(message)这种二进制数据。

基础架构

image.png

名词解释

  1. 消息队列(Message Queue):消息队列是 RabbitMQ 的核心概念,它是一个中间件,用于在应用程序之间传递消息。发送方将消息发布到消息队列,接收方从队列中获取消息并进行处理。
  2. 生产者(Producer):生产者是消息的发送方,负责将消息发布到消息队列。生产者创建消息并将其发送到特定的队列。
  3. 消费者(Consumer):消费者是消息的接收方,负责从消息队列中获取消息并进行处理。消费者订阅特定的队列,并从队列中接收消息进行消费。
  4. 连接(connection):生产者/消费者 和broker之间的TCP连接.Connection是物理TCP连接,会执行认证、IP解析、路由等底层网络任务。
  5. 通道(Channel):Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通过每个Thread创建单独的channel进行通讯,AMQP method包含了channel id 帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立。
  6. broker:接收和分发消息的应用,RabbitMQ Server就是 Message Broker。
  7. Virtual host:出于多租户和安全因素设计的,把AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQserver 提供的服务时,可以划分出多个vhost,每个用户在自己的 vhost创建exchange/queue 等。
  8. 队列(Queue):队列是消息的存储区域,用于保存生产者发送的消息。消费者从队列中获取消息进行消费。消息队列可以有多个队列,每个队列都有一个唯一的名称。
  9. 交换器(Exchange):交换器是生产者发送消息的目标,负责将消息路由到一个或多个队列。交换器根据指定的规则(路由键)将消息发送到相应的队列。常用的类型:direct (point-to-point),topic (publish-subscribe) andfanout (multicast)等交换机
  10. 绑定(Binding):绑定是交换器和队列之间的关联关系,用于指定将消息从交换器路由到哪个队列。绑定会将队列和交换器关联起来,并指定一个绑定键。
  11. 路由键(Routing Key):路由键是消息的标识符,生产者在发送消息时指定路由键。交换器根据路由键将消息发送到相应的队列。
  12. 消费者确认(Consumer Acknowledgement):消费者在接收并成功处理消息后,发送确认给 RabbitMQ,表示该消息已经被处理。消费者确认机制确保消息被成功消费,防止消息丢失。
  13. 消息持久化(Message Durability):消息持久化是指在消息发送之前将消息标记为持久化,以确保即使在 RabbitMQ 服务器崩溃或重启后,消息也能够被恢复和处理。
  14. 发布-订阅模式(Publish-Subscribe Pattern):发布-订阅模式是一种消息传递模式,其中一个生产者将消息发布到一个交换器,然后交换器将消息广播给多个订阅了该交换器的队列。每个队列都有自己的消费者,并独立地处理接收到的消息。

交换机类型

  1. fanout交换机:会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。消息发送后,交换机会把消息发送到每个队列中。如果消费者不在线,那么不在线期间发送过来的消息则收不到,上线后也收不到,只有在线状态才能收到消息,相当于广播,播放一声,如果在线就知道,不在线也就不知道了。

  2. direct类型的交换器路由规则很简单,它会把消息路由到那些BindingKey和RoutingKey完全匹配的队列中。直接交换器通过路由key和绑定key是否完全匹配,如果完全匹配,则一定会到指定的队列中,如果路由key和绑定key不匹配,则进入不了对应的队列中。消费者只有消费符合规则的消息

  3. topic类型的交换器在direct匹配规则上进行了扩展,也是将消息路由到BindingKey和RoutingKey相匹配的队列中。

    • RountingKey 和 BindingKey 由多个单词使用逗号 . 进行连接;
    • BindingKey 支持两个特殊符号:#* 。其中 * 用于匹配一个单词, # 用于匹配零个或者多个单词。
    • image.png
  4. headers类型的交换器不依赖于路由键的匹配规则来路由信息,而是根据发送的消息内容中的headers属性进行匹配。不推荐使用

死信队列

当消息在一个队列中变成死信 (dead message) 之后,它可以被重新被发送到死信交换器上 (英文为 Dead-Letter-Exchange,简称 DLX ),任何绑定死信交换器的队列都称之为死信队列。需要特别说明的是死信交换器和死信队列与正常的交换器和队列完全一样,采用同样的方式进行创建,它们的名称表达的是其功能,而不是其类型。一个正常的消息变成死信一般是由于以下三个原因:

  • 消息被拒绝 ,井且设置重回队列的参数 requeue 为 false;
  • 消息过期;
  • 队列达到最大长度。