RabbitMQ概念与管理端配置说明

环境信息

操作系统:Windows 10

RabbitMQ 版本:4.1.1

安装教程

一.RabbitMQ概念说明

RabbitMQ 是一个基于 AMQP(Advanced Message Queuing Protocol,高级消息队列协议) 的开源消息中间件,最初由 LShift 公司开发,后由 VMware 收购并维护。它采用 Erlang 编写,以其高可靠性、灵活性和可扩展性著称。RabbitMQ 通过消息队列实现分布式系统中的异步通信、削峰解耦和负载均衡。下面是其消息传递架构图,说明了RabbitMQ的一些核心组件以及交互流程。

消息传递架构图

  • Producer:消息的发布者;
  • Consumer:消息的订阅者;
  • Broker:RabbitMQ的实例,只有一个;
  • Connection:与Broker之间的TCP连接;
  • Channel:是基于 Connection 创建的轻量级逻辑通道,用于操作某个Vhost下的资源;
  • Vhost:虚拟主机,逻辑隔离单元,一个Broker可以有多个Vhost;
  • Exchange:交换机,可以理解为路由规则。有多种不同的交换机,区别在于路由规则的不同;
  • Binding:Exchange和Queue之间的映射规则,确定哪些Queue接收待交换机的信息。
  • Queue:消息对接

二.RabbitMQ的配置

通过上面的消息传递架构图,可以清除的看到RabbitMQ的各个组件,那么这些组件如何创建和配置呢?

2.1Connection

由客户端创建(如Java),下面是管理端的详解。下面这张图,显示的是连接RabbitMQ的Connection.

下面每个字段的解释:

|---------------------|---------------------------------------------|
| 字段 | 含义 |
| Overview(概览) ||
| Virtual host | 连接所属的虚拟主机(Vhost)。/ 表示默认 Vhost。 |
| Name | 连接的名称,通常为客户端连接的 IP 地址和端口(如 [: :1]:10372)。 |
| Container ID | 如果是 Docker 容器中的连接,这里会显示容器 ID;否则为空。 |
| User name | 使用该连接登录 RabbitMQ 的用户名(如 admin)。 |
| State | 连接的状态,running 表示活动状态。 |
| Details(详情) ||
| SSL / TLS | 是否使用 SSL/TLS 加密连接。绿色圆圈表示启用,灰色圆圈表示未启用。 |
| SSL Details | 如果启用了 SSL/TLS,这里会显示具体的 SSL 证书信息;否则为空。 |
| Protocol | 客户端使用的协议类型及版本(如 AMQP 0-9-1)。 |
| Channels | 当前连接上打开的 Channel 数量(如 1)。 |
| Channel max | 该连接允许的最大 Channel 数量(如 2047)。 |
| Frame max | 每个帧(frame)允许的最大字节数(如 131072)。 |
| SASL auth mechanism | 使用的 SASL 认证机制(如 PLAIN)。 |
| Network(网络) ||
| Client | 客户端的类型和版本(如 RabbitMQ / Java 5.25.0)。 |
| From client | 从客户端到服务器的当前网络传输速率(如 2 B/s)。 |
| To client | 从服务器到客户端的当前网络传输速率(如 2 B/s)。 |
| Heartbeat | 心跳间隔时间(单位:秒),用于检测连接是否活跃(如 60s)。 |
| Connected at | 连接建立的时间(如 09:31:20 2025-07-10)。 |

2.1Channel

在客户端连接Rabbit MQ时创建。下面这张图,显示的是连接打开的Channel。

下面每个字段的解释:

2.3Producer

java 复制代码
public static void main(String[] args) throws IOException, TimeoutException {
        // 1. 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");  // RabbitMQ 地址
        factory.setPort(5672);        // 默认端口
        factory.setUsername("guest"); // 默认用户名
        factory.setPassword("guest"); // 默认密码
        factory.setVirtualHost("/");  // 默认虚拟主机

        // 2. 建立连接和通道
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            // 3. 声明队列(如果已存在则不会重复创建)
            /**
             * 参数说明:
             * 1. 队列名称
             * 2. 是否持久化
             * 3. 是否独占队列
             * 4. 是否自动删除
             * 5. 额外的参数
             */
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);

            // 4. 发送消息
            String message = "Hello from plain Java!";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");
        }
    }

2.4Consumer

java 复制代码
 public static void main(String[] args) throws Exception {
        // 1. 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");

        // 2. 建立连接和通道
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3. 声明队列(确保队列存在)
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        // 4. 创建消费者对象
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] Received '" + message + "'");
        };

        // 5. 订阅队列
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
    }

2.5Vhost

