一、消息队列简介


1. 主流的消息队列

  在现代分布式系统和微服务架构中,消息队列是不可或缺的组件。消息队列可以在不同的系统组件之间传递数据和消息,解耦组件,缓冲突发流量,并提高系统的可扩展性和可靠性。以下是几种主流的消息队列,它们各自具有独特的特点和优势:


  • ActiveMQ: ActiveMQ 是由 Apache 基金会开发的开源消息代理,基于 Java 实现。它支持多种消息传递协议,如 JMS、AMQP、STOMP、MQTT 等,具有较高的灵活性。ActiveMQ 提供了丰富的功能,包括持久化消息、事务支持、负载均衡和高可用性等。然而,ActiveMQ 的性能相对较差,在高并发和大规模消息传递场景下可能会遇到瓶颈。此外,ActiveMQ 的社区活跃度和版本更新速度也相对较慢。
  • RocketMQ: RocketMQ 是阿里巴巴开发的开源分布式消息中间件,基于 Java 实现。RocketMQ 设计用于高性能和高可靠性场景,支持顺序消息、延时消息和批量消息等功能。它具有良好的扩展性,可以轻松应对海量消息传递需求。RocketMQ 社区活跃度较高,文档和支持也较为完善,但它的接口设计未遵循标准的 JMS 规范,迁移和集成成本较高。此外,由于 RocketMQ 是阿里巴巴的技术输出,用户需要考虑其社区和生态的长期稳定性。
  • Kafka: Kafka 是由 LinkedIn 开发并捐赠给 Apache 基金会的分布式流处理平台,基于 Scala 和 Java 实现。Kafka 以其高吞吐量、低延迟和高可用性著称,适用于处理海量实时数据的场景,如日志收集、事件追踪和大数据实时计算等。Kafka 使用分区和副本机制,实现了高可用性和数据冗余,保证了系统的稳定性。尽管 Kafka 可能会出现消息重复消费的问题,但其在大数据领域的广泛应用证明了其强大的性能和可靠性。
  • RabbitMQ: RabbitMQ 是基于 Erlang 实现的开源消息代理,支持 AMQP(高级消息队列协议)等多种协议。RabbitMQ 以其灵活性、易用性和强大的并发处理能力而闻名,适用于中小规模的消息传递需求。RabbitMQ 提供了丰富的功能,如路由、负载均衡、消息持久化和高可用性集群等。然而,由于 Erlang 在国内的普及率较低,RabbitMQ 的维护和二次开发可能会遇到一定的挑战。
  • ZeroMQ: ZeroMQ 是一个高性能的异步消息库,而非完整的消息代理。它在套接字基础上提供了类似于消息代理的功能,如发布/订阅、请求/响应和管道等。ZeroMQ 适用于需要低延迟和高吞吐量的场景,但不提供消息持久化和高级路由等功能。使用 ZeroMQ 需要对业务代码进行较多改造,因此不适用于希望快速集成的项目。


2. 各种消息队列的对比

不同消息队列在设计理念、实现方式和适用场景上各有不同,选择合适的消息队列需要综合考虑以下因素:

  • RabbitMQ vs Kafka vs ZeroMQ
  • RabbitMQ:RabbitMQ 是一个功能丰富的消息代理,支持复杂的路由和多种协议。适用于需要灵活配置和较高并发处理能力的中小规模应用。
  • Kafka:Kafka 设计用于高吞吐量和低延迟的场景,尤其适合大数据和实时流处理。它在处理海量数据时表现优异,但在少量 topic 的情况下效率较低。
  • ZeroMQ:ZeroMQ 提供轻量级的消息传递机制,适合需要极低延迟和高吞吐量的应用,但不提供持久化和高级路由等功能。
  • 协议支持和依赖
  • RabbitMQ 支持多种消息传递协议,如 AMQP、STOMP 和 MQTT,具有较高的灵活性。
  • Kafka 使用自己的专有协议,与 Zookeeper 紧密结合,实现了强大的分布式协调功能。
  • ZeroMQ 是一个异步消息库,不支持传统的消息代理协议,需要自行实现消息传递逻辑。
  • 性能和扩展性
  • RabbitMQ 在处理大量消息堆积时性能可能下降,适用于中小规模应用。
  • Kafka 设计用于处理海量数据,具有极高的扩展性和可靠性。
  • ZeroMQ 提供极高的性能和吞吐量,但不适用于需要复杂消息管理和持久化的场景。


