RabbitMQ快速上手

现在市场上主流的MQ有很多,比如 ActiveMQ、RabbitMQ、RocketMQ、Kafka、ZeroMQ 等。

RabbitMQ 是一个流行的开源消息代理,它实现了高级消息队列协议(AMQP)。它被广泛应用于分布式系统中,能够解耦应用程序、分布式任务和负载平衡。其有着非常丰富的特性和优势:高可靠性、路由灵活、集群扩张性高、高可用、支持多种协议、支持多种客户端和有着丰富的插件系统

RabbitMQ目前被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。

RabbitMQ 是一个流行的开源消息代理,它实现了高级消息队列协议(AMQP)。它被广泛应用于分布式系统中,能够解耦应用程序、分布式任务和负载平衡。下面是快速上手 RabbitMQ 的指南,包括安装、基本概念和基本操作。

1. 安装 RabbitMQ
在 Windows 上安装
  1. 下载和安装 Erlang
    • RabbitMQ 依赖于 Erlang,所以需要先安装 Erlang。
    • 按照安装向导完成安装。
  2. 下载和安装 RabbitMQ
    • 下载地址:RabbitMQ 下载
    • 下载完成后,运行安装程序并按照提示完成安装。
在 Ubuntu 上安装
bash 复制代码
# 更新软件包列表
sudo apt-get update

# 安装 Erlang
sudo apt-get install -y erlang

# 安装 RabbitMQ
sudo apt-get install -y rabbitmq-server

# 启动 RabbitMQ 服务
sudo systemctl start rabbitmq-server

# 设置 RabbitMQ 服务开机自启动
sudo systemctl enable rabbitmq-server
2. 基本概念
  • Producer(生产者):发送消息的程序。
  • Consumer(消费者):接收消息的程序。
  • Queue(队列):存储消息的缓冲区。
  • Exchange(交换器):接收消息并将它们路由到队列。
  • Binding(绑定):交换器和队列之间的链接。
  • Routing Key(路由键):用于交换器将消息路由到特定队列的键。
3. 管理 RabbitMQ

RabbitMQ 提供了一个基于 Web 的管理插件,可以方便地管理和监控 RabbitMQ 服务器。

bash 复制代码
# 启用管理插件
sudo rabbitmq-plugins enable rabbitmq_management

# 访问管理界面
# 在浏览器中访问:http://localhost:15672/
# 默认用户名和密码都是 guest
4.使用场景
1. 异步处理

使用场景:当一个任务需要较长时间处理时,将任务放入队列,异步处理,避免阻塞主线程。

示例:订单处理系统中,用户提交订单后,将订单信息放入队列,后台异步处理订单。

复制代码
Client -> [Order Service] -> [RabbitMQ Queue] -> [Order Processing Service]
2. 任务队列

使用场景:将任务分发给多个消费者,实现负载均衡和并行处理。

示例:图像处理系统中,用户上传图片后,将图片处理任务放入队列,多个消费者同时处理多个图片任务。

复制代码
Client -> [Image Upload Service] -> [RabbitMQ Queue] -> [Image Processing Workers]
3. 日志聚合

使用场景:收集分布式系统中的日志,统一存储和分析。

示例:多个微服务将日志发送到 RabbitMQ,日志聚合服务从队列中读取日志并存储到数据库或日志管理系统。

复制代码
[Microservice A] -> 
[Microservice B] -> [RabbitMQ Queue] -> [Log Aggregation Service]
[Microservice C] ->
4. 消息广播

使用场景:将消息广播给多个消费者,实现消息的多播。

示例:实时通知系统中,服务器将通知消息广播给多个客户端。

复制代码
[Notification Service] -> [RabbitMQ Exchange] -> [Client A]
                                          -> [Client B]
                                          -> [Client C]
5. 微服务通信

使用场景:在微服务架构中,使用 RabbitMQ 作为服务间通信的中介,解耦服务。

示例:电商系统中,订单服务和库存服务通过 RabbitMQ 进行通信。

复制代码
[Order Service] -> [RabbitMQ Exchange] -> [Inventory Service]
6. 数据流处理

使用场景:处理实时数据流,将数据流分发给多个处理节点。