2.5.1管理界面创建

创建成功

字段说明:

  • Name:为新的 Vhost 指定一个唯一的名称;
  • Description:提供 Vhost 的描述信息,用于说明该 Vhost 的用途或相关细节。
  • Tags:为 Vhost 添加标签,便于管理和分类。
  • Default Queue Type:选择该 Vhost 中创建队列时的默认队列类型。
    • Classic(经典队列):传统的、广泛使用的队列类型,适用于大多数场景。
    • Quorum(仲裁队列):提供更强的一致性和容错能力,适用于需要高可用性的场景。
    • Stream(流队列):这是一种针对大数据流设计的队列类型,适用于处理大量连续的数据流。
  • Overview:提供 Vhost 的基本信息和状态概览。
    • Name(名称):Vhost 的名称。
    • Users(用户):可以访问该 Vhost 的用户列表。
    • State(状态):Vhost 的当前运行状态(如 running 表示正在运行)。
  • Messages: 显示与该 Vhost 相关的消息统计信息。
    • Ready:队列中已准备好被消费的消息数量。
    • Unacked:已被消费者获取但尚未确认的消息数量。
    • Total:队列中的总消息数量(包括 Ready 和 Unacked)。
  • Network:展示与该 Vhost 相关的网络流量情况。
    • From client:从客户端到 RabbitMQ 的数据传输速率(单位:字节/秒)。
    • To client:从 RabbitMQ 到客户端的数据传输速率(单位:字节/秒)。
  • Message rates:显示与该 Vhost 相关的消息发布和交付速率。
    • publish:每秒发布的消息数量。
    • deliver / get:每秒交付或获取的消息数量。

2.5.2命令行创建

Haskell 复制代码
D:\cmd>rabbitmqctl add_vhost /dev
Adding vhost "/dev" ...

D:\cmd>rabbitmqctl list_vhosts
Listing vhosts ...
name
/
/dev

D:\cmd>

2.6Exchange

在创建Vhost的时候,默认会创建7个Exchange。通常不需要手动创建Exchange,默认的Exchange就包含了所有的类型。

2.6.1管理页面创建

  • Virtual host(虚拟主机):表示该交换机所属的虚拟主机(Vhost)。
  • Name(名称):交换机的名称。
  • Type(类型):交换机的类型,决定了消息如何路由到队列。
    • direct:完全匹配键名进行路由。
    • fanout:广播模式,将消息发送给所有绑定的队列。
    • topic:基于通配符匹配进行路由。
    • headers:基于消息头属性进行路由。
  • Durability(持久性):设置交换机是否持久化。
    • Durable:持久化,服务器重启后交换机依然存在。
    • Transient:非持久化,服务器重启后交换机会被删除。
  • Auto delete(自动删除):设置当所有队列与该交换机解绑时,是否自动删除该交换机。
    • Yes:自动删除。
    • No:不自动删除。
  • Internal(内部):设置该交换机是否为内部交换机。
    • Yes:内部交换机,只能通过其他交换机进行路由。
    • No:普通交换机,可以直接发布消息。
  • Arguments(参数):设置交换机的额外参数。
  • Alternate exchange(备用交换机):当消息无法根据当前交换机规则路由到任何队列时,可以将其转发到指定的备用交换机进行处理。

已有交换机列表

  • Features(特性):交换机支持的特性。
    • D:表示该交换机是持久化的(Durable),即在服务器重启后仍然存在。
    • I:表示该交换机是内部的(Internal),只能通过其他交换机进行路由,不能直接发布消息。
  • Message rate in(消息输入速率):单位时间内进入该交换机的消息数量。
  • Message rate out(消息输出速率):单位时间内从该交换机路由到队列的消息数量。

2.6.2.命令行创建

通过命令行创建Exchange,需要 rabbitmqadmin.exe插件,RabbitMQ默认不带这个插件,通过http://localhost:15672/cli/rabbitmqadmin下载,是的,通过本地安装的RabbitMQ服务下载,所以要保证它在运行,windows系统会下载rabbitmqadmin.exe,放入sbin文件夹下即可,linux或macOS会下载rabbitmqadmin(是一个python文件)。也有识别出现问题的时候,比如我,在windwos系统下载了个python文件,当然也可以把它打包成exe,或者别的地方下载。但我不想弄了,有机会再说。

2.7Binding

在创建新的Vhost后,RabbitMQ默认生成了7个Exchange,除了(AMQP default),其他都要配置Binding(如果使用的话)。(AMQP default)默认Binding当前Vhost的所有消息队列。配置Binding的步骤如下:

下面是添加binding的页面以及一些介绍

  • To queue: 将当前Exchange绑定到一个Queue,输入Queue的名称
  • To Exchange: 将当前交换机绑定到另一个交换机
  • Routing key:设置 路由键,不是必填项,但通常需要根据交换机类型来设置。

|---------|------------------------------|
| 类型 | 用法 |
| direct | 完全匹配,必须提供且唯一 |
| fanout | 忽略,可以留空(广播模式) |
| topic | 支持通配符(如 *.created、order.*) |
| headers | 可以留空,具体匹配规则在 Arguments 中定义 |
[不同类型交换机的Routing Key 使用]

  • Arguments:设置绑定时的 额外参数(Arguments)
  • String(下拉框):选择 Arguments 中值的 数据类型。

2.8Queue

与Exchange不同,Queue需要手动创建,下面是创建Queue的一些说明

  • Add a new queue:
    • Virtual host:选择要创建 Queue 的 虚拟主机(Vhost)
    • Type:选择 Queue 的 类型。
    • Name:输入 Queue 的 名称,可以自定义,但需符合 RabbitMQ 的命名规范(通常为小写字母、数字和特殊字符 -_.)。
    • Durability:设置 Queue 的 持久化属性。
      • Durable(持久化):服务器重启后 Queue 依然存在;
      • Transient(非持久化):服务器重启后 Queue 会被删除。
    • Arguments:设置 Queue 的 额外参数(Arguments)

|---------------------------|----------------|---------------------------------------|
| 参数名 | 用途 | 示例 |
| x-expires | 队列自动删除时间(毫秒) | x-expires = 60000(1分钟后删除) |
| x-message-ttl | 队列中消息的过期时间(毫秒) | x-message-ttl = 3600000(1小时后过期) |
| x-dead-letter-exchange | 死信交换机名称 | x-dead-letter-exchange = dlx.exchange |
| x-dead-letter-routing-key | 死信路由键 | x-dead-letter-routing-key = dlx.key |
| x-max-length | 队列最大长度(消息数) | x-max-length = 1000(最多 1000 条消息) |
[常见Arguments示例]

  • 其他可选配置项
    • Auto expire:设置队列的自动过期时间(毫秒),如果队列在指定时间内没有被使用(即没有任何消费者连接),则自动删除。
    • Message TTL:设置队列中消息的过期时间(毫秒),超过这个时间的消息会被自动丢弃或转移到死信队列(如果有配置)。
    • Overflow behaviour:设置队列溢出时的行为。
      • drop-head:丢弃队首消息;
      • reject-publish:拒绝发布新消息(返回给生产者);
      • reject-publish-dlx:拒绝发布新消息并发送到死信队列(如果有配置)。
    • Single active consumer:启用单活动消费者模式。在同一时刻,只有一个消费者可以消费队列中的消息,其他消费者处于等待状态。
    • Dead letter exchange / routing key:设置死信交换机及其路由键。当消息过期、被拒绝或队列达到最大长度时,将消息转发到指定的死信交换机进行进一步处理。
    • Max length / Max length bytes:设置队列的最大长度(消息数)或最大字节数。限制队列的大小,防止无限增长。
    • Leader locator:仅对 Quorum 队列有效,设置 Leader 节点的选择策略。
      • client-local:优先选择本地节点作为 Leader;
      • least-index:选择索引最小的节点作为 Leader

上面这些可配置选项,就是添加参数,点击后会自动创建一个Arguments行,值需手动填写。

相关推荐
独自破碎E4 小时前
RabbitMQ中的Prefetch参数
分布式·rabbitmq
爱琴孩6 小时前
RabbitMQ 消息消费模式深度解析
rabbitmq·消息重复消费
利刃大大8 小时前
【RabbitMQ】Simple模式 && 工作队列 && 发布/订阅模式 && 路由模式 && 通配符模式 && RPC模式 && 发布确认机制
rpc·消息队列·rabbitmq·队列
J_liaty1 天前
RabbitMQ面试题终极指南
开发语言·后端·面试·rabbitmq
maozexijr1 天前
RabbitMQ Exchange Headers类型存在的意义?
分布式·rabbitmq
独自破碎E1 天前
RabbitMQ的消息确认机制是怎么工作的?
分布式·rabbitmq
maozexijr1 天前
注解实现rabbitmq消费者和生产者
分布式·rabbitmq
Java 码农2 天前
RabbitMQ集群部署方案及配置指南09
分布式·rabbitmq
论迹2 天前
RabbitMQ
分布式·rabbitmq
Java 码农2 天前
RabbitMQ集群部署方案及配置指南08--电商业务延迟队列定制化方案
大数据·分布式·rabbitmq