3. 消息队列中的角色和名词

了解消息队列中的基本角色和术语有助于我们更好地设计和使用它们:

  • Broker:消息服务器,负责接收、存储和分发消息。Broker 是消息队列的核心组件,它确保消息的可靠传递和处理。
  • Producer:消息生产者,负责发送消息到 Broker。Producer 是消息的来源,通常是业务系统中的数据生成模块。
  • Consumer:消息消费者,负责从 Broker 获取消息并进行处理。Consumer 是消息的接收方,通常是业务系统中的数据处理模块。
  • Topic:主题,发布/订阅模式下的消息汇集地。Producer 将消息发送到 Topic,多个 Consumer 可以订阅同一个 Topic 并接收消息,实现消息的广播。
  • Queue:队列,点对点模式下的消息存储地。Producer 将消息发送到 Queue,特定的 Consumer 从 Queue 接收消息,实现消息的点对点传递。
  • Message:消息体,是通过消息队列传输的基本单元。Message 包含实际的业务数据,通常由消息头和消息体组成。


4. 消息队列的工作模式

消息队列主要有两种工作模式:点对点(Point-to-Point)和发布/订阅(Pub/Sub):

  • 点对点模式:在点对点模式下,每条消息有且只有一个消费者会处理。消息被发送到队列中,多个消费者可以并发消费,但每条消息只能被一个消费者处理。典型应用包括任务处理系统,每个任务由一个处理器处理。点对点模式确保了消息的唯一处理和可靠传递,但需要设计合理的消息确认和重试机制,以避免消息丢失或重复处理。
  • 发布/订阅模式:在发布/订阅模式下,消息发布到一个主题中,所有订阅该主题的消费者都会收到消息。发布/订阅模式适用于广播消息的场景,如新闻发布系统。发布者(Producer)将消息发送到 Topic,多个订阅者(Consumer)订阅同一个 Topic 并接收消息。发布/订阅模式具有较高的灵活性和扩展性,但需要处理好消息的重复消费和顺序问题。


5. 消息队列的缺点

尽管消息队列有许多优点,但它们也有一些缺点需要注意:

  • 系统可用性降低:消息队列作为中间件引入后,如果它出现故障,可能会影响整个系统的正常运行。因此,需要设计高可用的消息队列集群,并实现故障转移和自动恢复机制,以保证系统的稳定性。
  • 系统复杂性提高:消息队列的引入增加了系统的复杂性,开发者需要处理消息重复消费、消息丢失和消息顺序等问题。例如,在分布式系统中,可能需要设计分布式事务或最终一致性机制,以保证数据的一致性和可靠性。
  • 数据一致性无法保证:在高可用性的需求下,保证数据的一致性变得更加困难。消息如果没有正确写入到消息队列里,或者读取消息的服务没有正确读取到消息,都会影响到数据的一致性。开发者需要设计合理的重试机制和补偿机制,以应对消息丢失或处理失败的情况。

  通过了解这些基本概念和不同消息队列的特点,可以帮助开发者在实际项目中选择合适的消息队列,并设计高效、可靠的消息传递机制。同时,开发者还需要结合具体的业务需求和技术栈,进行合理的架构设计和优化,以最大化消息队列的优势,降低其带来的复杂性和风险。


二、RabbitMQ 介绍

