RabbitMQ中的核心概念和交换机类型

目录

一、RabbitMQ相关概念

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

  • 消息体:在实际应用中,消息体一般是一个带有业务逻辑结构的数据,比如一个JSON字符串。当然可以进一步对这个消息体进行序列化操作。
  • 附加消息:用来表述这条消息,比如目标交换器的名称、路由键和一些自定义属性等等。

Broker:消息中间件的服务节点。对于RabbitMQ来说,一个Broker可以简单地看做一个RabbitMQ服务节点,或者RabbitMQ服务实例,也可以将Broker看作一台RabbitMQ服务器。

Virtual Host :虚拟主机,表示交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质上就是mini版的RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限价值。vhost是AMQP概念的基础,必须在连接时指定,RabbitMQ默认的vhost是 /

Channel :频道或信道,是建立在Conection连接智商的一种轻量级的链接。大部分的操作是在Channel这个接口中完成的,包括定义队列的生命queueDeclare交换机的生命exchangeDeclare队列的绑定queueBind发布消息basicPublish消费消息basicConsume等。

如果把Connection比作一条光纤电缆的话,那么Channel信道就比作成光纤电缆中的其中一束光纤。一个Connection上可以创建任意数量的Channel。

RoutingKey :路由键。生产者将 消息发给交换器的时候,一般会指定一个RoutingKey,用来制定这个消息的路由规则。RoutingKey需要与交换器类型绑定键(Binding Key)联合使用。在交换器类型和绑定键(BindingKey)固定的情况下,生产者可以在发送消息给交换器时,通过自定RoutingKey来决定消息流向哪里。

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

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

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

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

整体运转流程如下:

生产者发送消息的过程如下:

  1. 生产者连接到RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel)。
  2. 生产者声明一个交换器,并设置相关属性,比如交换机类型、是否持久化等。
  3. 生产者声明一个队列并设置相关属性,比如是否排它、是否持久化、是否自动删除。
  4. 生产者通过路由键讲交换器和队列绑定起来。
  5. 生产者发送消息至RabbitMQ Broker,其中包含路由键、交换器等信息。
  6. 相应的交换器根据接收到的路由键查找相匹配的队列。
  7. 如果找到,则将从生产者发送过来的消息存入相应的队列中。
  8. 如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者。
  9. 关闭信道、关闭连接。

二、Exchange类型

RabbitMQ常用的交换器类型有fanout、direct、topic、headers这4种。

  • fanout :扇形交换机,它会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。

  • direct :直连交换机,它会把消息路由到那些BindingKeyRoutingKey完全匹配的队列中。

  • topic :主题交换机,与direct类似,但它可以通过通配符进行模糊匹配,*.代表匹配一个字符,#代表匹配多个字符。

  • headers :头交换机,不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。 但headers类型的交换器性能很差,而且也不实用。


三、RabbitMQ概念模型总结

下面让我们用一幅图来总结一下RabbitMQ中的概念模型,所有RabbitMQ对象以虚拟主机区分,如下:

上面我们介绍了4种交换机,Fanout交换机Direct交换机Topic交换机Headers交换机,其实还有一种是默认交换机。发送消息时如果只指定了交换机而没有指定队列,那么消息会通过默认交换机直接转发到指定的队列中,比如上图中的消息1

消息2和消息3发送到了exchange-2上,该交换机类型为Direct,因此消息2会通过路由key order发送到queue-3上,而消息3会通过路由key sms发送到queue-4上。

消息4发送到了exchange-3上,该交换机类型为Topic,路由key为com.order.create,同时满足通配符com.#*.order.*,因此消息4会发送到queue-5queue-6上。

消息5发送到了exchange-4上,该交换机类型为Headers,header信息为x=1,满足匹配条件,因此消息5会发送到queue-7上。

相关推荐
茶杯梦轩19 小时前
从零起步学习RabbitMQ || 第三章:RabbitMQ的生产者、Broker、消费者如何保证消息不丢失(可靠性)详解
分布式·后端·面试
回家路上绕了弯2 天前
深入解析Agent Subagent架构:原理、协同逻辑与实战落地指南
分布式·后端
用户8307196840823 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
用户8307196840824 天前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者6 天前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者8 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧9 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖9 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农9 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者9 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端