文章目录
RabbitMQ初尝试
1 RabbitMQ 简介
What
RabbitMQ 是一个开源的消息队列中间件,基于 AMQP(Advanced Message Queuing Protocol 高级消息队列协议)实现,用于实现应用之间解耦、异步通信、削峰填谷等需求。
Features
- 支持可靠消息投递(确认、持久化)
- 灵活的路由机制(通过 Exchange)
- 多种消息传输模式(点对点 / 发布订阅)
- 支持集群、高可用、镜像队列
- 支持插件机制,支持 MQTT、STOMP、WebSocket 等协议
2 RabbitMQ 架构核心组件
RabbitMQ 的通信模型基于 AMQP 协议,理解以下 5 个核心概念是关键:
组件 | 作用 |
---|---|
Producer | 生产者,发送消息 |
Queue | 消息队列,存储消息 |
Exchange | 交换机,负责路由消息到队列 |
Binding | 绑定,定义队列和交换机的路由规则 |
Consumer | 消费者,接收并处理消息 |
消息投递过程图
3 交换机类型(Exchange Types)
类型 | 描述 | 示例用途 |
---|---|---|
Direct | 精确匹配 routing key,1对1 消息 | 点对点通知 |
Fanout | 广播消息到所有绑定队列,忽略 routing key | 日志广播、告警系统 |
Topic | 模糊匹配(支持通配符 * /# ),适合复杂路由规则 | 多级路由,如日志分类 |
Headers | 根据 header 属性匹配,而非 routing key | 不常用(规则更复杂) |
4 消息确认机制(保证可靠性)
机制 | 描述 |
---|---|
Publisher Confirm | 确保消息送达 Exchange(生产者确认) |
Manual ACK | 消费者手动确认消费成功 |
持久化 | 消息/队列设置 durable 防止重启丢失 |
5 RabbitMQ 使用(C++ 入门)
推荐 C++ 客户端:
rabbitmq-c
:官方 C 客户端(支持 AMQP)SimpleAmqpClient
:基于 rabbitmq-c 的 C++ 封装,接口更友好
安装 RabbitMQ(Docker 快速启动):
docker run -d --hostname rabbit --name rabbitmq \
-p 5672:5672 -p 15672:15672 \
rabbitmq:3-management
- 管理界面:http://localhost:15672
- 默认账号密码:
guest
/guest
Docker镜像安装
参考上传资源
C++ 使用示例(SimpleAmqpClient)
安装依赖(Ubuntu 示例):
sudo apt install librabbitmq-dev
git clone https://github.com/alanxz/SimpleAmqpClient.git
cd SimpleAmqpClient && mkdir build && cd build
cmake ..
make && sudo make install
发送消息(Producer):
#include <SimpleAmqpClient/SimpleAmqpClient.h>
int main() {
auto channel = AmqpClient::Channel::Create();
std::string queue = "test_queue";
channel->DeclareQueue(queue, false, true, false, false);
auto message = AmqpClient::BasicMessage::Create("Hello RabbitMQ!");
channel->BasicPublish("", queue, message);
}
接收消息(Consumer):
#include <SimpleAmqpClient/SimpleAmqpClient.h>
int main() {
auto channel = AmqpClient::Channel::Create();
std::string queue = "test_queue";
channel->DeclareQueue(queue, false, true, false, false);
std::string consumer_tag = channel->BasicConsume(queue, "", true, false, false);
auto envelope = channel->BasicConsumeMessage(consumer_tag);
std::cout << "Received: " << envelope->Message()->Body() << std::endl;
}
镜像安装后操作指南
下一步操作:运行你的 C++ 生产者和消费者程序
在你启动了 RabbitMQ 后,接下来进入 cpp_client
容器运行你的客户端程序。
步骤 1:进入 cpp_client 容器
docker exec -it cpp_client /bin/bash
步骤 2:运行生产者程序
cd build
./producer
你应该会看到输出:
Message sent.
步骤 3:运行消费者程序
你可以打开另一个终端,重新进入容器,然后运行:
cd build
./consumer
输出示例:
Received: Hello from producer
步骤 4:访问 RabbitMQ 管理后台(可选)
浏览器访问:
http://localhost:15672
用户名/密码:
guest / guest
你可以在 “Queues” 页面看到你的 test_queue
队列,以及消息进出情况。
如果你想让生产者和消费者长期运行并反复发送接收
可以改造 producer.cpp
和 consumer.cpp
添加循环逻辑。例如:
// producer.cpp
while (true) {
mq.send("Hello from looped producer");
sleep(1);
}
6 进阶玩法
功能 | 实现方式 | 用途场景 |
---|---|---|
延迟消息 | TTL + 死信队列(DLX) | 延迟任务、订单超时 |
发布订阅模式 | 使用 Fanout 交换机 | 消息广播、日志 |
路由分发 | 使用 Topic 交换机,支持通配符匹配 | 多级消息分类 |
消息确认 | 开启 manual ack | 确保消息被正确处理 |
消息持久化 | 设置 durable 队列和 persistent 消息 | 防止服务重启丢消息 |
并发消费 | 使用线程池或多进程 | 提高吞吐量 |
分布式事务 | 利用 RabbitMQ 做最终一致性补偿事务方案 | 异步订单/库存处理 |
7 可能需要了解的问题
问题 | 要点 |
---|---|
RabbitMQ 如何实现消息可靠性? | ACK机制 + 持久化 + Confirm |
如何实现延迟消息? | TTL + 死信交换机 |
RabbitMQ 和 Kafka 有什么区别? | Kafka 是分布式日志,更适合高吞吐 |
如何防止消息丢失/重复/乱序? | 幂等 + 手动 ACK + 顺序队列 |
如何实现发布订阅? | Fanout / Topic Exchange |
7 推荐学习资料
官方文档 & 教程:
面试知识点总结:
- 如何保障消息不丢不重不乱
- RabbitMQ 与 Kafka 区别
- 延迟消息如何实现(TTL+死信队列)
- 消费失败重试机制
- 如何实现分布式事务
8 入门总结 + 下一步建议
你已掌握 | 下一步建议 |
---|---|
基础原理 + 架构 | 学习延迟队列、死信队列、事务消息 |
简单 C++ Producer/Consumer | 集成线程池+MQ异步处理 |
Exchange 类型与绑定 | 实战发布订阅、日志系统、RPC 等 |
可以去做的实战项目:任务分发系统
- 后台使用 C++ 写一个任务调度器,向队列发布任务(比如图像处理、数据清洗)
- 多个消费者使用线程池从队列中并发消费并执行任务
- 监控 RabbitMQ 队列长度、处理速度,做简单可视化