1. RabbitMQ 的基本概念

  RabbitMQ 是一个开源的消息代理软件,基于 AMQP(高级消息队列协议)构建,由 Pivotal 软件公司开发,现归属 VMware 所有。RabbitMQ 使用 Erlang 编写,以其高并发处理能力和可靠性著称。它广泛应用于企业级应用中,帮助系统实现异步通信和解耦。


2. RabbitMQ 的架构和组件

RabbitMQ 的架构由多个核心组件组成,了解这些组件有助于我们更好地理解和使用 RabbitMQ:

  • Producer:消息生产者,负责将消息发送到 RabbitMQ。生产者可以是任何能够发送消息的应用程序或服务。
  • Exchange:交换器,负责接收生产者发送的消息并根据绑定规则将消息路由到一个或多个队列。Exchange 有四种类型:direct、topic、fanout 和 headers。
  • Direct Exchange:根据完全匹配的路由键将消息路由到相应的队列。
  • Topic Exchange:根据模式匹配的路由键将消息路由到相应的队列,适用于复杂的路由需求。
  • Fanout Exchange:将接收到的消息广播到所有绑定的队列,不考虑路由键,适用于广播消息的场景。
  • Headers Exchange:根据消息头属性进行路由,灵活性较高,但使用相对较少。
  • Queue:队列,用于存储消息,直到它们被消费者消费。队列是 RabbitMQ 中的核心组件,支持消息持久化、优先级队列和延迟队列等功能。
  • Binding:绑定,用于将 Exchange 和 Queue 关联起来。绑定定义了消息从 Exchange 到 Queue 的路由规则。
  • Consumer:消息消费者,负责从队列中获取消息并进行处理。消费者可以是任何能够接收和处理消息的应用程序或服务。
  • Connection:连接,是应用程序与 RabbitMQ 服务器之间的物理 TCP 连接。一个连接可以有多个 Channel。
  • Channel:信道,是建立在连接之上的虚拟连接。Channel 用于执行 AMQP 命令,避免了频繁创建和销毁 TCP 连接的开销。


3. RabbitMQ 的工作机制

RabbitMQ 的工作机制涉及消息的生产、路由和消费,以下是其基本流程:

  1. 消息生产:生产者创建消息并通过一个 Exchange 发送到 RabbitMQ 服务器。生产者需要指定 Exchange 和路由键,以确定消息的目的地。
  2. 消息路由:Exchange 根据绑定规则将消息路由到一个或多个队列。不同类型的 Exchange 具有不同的路由策略,确保消息能够按照预期的方式传递到相应的队列。
  3. 消息存储:消息到达队列后,RabbitMQ 会根据队列的配置决定是否持久化消息。持久化消息存储在磁盘上,确保即使 RabbitMQ 服务器重启也不会丢失。
  4. 消息消费:消费者从队列中获取消息并进行处理。消费者可以手动或自动确认消息的处理状态,确保消息不会重复消费或丢失。


4. RabbitMQ 的优点

RabbitMQ 作为一个成熟的消息代理,具有以下优点:

  • 高并发处理能力:RabbitMQ 使用 Erlang 语言编写,天生具有高并发处理能力,能够在高并发场景下保持稳定性能。
  • 多协议支持:RabbitMQ 支持 AMQP、STOMP、MQTT 和 HTTP 等多种消息传递协议,灵活性高,适用于不同的应用场景。
  • 丰富的功能:RabbitMQ 提供消息持久化、优先级队列、延迟队列、死信队列和消息确认等丰富的功能,满足复杂业务需求。
  • 集群和高可用性:RabbitMQ 支持集群部署和镜像队列,能够实现高可用性和数据冗余,保证系统的稳定性和可靠性。
  • 灵活的路由机制:通过 Exchange 和 Binding 的组合,RabbitMQ 能够实现复杂的消息路由策略,适应各种业务需求。
  • 强大的管理和监控:RabbitMQ 提供了易于使用的管理界面和丰富的监控指标,方便运维人员管理和监控消息队列的运行状态。


5. RabbitMQ 的缺点