示例:实时数据分析系统中,数据流从数据源进入 RabbitMQ,多个数据处理节点从队列中读取数据进行分析。

复制代码
[Data Source] -> [RabbitMQ Queue] -> [Data Processing Node A]
                                  -> [Data Processing Node B]
7. 延迟任务

使用场景:在指定时间后执行任务。

示例:发送延迟通知或邮件,任务放入 RabbitMQ 的延迟队列,延迟指定时间后再处理。

复制代码
[Task Scheduler] -> [RabbitMQ Delay Queue] -> [Notification Service]
8. 事件驱动架构

使用场景:基于事件的系统架构设计,通过消息队列传递事件。

示例:用户注册系统,用户注册成功后,触发多个后续处理,如发送欢迎邮件、更新统计数据等。

plaintext 复制代码
[User Registration Service] -> [RabbitMQ Exchange] -> [Email Service]
                                                  -> [Analytics Service]
                                                  -> [Profile Service]
9. 分布式事务

使用场景:通过消息队列实现分布式系统中的事务一致性。

示例:订单服务和支付服务之间,通过 RabbitMQ 确保订单和支付的一致性。

复制代码
[Order Service] -> [RabbitMQ Queue] -> [Payment Service]
5.主要特点

可靠性 (Reliability):RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认

灵活的路由 (Flexible Routing):在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置
Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。

消息集群 (Clustering):多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker

高可用 (Highly Available Queues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。

多种协议 (Multi-protocol):RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。

多语言客户端 (Many Clients):RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。

管理界面 (Management UI):RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。

跟踪机制 (Tracing):如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。

插件机制 (Plugin System):RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。

6. 使用示例

下面是使用 Python 和 pika 库的一个简单示例,展示如何发送和接收消息。

安装 pika
bash 复制代码
pip install pika
生产者(发送消息)
bash 复制代码
pythonimport pika

# 连接到 RabbitMQ 服务器
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

# 创建一个队列
channel.queue_declare(queue='hello')

# 发送消息到队列
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
print(" [x] Sent 'Hello World!'")

# 关闭连接
connection.close()
消费者(接收消息)
bash 复制代码
pythonimport pika

# 连接到 RabbitMQ 服务器
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

# 创建一个队列
channel.queue_declare(queue='hello')

# 定义回调函数,处理从队列接收到的消息
def callback(ch, method, properties, body):
    print(f" [x] Received {body}")

# 告诉 RabbitMQ 用回调函数来接收消息
channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
5. 常用命令
  • 查看队列

    bash 复制代码
    sudo rabbitmqctl list_queues
  • 添加用户

    bash 复制代码
    sudo rabbitmqctl add_user myuser mypassword
  • 设置用户权限

    bash 复制代码
    sudo rabbitmqctl set_permissions -p / myuser ".*" ".*" ".*"
  • 删除用户

    bash 复制代码
    sudo rabbitmqctl delete_user myuser
相关推荐
爱的叹息5 分钟前
主流数据库的存储引擎/存储机制的详细对比分析,涵盖关系型数据库、NoSQL数据库和分布式数据库
数据库·分布式·nosql
千层冷面1 小时前
RabbitMQ 发送者确认机制详解
分布式·rabbitmq·ruby
ChinaRainbowSea1 小时前
3. RabbitMQ 的(Hello World) 和 RabbitMQ 的(Work Queues)工作队列
java·分布式·后端·rabbitmq·ruby·java-rabbitmq
敖正炀1 小时前
基于RocketMQ的可靠消息最终一致性分布式事务解决方案
分布式
一條狗3 小时前
随笔 20250402 分布式 ID 生成器 Snowflake 里面的坑
分布式
小马爱打代码3 小时前
Kubernetes 中部署 Ceph,构建高可用分布式存储服务
分布式·ceph·kubernetes
码熔burning3 小时前
【Spring Cloud Alibaba】:Nacos 入门讲解
分布式·spring cloud·微服务
hycccccch11 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
低头不见16 小时前
一个服务器算分布式吗,分布式需要几个服务器
运维·服务器·分布式
靠近彗星17 小时前
如何检查 HBase Master 是否已完成初始化?| 详细排查指南
大数据·数据库·分布式·hbase