【C/C++】跟我一起学_RabbitMQ初尝试

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消费者,接收并处理消息

消息投递过程图

RoutingKey: order.created
RoutingKey: payment.completed
Producer
Direct Exchange
QueueA
QueueB
Worker Consumer
Worker Consumer
Push Notification 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++ 客户端:

  1. rabbitmq-c:官方 C 客户端(支持 AMQP)
  2. SimpleAmqpClient:基于 rabbitmq-c 的 C++ 封装,接口更友好

安装 RabbitMQ(Docker 快速启动):

docker run -d --hostname rabbit --name rabbitmq \
  -p 5672:5672 -p 15672:15672 \
  rabbitmq:3-management

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.cppconsumer.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 队列长度、处理速度,做简单可视化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值