尽管 RabbitMQ 有许多优点,但也存在一些缺点:

  • Erlang 语言的维护难度:由于 RabbitMQ 使用 Erlang 语言编写,国内开发人员对 Erlang 的熟悉度相对较低,这可能增加维护和二次开发的难度。
  • 性能瓶颈:在处理极高并发和大规模消息传递时,RabbitMQ 的性能可能会出现瓶颈,需要进行优化和调优。
  • 资源占用:RabbitMQ 的内存和磁盘资源占用较高,尤其在消息堆积较多时,需要合理配置服务器资源以保证系统的稳定运行。


6. RabbitMQ 的应用场景

RabbitMQ 广泛应用于各种场景中,以下是一些典型的应用场景:

  • 异步处理:在 Web 应用中,使用 RabbitMQ 将耗时的任务(如图像处理、视频转码)异步化,提高系统响应速度和用户体验。
  • 任务队列:将任务放入 RabbitMQ 队列,由多个消费者并发处理,提高任务处理效率和系统吞吐量。
  • 消息广播:通过 Fanout Exchange 实现消息广播,适用于发布订阅模式的应用,如通知系统和日志收集。
  • 工作流引擎:使用 RabbitMQ 管理复杂工作流中的任务和状态转换,确保任务按顺序执行和状态一致。
  • 微服务通信:在微服务架构中,使用 RabbitMQ 实现服务间的异步通信和解耦,降低服务间的依赖和耦合度。


7. RabbitMQ 的详细组件解析

