RabbitMQ 分布式系统应用:从安装部署到 C++ 调用实战
介绍 RabbitMQ 中间件的核心概念、Linux 安装步骤及 AMQP-CPP 库在 C++ 中的使用。涵盖交换机、队列、绑定机制,演示发布订阅流程,并提供客户端 API 封装思路,适用于分布式异步通信场景。

介绍 RabbitMQ 中间件的核心概念、Linux 安装步骤及 AMQP-CPP 库在 C++ 中的使用。涵盖交换机、队列、绑定机制,演示发布订阅流程,并提供客户端 API 封装思路,适用于分布式异步通信场景。

本文围绕 RabbitMQ 展开,涵盖其概念、安装、AMQP-CPP 库使用及客户端 API 封装。阐述消息队列原理、特性,详述 Linux 下安装步骤、库安装,展示简单使用案例与 API 封装思路。
RabbitMQ 是一个开源的、跨平台的消息队列中间件,基于 AMQP(Advanced Message Queuing Protocol)标准实现,由 Erlang 语言编写,广泛应用于分布式系统中实现异步通信、解耦、流量削峰、任务分发等功能。
简单来说,RabbitMQ 是一个'邮局',负责在不同程序之间可靠地传递消息,让发送方和接收方无需直接交互,只需通过 RabbitMQ 进行中转。
| 对比项 | RabbitMQ | Kafka | Redis(Stream) |
|---|---|---|---|
| 设计目标 | 通用消息队列(可靠、灵活路由) | 高吞吐、分布式日志流处理 | 轻量级消息队列(简单场景) |
| 协议 | AMQP(及其他) | 自研协议 | Redis 协议 |
| 消息模型 | 交换机 + 队列(灵活路由) | 主题分区(Pub/Sub 或 Stream) | List/PubSub/Stream |
| 可靠性 | 高(支持持久化、确认机制) | 高(副本机制) | 较低(依赖配置) |
| 适用场景 | 业务解耦、异步任务、削峰 | 大数据流处理、实时日志 | 简单队列、缓存通知 |
RabbitMQ 是一个轻量级、高可靠的消息队列中间件,通过灵活的路由机制和多种交换机类型,帮助分布式系统实现异步通信、解耦和流量控制,是构建高可用、可扩展服务的核心工具之一。
sudo apt install rabbitmq-server
# 启动服务
sudo systemctl start rabbitmq-server
# 查看状态(确保 active (running))
sudo systemctl status rabbitmq-server
# 添加用户(示例:用户名=root,密码=123456)
sudo rabbitmqctl add_user root 123456
# 设为管理员
sudo rabbitmqctl set_user_tags root administrator
# 赋予权限(对所有虚拟主机)
sudo rabbitmqctl set_permissions -p / root ".*" ".*" ".*"
sudo rabbitmq-plugins enable rabbitmq_management
访问:http://你的服务器 IP:15672
登录:用户名=root,密码=123456
如果服务器端口未向外开放,需要修改配置文件设置监听的 IP 以及部署的端口。
编辑配置文件:
vim /etc/rabbitmq/rabbitmq.conf
添加对应字段后重启服务即可。
常见问题: 连接 Web UI 时若出现错误,通常不是账号密码问题,而是权限配置问题。重新设置允许登录的新用户并重启服务即可解决。
作用:提供基础的 RabbitMQ C 接口,用于消息通信。
sudo apt-get install librabbitmq-dev
作用:基于 C 接口的 C++ 封装库,更适合用 C++ 编写客户端程序。
(1) 安装依赖库 libev(网络库组件):
sudo apt install libev-dev
(2) 下载 AMQP-CPP 源码:
git clone https://github.com/CopernicaMarketingSoftware/AMQP-CPP.git
cd AMQP-CPP/
(3) 编译并安装:
make && make install
注意:如果编译时出现 SSL 版本错误,需重新执行
make或修复系统依赖。
修复系统依赖:
sudo apt --fix-broken install
卸载冲突的 SSL 库(强制卸载):
sudo dpkg -P --force-all libevent-openssl-2.1-7
sudo dpkg -P --force-all openssl
sudo dpkg -P --force-all libssl-dev
对于 RabbitMQ 的 Web 控制台默认部署的是 15672 端口,服务端默认端口是 5672,集群模式使用的端口是 25672。
AMQP-CPP 是一个 C++ 库,专门用于与 RabbitMQ 通信。它的核心功能是解析/生成数据,能处理 RabbitMQ 发来的消息,也能构造要发送的消息。
AMQP::TcpHandler(负责 TCP 连接)。monitor 函数,手动管理 IO,把网络套接字交给自己的事件循环。AMQP::LibEvHandler 类,库会自动处理 fd 监控和消息处理。后面我们以扩展模式来实现对 RabbitMQ 的访问。
1. AMQP::Channel: 信道类
Channel(Connection *connection); - 构造函数bool connected() - 检查连接状态Deferred &declareExchange() - 声明交换机DeferredQueue &declareQueue() - 声明队列Deferred &bindQueue() - 将交换机与队列进行绑定bool publish() - 发布消息DeferredConsumer &consume() - 订阅队列消息bool ack() - 消费者客户端对收到的消息进行确认应答2. class Message: 消息类
const char *body() - 获取消息正文uint64_t bodySize() - 获取消息正文大小3. libev 使用到的结构体与接口
struct ev_loop *ev_default_loop (); - 实例化并获取 I/O 事件监控结构句柄。int ev_run (struct ev_loop *loop); - 开始运行 I/O 事件监控,这是一个阻塞接口。void ev_break (struct ev_loop *loop, int32_t break_type); - 结束 I/O 监控。void ev_async_init(ev_async *w, callback cb); - 初始化异步事件结构,并设置回调函数。void ev_async_start(struct ev_loop *loop, ev_async *w); - 启动事件监控循环中的异步任务处理。void ev_async_send(struct ev_loop *loop, ev_async *w); - 发送当前异步事件到异步线程中执行。分别实现对应的发布客户端与订阅客户端,然后分别进行底层事件监控,关联 amqp 框架,建立连接、信道、声明交换机、队列、绑定消息等,然后直接进行消息发布,消息订阅即可。
首先启动发布客户端,进行注册对应信息向 MQ 服务端。 可以看到我们 publish 客户端连对应的连接与信道。 对应的交换机,队列,以及发送进来的消息也都正确。 最后启动订阅客户端就能收到对应消息。
注意: 这个和之前实现的仿 RabbitMQ 实现的消息队列不同,本身的 RabbitMQ 消息队列无论是先启动订阅还是发布端,最后订阅端都能收到发进去的消息;但是之前实现的那个仿照版本的必须先启动订阅端然后再是发布端,因为发布端发布进去消息就去找对应订阅队列的消费者的回调函数给它推送过去,反之则不可能进行推送了。
publish.cc 与 consume.cc 对应代码详见项目仓库。
客户端进行订阅队列,然后对于底层的事件监控交给对应异步线程,主线程阻塞住等待异步线程完成处理后进行异步事件通知来 break 它后进行回收。 这里发现打印的顺序和调用顺序不一样,因为这里声明完对应交换机、队列后才回去调用对应回调处理,也就是进行发布的过程速度比进行处理声明完回调速度快。 成功收到对应消息(这里 publish 与 consume 顺序谁先谁后也是无关的)。
详细代码见注释。
学习本篇可以知道 RabbitMQ 作为强大消息队列中间件,通过灵活交换机和丰富路由规则实现异步通信、解耦等功能。Linux 下安装便捷,AMQP-CPP 库提供 C++ 交互方式,客户端 API 封装提升开发效率,适用于多种分布式场景。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online