为了更好地理解 RabbitMQ 的内部工作机制和应用,我们需要深入解析其各个组件。

  • Exchange
  • Direct Exchange:这种类型的交换器将消息路由到与路由键完全匹配的队列。例如,如果一个消息的路由键是 "order_created",那么它会被路由到绑定了路由键 "order_created" 的队列。Direct Exchange 适用于明确的、一对一的消息传递场景。
  • Topic Exchange:通过模式匹配的方式将消息路由到队列。路由键可以包含通配符(* 和 #),其中 * 匹配一个单词,# 匹配零个或多个单词。例如,路由键 "order.*" 可以匹配 "order.created" 和 "order.deleted"。Topic Exchange 适用于复杂的路由需求,如根据消息内容动态路由。
  • Fanout Exchange:忽略路由键,将消息广播到所有绑定的队列。这种交换器适用于广播消息的场景,例如发布系统通知或日志信息。
  • Headers Exchange:根据消息头的属性进行路由,而不是路由键。这种方式提供了更高的灵活性,可以根据多个属性组合进行路由,但在实际使用中相对较少。
  • Queue
  • 普通队列:用于存储和传递消息,支持 FIFO(先进先出)顺序。
  • 持久化队列:将消息存储在磁盘上,以确保即使 RabbitMQ 服务器重启也不会丢失消息。适用于对数据一致性和可靠性要求较高的场景。
  • 优先级队列:根据消息的优先级进行处理,高优先级的消息会被优先消费。适用于需要区分处理紧急和普通任务的场景。
  • 延迟队列:允许消息在队列中延迟一定时间后再进行消费。适用于定时任务和延迟执行的场景。
  • 死信队列:用于存储处理失败或无法投递的消息,便于后续分析和处理。适用于需要对异常情况进行监控和处理的场景。
  • Connection 和 Channel
  • Connection:客户端与 RabbitMQ 服务器之间的物理 TCP 连接。创建和销毁连接的开销较大,通常一个应用程序只需要一个连接。
  • Channel:建立在连接之上的虚拟连接,是进行 AMQP 操作的基本单元。Channel 的创建和销毁开销较小,可以在一个连接上创建多个 Channel,以便并发执行消息操作。


8. RabbitMQ 的高级特性

RabbitMQ 提供了一系列高级特性,帮助开发者应对复杂的消息传递需求:

  • 消息确认机制
  • Producer Confirm:生产者发送消息后,可以等待 RabbitMQ 服务器的确认,以确保消息已经成功到达交换器并被路由到队列。这个机制帮助生产者处理消息传递的可靠性问题。
  • Consumer Acknowledge:消费者在处理完消息后,需要发送确认消息给 RabbitMQ 服务器,以表明消息已被成功处理。这个机制可以防止消息丢失和重复消费。
  • 消息持久化
  • 队列持久化:通过将队列声明为持久化(durable),确保队列在服务器重启后依然存在。
  • 消息持久化:将消息标记为持久化(persistent),确保消息在服务器重启后不会丢失。消息持久化会增加一些性能开销,但对于关键数据来说是必要的。
  • 镜像队列
  • 镜像队列:将队列的副本存储在多个节点上,实现高可用性。当主节点发生故障时,RabbitMQ 会自动切换到副本节点,确保队列的可用性和数据的完整性。适用于对高可用性要求较高的场景。
  • 流量控制
  • QoS(Quality of Service):通过设置 prefetch 参数,限制消费者一次性获取的消息数量,防止消息过载导致的性能问题。QoS 可以有效地控制消息流量,确保系统的稳定运行。
  • 流量限制:RabbitMQ 提供了流量限制功能,可以对连接、信道和队列进行流量限制,防止突发流量导致的系统崩溃。


9. RabbitMQ 的集群和高可用性

RabbitMQ 支持集群和高可用性配置,以满足大规模分布式系统的需求:

  • 集群模式
  • 普通集群:将多个 RabbitMQ 节点组成集群,实现负载均衡和高可用性。普通集群模式下,各节点共享元数据,但队列和消息存储在单个节点上。
  • 镜像队列集群:在普通集群的基础上,使用镜像队列将队列和消息复制到多个节点,增强数据冗余和系统可靠性。
  • 高可用性配置
  • HAProxy 和 Keepalived:使用 HAProxy 和 Keepalived 实现负载均衡和故障转移,提高 RabbitMQ 集群的可用性。
  • 自动故障转移:通过配置 RabbitMQ 的自动故障转移机制,当节点发生故障时,自动切换到备份节点,确保系统的连续性。


10. RabbitMQ 的监控和管理

RabbitMQ 提供了多种监控和管理工具,帮助运维人员监控系统状态和优化性能:

  • RabbitMQ Management Plugin:提供了基于 Web 的管理界面,可以方便地查看队列、交换器、绑定、连接和信道的状态,以及进行基本的管理操作。
  • Prometheus 和 Grafana:通过集成 Prometheus 和 Grafana,可以实现对 RabbitMQ 的实时监控和告警,帮助运维人员及时发现和解决问题。
  • 日志和指标:RabbitMQ 提供了丰富的日志和指标,帮助运维人员分析系统性能和排查故障。可以通过配置 logrotate 等工具对日志进行管理,防止日志占用过多磁盘空间。


三、CentOS 7 下安装 RabbitMQ(单机)

  在 CentOS 7 下安装 RabbitMQ 是一个相对简单的过程,但每个步骤和命令都需要严格执行,以确保安装和配置的正确性。下面是详细的步骤和每个命令的解释。


1. 环境准备

首先,确保你的系统是最新的。使用以下命令更新系统:

sudo yum update -y
  • 1.

这个命令会更新系统中所有已安装的软件包,确保你拥有最新的补丁和安全更新。


2. 安装 Erlang

RabbitMQ 依赖于 Erlang 运行时环境。因此,首先需要安装 Erlang。可以使用以下命令:

sudo yum install -y epel-release
sudo yum install -y erlang
  • 1.
  • 2.
  • sudo yum install -y epel-release:这个命令安装 EPEL(Extra Packages for Enterprise Linux)仓库,为 CentOS 提供额外的软件包。
  • sudo yum install -y erlang:安装 Erlang 运行时环境。


3. 添加 RabbitMQ 的官方或者阿里的Yum 仓库

为了确保安装的是最新版本的 RabbitMQ,需要添加 RabbitMQ 官方的 Yum 仓库或者阿里的Yum仓库:

rm -rf /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
  • 1.
  • 2.
  • 3.
  • 4.
4. 安装 RabbitMQ

使用以下命令安装 RabbitMQ:

sudo yum install -y rabbitmq-server
  • 1.
5. 启动和管理 RabbitMQ 服务

安装完成后,可以启动 RabbitMQ 服务,并配置其在系统启动时自动启动:

sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
  • 1.
  • 2.
6. 验证安装

验证 RabbitMQ 是否成功启动:

sudo systemctl status rabbitmq-server
  • 1.

sudo systemctl status rabbitmq-server:检查 RabbitMQ 服务的状态。如果服务正在运行,你应该会看到类似于“active (running)”的输出。


7. 配置防火墙

为了允许外部访问 RabbitMQ,需要配置防火墙以开放相应的端口:

sudo firewall-cmd --permanent --add-port=5672/tcp
sudo firewall-cmd --permanent --add-port=15672/tcp
sudo firewall-cmd --reload
  • 1.
  • 2.
  • 3.
  • sudo firewall-cmd --permanent --add-port=5672/tcp:开放 RabbitMQ 使用的主端口 5672。
  • sudo firewall-cmd --permanent --add-port=15672/tcp:开放 RabbitMQ 管理插件使用的端口 15672。
  • sudo firewall-cmd --reload:重新加载防火墙配置以应用新的规则。
8. 启用 RabbitMQ 管理插件

RabbitMQ 提供了一个 Web 管理界面,方便我们管理和监控 RabbitMQ。启用管理插件的命令如下:

sudo rabbitmq-plugins enable rabbitmq_management
  • 1.
  • sudo rabbitmq-plugins enable rabbitmq_management:启用 RabbitMQ 管理插件。

  启用插件后,可以通过访问 http://your_server_ip:15672 打开 RabbitMQ 管理界面。默认用户名和密码都是 guest


9. 创建管理员用户

为了安全起见,建议创建一个新的管理员用户并禁用默认的 guest 用户:

sudo rabbitmqctl add_user myadmin mypassword
sudo rabbitmqctl set_user_tags myadmin administrator
sudo rabbitmqctl set_permissions -p / myadmin ".*" ".*" ".*"
sudo rabbitmqctl delete_user guest
  • 1.
  • 2.
  • 3.
  • 4.
  • sudo rabbitmqctl add_user myadmin mypassword:创建一个名为 myadmin、密码为 mypassword 的新用户。
  • sudo rabbitmqctl set_user_tags myadmin administrator:将 myadmin 用户设置为管理员。
  • sudo rabbitmqctl set_permissions -p / myadmin ".*" ".*" ".*":赋予 myadmin 用户对所有资源的完全访问权限。
  • sudo rabbitmqctl delete_user guest:删除默认的 guest 用户。


四、CentOS 7 下安装 RabbitMQ(群集)

  在生产环境中,为了确保高可用性和负载均衡,通常会配置 RabbitMQ 群集。

1. 准备工作

确保每个节点的系统是最新的。

2. 安装 Erlang

每个节点都需要安装 Erlang。

3. 添加 RabbitMQ 的官方或者阿里的Yum 仓库

为了确保安装的是最新版本的 RabbitMQ,需要添加 RabbitMQ 官方的 Yum 仓库或者阿里的Yum仓库。

4. 安装 RabbitMQ

在每个节点上安装 RabbitMQ:

sudo yum install -y rabbitmq-server
  • 1.
5. 配置主机名解析

在每个节点的 /etc/hosts 文件中添加所有节点的 IP 地址和主机名,例如

192.168.1.1 rabbit1
192.168.1.2 rabbit2
192.168.1.3 rabbit3
  • 1.
  • 2.
  • 3.
6. 配置 Erlang Cookie

Erlang Cookie 用于节点之间的身份验证。每个节点的 Cookie 必须相同。首先,在一个节点上生成 Co

sudo rabbitmqctl stop_app
sudo rabbitmqctl reset
echo 'mysecretcookie' | sudo tee /var/lib/rabbitmq/.erlang.cookie
sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
sudo rabbitmqctl start_app
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

然后将生成的 Cookie 文件复制到其他节点:

scp /var/lib/rabbitmq/.erlang.cookie rabbit2:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie rabbit3:/var/lib/rabbitmq/
  • 1.
  • 2.

确保所有节点的 Cookie 文件权限和所有者正确

sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
  • 1.
  • 2.
7. 启动 RabbitMQ 服务

在所有节点上启动 RabbitMQ 服务:

sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
  • 1.
  • 2.
8. 建立群集

选择一个节点作为主节点(例如 rabbit1),在其他节点(例如 rabbit2 和 rabbit3)上执行以下命令,将它们加入群集:

sudo rabbitmqctl stop_app
sudo rabbitmqctl reset
sudo rabbitmqctl join_cluster rabbit@rabbit1
sudo rabbitmqctl start_app
  • 1.
  • 2.
  • 3.
  • 4.
  • sudo rabbitmqctl stop_app:停止 RabbitMQ 应用。
  • sudo rabbitmqctl reset:重置 RabbitMQ 节点状态。
  • sudo rabbitmqctl join_cluster rabbit@rabbit1:将当前节点加入到 rabbit1 节点的群集中。
  • sudo rabbitmqctl start_app:启动 RabbitMQ 应用。

在所有节点上执行完上述命令后,检查群集状态:

sudo rabbitmqctl cluster_status
  • 1.
9. 配置防火墙

在所有节点上开放相应的端口:

sudo firewall-cmd --permanent --add-port=4369/tcp
sudo firewall-cmd --permanent --add-port=25672/tcp
sudo firewall-cmd --permanent --add-port=5672/tcp
sudo firewall-cmd --permanent --add-port=15672/tcp
sudo firewall-cmd --reload
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
10. 配置高可用性策略

为了确保队列在群集中具有高可用性,需要配置策略来镜像队列。可以在任意一个节点上执行以下命令:

sudo rabbitmqctl set_policy ha-all ".*" '{"ha-mode":"all"}'
  • 1.

sudo rabbitmqctl set_policy ha-all ".*" '{"ha-mode":"all"}':设置名为 ha-all 的策略,匹配所有队列(.*),并将所有队列设置为镜像队列("ha-mode":"all")。

11. 验证群集配置

在任何一个节点上,使用以下命令查看群集状态:

sudo rabbitmqctl cluster_status
  • 1.

五、RabbitMQ 常用命令

在使用 RabbitMQ 的过程中,熟练掌握一些常用命令对于管理和维护 RabbitMQ 服务器至关重要。以下是常用命令的详细总结和解释。

1. 启动、停止和重启 RabbitMQ 服务
  • 启动 RabbitMQ 服务
sudo systemctl start rabbitmq-server
  • 1.
  • 启动 RabbitMQ 服务,使其开始运行并接受客户端连接和消息处理请求。
  • 停止 RabbitMQ 服务
sudo systemctl stop rabbitmq-server
  • 1.
  • 停止 RabbitMQ 服务,停止处理任何新的客户端连接和消息。
  • 重启 RabbitMQ 服务
sudo systemctl restart rabbitmq-server
  • 1.
  • 重启 RabbitMQ 服务,通常用于应用配置更改或解决运行中的问题。
  • 检查 RabbitMQ 服务状态
sudo systemctl status rabbitmq-server
  • 1.
  • 检查 RabbitMQ 服务的当前状态,确定其是否正在运行。
2. RabbitMQ 管理插件
  • 启用管理插件
sudo rabbitmq-plugins enable rabbitmq_management
  • 1.
  • 启用 RabbitMQ 管理插件,提供基于 Web 的管理界面,方便用户进行监控和管理。
  • 禁用管理插件
sudo rabbitmq-plugins disable rabbitmq_management
  • 1.
  • 禁用 RabbitMQ 管理插件。
3. 用户管理
  • 添加用户
sudo rabbitmqctl add_user username password
  • 1.
  • 创建一个新的 RabbitMQ 用户,username 为用户名,password 为用户密码。
  • 删除用户
sudo rabbitmqctl delete_user username
  • 1.
  • 删除指定的 RabbitMQ 用户。
  • 设置用户角色
sudo rabbitmqctl set_user_tags username tag
  • 1.
  • 为用户分配角色标签,例如 administrator 角色标签赋予用户管理权限。
  • 列出所有用户
sudo rabbitmqctl list_users
  • 1.
  • 列出当前 RabbitMQ 服务器上的所有用户。
4. 权限管理
  • 设置用户权限
sudo rabbitmqctl set_permissions -p vhost username ".*" ".*" ".*"
  • 1.
  • 为用户在指定虚拟主机(vhost)上设置权限,其中 ".*" 分别表示配置、写和读的权限范围。
  • 查看用户权限
sudo rabbitmqctl list_user_permissions username
  • 1.
  • 查看指定用户的所有权限。
  • 查看虚拟主机上的所有权限
sudo rabbitmqctl list_permissions -p vhost
  • 1.
  • 列出指定虚拟主机上的所有权限。
5. 队列和交换器管理
  • 列出所有队列
sudo rabbitmqctl list_queues
  • 1.
  • 列出当前 RabbitMQ 服务器上的所有队列。
  • 列出所有交换器
sudo rabbitmqctl list_exchanges
  • 1.
  • 列出当前 RabbitMQ 服务器上的所有交换器。
  • 列出所有绑定
sudo rabbitmqctl list_bindings
  • 1.
  • 列出当前 RabbitMQ 服务器上的所有绑定关系。
  • 查看队列信息
sudo rabbitmqctl list_queues name messages_ready messages_unacknowledged
  • 1.
  • 列出队列的名称、准备就绪的消息数和未确认的消息数。
6. 虚拟主机管理
  • 添加虚拟主机
sudo rabbitmqctl add_vhost vhost
  • 1.
  • 创建一个新的虚拟主机。
  • 删除虚拟主机
sudo rabbitmqctl delete_vhost vhost
  • 1.
  • 删除指定的虚拟主机。
  • 列出所有虚拟主机
sudo rabbitmqctl list_vhosts
  • 1.
  • 列出当前 RabbitMQ 服务器上的所有虚拟主机。
7. 群集管理
  • 查看群集状态
sudo rabbitmqctl cluster_status
  • 1.
  • 查看当前 RabbitMQ 群集的状态,包括所有节点的信息。
  • 加入群集
sudo rabbitmqctl join_cluster rabbit@hostname
  • 1.
  • 将当前节点加入到指定的 RabbitMQ 群集中。
  • 离开群集
sudo rabbitmqctl forget_cluster_node rabbit@hostname
  • 1.
  • 将指定节点从群集中移除。
8. 其他常用命令
  • 重置节点

sudo rabbitmqctl reset

sudo rabbitmqctl reset
  • 1.
  • 重置当前 RabbitMQ 节点,将其恢复到初始状态。这会删除所有数据和配置。
  • 停止应用
sudo rabbitmqctl stop_app
  • 1.
  • 停止 RabbitMQ 应用,但不停止 Erlang 虚拟机。
  • 启动应用
sudo rabbitmqctl start_app
  • 1.
  • 启动 RabbitMQ 应用。
  • 关闭 RabbitMQ
sudo rabbitmqctl shutdown
  • 1.

关闭 RabbitMQ 服务

  通过掌握这些常用命令,管理员可以有效地管理和维护 RabbitMQ 服务器,确保消息队列系统的稳定运行。每个命令都有其特定的用途和参数,根据实际需要选择合适的命令进行操作。