C++ - 仿 RabbitMQ 实现消息队列(1)(环境搭建)

C++ - 仿 RabbitMQ 实现消息队列(1)(环境搭建)

  • 什么是消息队列
      • 核心特点
      • 核心组件
      • 工作原理
      • 常见消息队列实现
      • 应用场景
      • 优缺点
  • 项目配置
    • 开发环境
    • 技术选型
  • 更换软件源
  • 安装一些工具
    • 安装epel 软件源
    • 安装 lrzsz 传输工具
    • 安装git
    • 安装 cmake
    • 安装 SQLite3
    • 安装GTest
  • 安装高版本 gcc/g++编译器
      • 1. 确认可用的 GCC 工具集版本
      • 2. 安装默认的 GCC 工具集
      • 3. 正确的启用方式
      • 4. 永久启用(可选)
  • 安装Protobuf
      • 1. 解压源码包
      • 2. 进入源码目录
      • 3. 生成配置脚本
      • 4. 配置编译选项
      • 5. 编译源码
      • 6. 安装到系统
      • 7. 更新动态库缓存
      • 完整流程总结
      • 验证安装
  • 安装 Muduo

我们今天来开一个新的项目仿 RabbitMQ 实现消息队列,这个项目更加接近公司的开发流程,开发和测试各个方面都会涉及到。不过在这之前,我们先来了解一下什么是消息队列,消息队列是用来干嘛的。

什么是消息队列

消息队列(Message Queue)是一种用于在分布式系统或应用程序之间传递消息的通信机制,它通过一个中间存储结构(队列)来管理消息的传递,允许发送方和接收方以异步的方式交互。消息队列的核心作用是解耦生产者和消费者,提升系统的可扩展性、可靠性和性能。

核心特点

  1. 解耦性
    生产者(发送方)和消费者(接收方)无需直接通信,也无需知道彼此的存在。双方通过消息队列进行交互,降低了系统间的耦合度。

  2. 异步通信
    生产者将消息发送到队列后,无需等待消费者立即处理,可以继续执行其他任务。消费者可以按自己的节奏处理消息,提高系统响应速度。

  3. 削峰填谷
    在流量高峰时,消息队列可以缓冲大量请求,避免系统过载。消费者可以逐步处理队列中的消息,平稳系统负载。

  4. 可靠性
    消息队列通常提供持久化存储,即使消费者崩溃或网络中断,消息也不会丢失,确保数据不丢失。

核心组件

  1. 生产者(Producer)
    负责生成消息并将其发送到消息队列中。

  2. 消息队列(Message Queue)
    中间存储结构,用于临时存储消息,支持消息的持久化、排序和分发。

  3. 消费者(Consumer)
    从消息队列中获取消息并进行处理。

工作原理

  1. 生产者发送消息:生产者将消息发送到指定的队列中。
  2. 消息存储:消息队列将消息持久化存储,等待消费者处理。
  3. 消费者拉取或推送消息:消费者从队列中获取消息(拉取模式)或通过订阅机制接收消息(推送模式)。
  4. 消息处理:消费者处理消息,并可能返回处理结果。
  5. 消息确认(可选):消费者处理完成后,向消息队列发送确认信号,队列可以删除或标记消息为已处理。

常见消息队列实现

  1. RabbitMQ

    • 基于AMQP协议的开源消息代理,支持多种消息模式(如发布/订阅、路由、主题)。
    • 适合需要灵活路由和复杂消息模式的场景。
  2. Kafka

    • 高吞吐量的分布式消息系统,常用于大数据和实时流处理。
    • 支持持久化日志、分区和副本,适合大规模数据处理。
  3. ActiveMQ

    • 基于JMS规范的开源消息代理,支持多种协议(如AMQP、STOMP、MQTT)。
    • 适合企业级应用和集成场景。
  4. Redis Stream

    • Redis 5.0引入的流数据结构,支持简单的消息队列功能。
    • 适合轻量级、低延迟的场景。
  5. Amazon SQS/Azure Service Bus

    • 云服务提供商提供的托管消息队列服务,适合云原生应用。

应用场景

  1. 异步任务处理
    例如:用户注册后发送欢迎邮件、订单处理后更新库存。

  2. 应用解耦
    例如:电商系统中,订单服务、支付服务和物流服务通过消息队列解耦。

  3. 流量削峰
    例如:秒杀活动中,将用户请求暂存到消息队列,后台服务逐步处理。

  4. 日志处理
    例如:将应用日志发送到消息队列,由日志收集服务统一处理。

  5. 事件驱动架构
    例如:微服务架构中,服务之间通过事件消息进行通信。

优缺点

优点

  • 解耦生产者和消费者,降低系统复杂度。
  • 支持异步通信,提高系统响应速度。
  • 提供削峰填谷能力,增强系统稳定性。
  • 支持消息持久化,确保数据不丢失。

缺点

  • 引入了额外的组件,增加了系统复杂度。
  • 消息顺序和重复消费等问题需要额外处理。
  • 消息队列本身可能成为性能瓶颈(需合理设计)。

我们这次的项目围绕着RabbitMQ 模拟实现一个简单的消息队列

项目配置

开发环境

组件版本/工具
操作系统CentOS9 / Ubuntu-22.04
代码编辑器VSCode / Vim
编译调试工具g++ / gdb
构建工具Makefile

技术选型

类别选择
开发主语言C++
序列化框架Protobuf 二进制序列化
网络通信方案自定义应用层协议 + muduo库(推荐,适用于TCP长连接及高并发场景)
或者自定义应用层协议 + 原生socket(复杂度较高)
数据库SQLite3
单元测试框架Gtest

更换软件源

首先,我们得要首先把软件源换成国内的,如果使用系统本身的软件源,就要访问国外的网站,速度会非常慢。

我们换成清华大学的镜像源:

https://mirrors.tuna.tsinghua.edu.cn/

在这里插入图片描述
执行以下的代码:

sudo tee /etc/yum.repos.d/CentOS-Stream.repo << 'EOF'
[baseos]
name=CentOS Stream 9 - BaseOS (Tsinghua)
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-stream/9-stream/BaseOS/x86_64/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial[appstream]
name=CentOS Stream 9 - AppStream (Tsinghua)
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-stream/9-stream/AppStream/x86_64/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial[extras]
name=CentOS Stream 9 - Extras (Tsinghua)
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-stream/SIGs/9-stream/extras/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
EOF

这段代码是在配置 CentOS Stream 9 的 YUM 软件仓库(repository),具体作用如下:

  1. 使用 sudo tee 命令将后面的内容写入 /etc/yum.repos.d/CentOS-Stream.repo 文件(需要管理员权限)
  2. << 'EOF' 表示将后续内容作为标准输入,直到遇到 EOF 结束标记
  3. 文件内容配置了三个软件源仓库:
    • [baseos]:基础操作系统软件包
    • [appstream]:应用程序包
    • [extras]:额外软件包

每个仓库配置包含:

  • name:仓库描述名称(标明是清华镜像源)
  • baseurl:指定软件包的下载地址(使用清华大学开源镜像站)
  • gpgcheck=1:启用 GPG 签名验证
  • gpgkey:指定 GPG 密钥位置用于验证软件包

这样配置后,当你使用 yumdnf 命令安装软件时,系统会从清华大学的镜像站点下载 CentOS Stream 9 的软件包,速度会比官方源更快(特别是在中国境内)。

注意:这段代码会覆盖同名的现有仓库配置文件,如果之前有其他配置会被替换。

大家注意一下三个部分的baseurl,如果路径不对,是会失败的,这里给大家指明一下路径:

baseos的baseurl:

https://mirrors.tuna.tsinghua.edu.cn/centos-stream/9-stream/BaseOS/x86_64/

在这里插入图片描述
appstream的baseurl:

https://mirrors.tuna.tsinghua.edu.cn/centos-stream/9-stream/AppStream/x86_64/os/

在这里插入图片描述
extras的baseurl:

https://mirrors.tuna.tsinghua.edu.cn/centos-stream/SIGs/9-stream/extras/x86_64/

在这里插入图片描述

安装一些工具

安装epel 软件源

sudo dnf install epel-release

安装 lrzsz 传输工具

sudo dnf install lrzsz

在这里插入图片描述

安装git

sudo dnf install git

在这里插入图片描述
在这里插入图片描述

安装 cmake

sudo dnf install cmake

在这里插入图片描述

安装 SQLite3

sudo dnf install sqlite-devel

在这里插入图片描述

安装GTest

sudo dnf install gtest gtest-devel
ls /usr/include/gtest/gtest.h

在这里插入图片描述

安装高版本 gcc/g++编译器

在 CentOS Stream 9 中,gcc-toolset-11 可能不再直接提供,或者它的包名称/仓库配置发生了变化。以下是解决方案:


1. 确认可用的 GCC 工具集版本

运行以下命令查看当前可用的 GCC 相关包:

dnf search gcc-toolset

在这里插入图片描述
我们这里选择12版本

2. 安装默认的 GCC 工具集

CentOS Stream 9 可能默认提供 GCC Toolset 12 或更高版本:

sudo dnf install gcc-toolset-12

3. 正确的启用方式

在 CentOS Stream 9 中,gcc-toolset-12 不再通过 module load 启用,而是通过 直接加载环境变量

source /opt/rh/gcc-toolset-12/enable

然后验证 GCC 版本:

gcc --version

在这里插入图片描述

4. 永久启用(可选)

如果希望每次登录自动启用,可以将以下内容添加到 ~/.bashrc

echo 'source /opt/rh/gcc-toolset-12/enable' >> ~/.bashrc
source ~/.bashrc

安装Protobuf

这里建议大家先在windows上下好了传到Linux上:
在这里插入图片描述

下载链接(如果有VPN,可以开一个,下得快):

https://github.com/protocolbuffers/protobuf/releases/download/v3.2
0.2/protobuf-all-3.20.2.tar.gz

在这里插入图片描述
然后执行以下代码:

tar -xzf protobuf-all-21.12.tar.gz
cd protobuf-21.12
./autogen.sh
./configure
make -j$(nproc)
sudo make install
sudo ldconfig

这段代码是用于从源码编译并安装 Protocol Buffers (Protobuf) 的完整流程。Protobuf 是 Google 开发的一种高效的数据序列化格式,广泛用于网络通信和数据存储。以下是每一步的详细解释:


1. 解压源码包

tar -xzf protobuf-all-21.12.tar.gz
  • 作用:解压名为 protobuf-all-21.12.tar.gz 的压缩包。
  • 参数说明
    • -x:解压文件。
    • -z:使用 gzip 解压(针对 .tar.gz 文件)。
    • -f:指定文件名。
  • 结果:生成 protobuf-21.12 目录,包含 Protobuf 的源码。

2. 进入源码目录

cd protobuf-21.12
  • 作用:切换到解压后的 Protobuf 源码目录,准备进行编译。

3. 生成配置脚本

./autogen.sh
  • 作用:运行 autogen.sh 脚本,生成 configure 文件(如果源码包未提供预生成的 configure 文件)。
  • 适用场景
    某些开源项目(如 Protobuf)使用 autotools 构建系统,需要先运行 autogen.sh 生成 configure 脚本。

4. 配置编译选项

./configure
  • 作用:运行 configure 脚本,检测系统环境(如编译器、库路径等),并生成 Makefile
  • 关键行为
    • 检查系统是否安装了必要的依赖(如 g++makelibtool 等)。
    • 生成针对当前系统的编译配置(如优化选项、安装路径等)。
  • 自定义选项
    可以通过参数指定安装路径(如 ./configure --prefix=/usr/local/protobuf)。

5. 编译源码

make -j$(nproc)
  • 作用:使用 make 编译 Protobuf 源码。
  • 参数说明
    • -j$(nproc):启用多线程编译,$(nproc) 自动获取 CPU 核心数,加速编译过程。
  • 结果:生成可执行文件和库(如 protoc 编译器、libprotobuf.so 等)。

6. 安装到系统

sudo make install
  • 作用:将编译好的 Protobuf 文件安装到系统目录(如 /usr/local/bin/usr/local/lib)。
  • 权限要求:需要 sudo 权限,因为安装到系统目录需要管理员权限。
  • 安装内容
    • 可执行文件(如 protoc)安装到 /usr/local/bin
    • 库文件(如 libprotobuf.*)安装到 /usr/local/lib
    • 头文件安装到 /usr/local/include

7. 更新动态库缓存

sudo ldconfig
  • 作用:更新系统的动态库缓存,使新安装的 Protobuf 库(libprotobuf.so)能被系统识别。
  • 必要性
    如果不运行 ldconfig,程序在运行时可能找不到新安装的库,导致报错(如 libprotobuf.so: cannot open shared object file)。

完整流程总结

  1. 解压源码tar -xzf protobuf-all-21.12.tar.gz
  2. 进入目录cd protobuf-21.12
  3. 生成配置脚本./autogen.sh
  4. 配置环境./configure
  5. 编译代码make -j$(nproc)
  6. 安装到系统sudo make install
  7. 更新库缓存sudo ldconfig

验证安装

安装完成后,可以通过以下命令验证 Protobuf 是否安装成功:

protoc --version  # 检查 protoc 版本

如果输出版本号(如 libprotoc 3.21.12),则安装成功。

安装 Muduo

先获取一下zip包:

wget https://gitee.com/hansionz/mq/raw/master/resource/muduo-master.zip

在这里插入图片描述

unzip muduo-master.zip
cd muduo-master

Muduo 需要以下依赖:

sudo dnf install -y gcc-c++ cmake make \boost-devel openssl-devel protobuf-devel \zlib-devel curl-devel

然后进行编译

# 进入 Muduo 源码目录
cd muduo-master# 使用 CMake 构建
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..  # 推荐 Release 模式
make -j$(nproc)  # 并行编译

最后进行安装:

sudo make install

在这里插入图片描述

然后进入到bin目录我们可以来测试一下:
在这里插入图片描述
执行:

./protobuf_server 9091

在这里插入图片描述
然后复制SSH渠道,执行:

./protobuf_client 0.0.0.0 9091

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单面试提问

Nosql非关系型数据库&#xff1a; Mongodb&#xff1a;开源、json形式储存、c编写 Redis&#xff1a;key-value形式储存&#xff0c;储存在内存&#xff0c;c编写 关系型数据库&#xff1a; sqlite;&#xff1a;轻量型、0配置、磁盘存储、支持多种语言 mysql&#xff1a;开源…

油气地震资料信号处理中的NMO(正常时差校正)

油气地震资料信号处理中的NMO&#xff08;正常时差校正&#xff09;介绍与应用 NMO基本概念 **正常时差校正&#xff08;Normal Moveout Correction&#xff0c;NMO&#xff09;**是地震资料处理中的一项关键技术&#xff0c;主要用于消除由于炮检距&#xff08;source-recei…

深度解析:从 GPT-4o“谄媚”到 Deepseek“物理腔”,透视大模型行为模式的底层逻辑与挑战

深度解析&#xff1a;从 GPT-4o“谄媚”到 AI“物理腔”&#xff0c;透视大模型行为模式的底层逻辑与挑战 标签&#xff1a;人工智能, GPT-4o, 大语言模型, AI伦理, 人机交互, 技术思考 大家好&#xff01;最近AI圈最火的“瓜”之一&#xff0c;莫过于OpenAI的GPT-4o模型在一…

Java引用RabbitMQ快速入门

这里写目录 Java发送消息给MQ消费者接收消息实现一个队列绑定多个消费者消息推送限制 Fanout交换机路由的作用Direct交换机使用案例 Java发送消息给MQ public void testSendMessage() throws IOException, TimeoutException {// 1.建立连接ConnectionFactory factory new Conn…

从读写分离到分布式服务:系统架构演进十阶段深度解析

第一阶段到第四阶段&#xff1a;架构进化四阶段&#xff1a;探索单体到集群的高可用性能优化之道-CSDN博客https://blog.csdn.net/pinbodeshaonian/article/details/147464084?spm1001.2014.3001.5502 以下是对从第五阶段到第十阶段详细的解释&#xff1a; 第五阶段&#xf…

Webug4.0靶场通关笔记07- 第9关反射XSS和第10关存储XSS

目录 第09关 反射型XSS 1.打开靶场 2.源码分析 3.渗透实战 第10关 存储型XSS 1.打开靶场 2.源码分析 3.渗透实战 本系列为通过《Webug4.0靶场通关笔记》的渗透集合&#xff0c;本文为反射型和存储型XSS漏洞关卡的渗透部分&#xff0c;通过对XSS关卡源码的代码审计找到漏…

Prometheus的安装部署

目录 一、概述 二、Prometheus的安装 1、二进制方式 1.1、下载系统安装包​编辑 1.2、解压 1.3、创建数据目录&#xff0c;服务运行用户 1.4、设置为系统服务&#xff08;创建服务运行脚本&#xff09; 1.5、启动服务&#xff0c;并通过浏览器访问验证 2、容器方式 2…

Jupyter Notebook为什么适合数据分析?

Jupyter Notebook 是一款超实用的 Web 应用程序&#xff0c;在数据科学、编程等诸多领域都发挥着重要作用。它最大的特点就是能让大家轻松创建和共享文学化程序文档。这里说的文学化程序文档&#xff0c;简单来讲&#xff0c;就是把代码、解释说明、数学公式以及数据可视化结果…

Python清空Word段落样式的方法

在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档&#xff0c;包括清空段落样式。以下是几种清空段落样式的方法&#xff1a; 方法一&#xff1a;直接设置段落样式为"Normal" from docx import Documentdoc Document(your_document.docx) # 打…

macOS 上是否有类似 WinRAR 的压缩软件?

对于习惯使用 Windows 的用户来说&#xff0c;WinRAR 是经典的压缩/解压工具&#xff0c;但 macOS 系统原生并不支持 RAR 格式的解压&#xff0c;更无法直接使用 WinRAR。不过&#xff0c;macOS 平台上有许多功能相似甚至更强大的替代工具&#xff0c;以下是一些推荐&#xff1…

WebRtc09:网络基础P2P/STUN/TURN/ICE

网络传输基本知识 NATSTUN&#xff08;Session Traversal Utilities for NAT&#xff09;TURNICE NAT 产生的原因 IPV4地址不够出于网络安全的原因 NAT种类 完全锥型NAT(Full Cone NAT)地址限制型NAT(Address Restricted Cone NAT)端口限制型NAT(Port Restricted Cone NAT…

如何添加或删除极狐GitLab 项目成员?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 项目成员 (BASIC ALL) 成员是有权访问您的项目的用户和群组。 每个成员都有一个角色&#xff0c;这决定了他们在项目中可以…

用单目相机和apriltag二维码aruco实现单目定位

目录 一、核心流程与代码框架 1. ‌环境准备‌ 2. ‌ArUco定位实现 3. ‌AprilTag定位实现&#xff08;需额外安装Apriltag库&#xff09; 二、关键优化点 1‌.亚像素角点优化 2‌ 多标签联合定位 三、性能指标&#xff08;实测&#xff09; 四、常见问题 ‌检测失败…

tinyrenderer笔记(透视矫正)

tinyrenderer个人代码仓库&#xff1a;tinyrenderer个人练习代码 引言 还要从上一节知识说起&#xff0c;在上一节中我为了调试代码&#xff0c;换了一个很简单的正方形 obj 模型&#xff0c;配上纹理贴图与法线贴图进行渲染&#xff0c;得了下面的结果&#xff1a; what&…

MySQL的内置函数与复杂查询

目录 前言 一、聚合函数 1.1日期函数 1.2字符串函数 1.3数学函数 1.4其它函数 二、关键字周边 2.1关键字的生效顺序 2.2数据源 2.3可以使用聚合函数的关键字 前言 在前面几篇文章中&#xff0c;讲解了有关MySQL数据库、数据库表的创建、数据库表的数据操作等等。本文我…

见多识广4:Buffer与Cache,神经网络加速器的Buffer

目录 前言传统意义上的Buffer与Cache一言以蔽之定义与主要功能BufferCache 数据存储策略二者对比 神经网络加速器的bufferInput BufferWeight BufferOutput Buffer与传统buffer的核心区别总结 前言 知识主要由Qwen和Kimi提供&#xff0c;我主要做笔记。 参考文献&#xff1a; …

内存的位运算

示例&#xff1a;提取和设置标志位 假设我们有一个32位的整数&#xff0c;其中不同的位代表不同的标志。例如&#xff1a; 位0&#xff1a;是否开启日志&#xff08;0表示关闭&#xff0c;1表示开启&#xff09; 位1&#xff1a;是否启用调试模式&#xff08;0表示禁用&#…

linux -shell原理与运用

1---shell的工作方式和功能 shell的工作方式: shell本身也是一个应用程序,存储在/bin 或者是/user/bin中 登录的时候 会根据/etc/passwd文件载入shell默认执行 shell启动后,就会显示命令提示符,等待用户输入命令 命令的逻辑: 首先会判断时内部命令还是外部命令,如果是内部…

js获取uniapp获取webview内容高度

js获取uniapp获取webview内容高度 在uni-app中&#xff0c;如果你想要获取webview的内容高度&#xff0c;可以使用uni-app提供的bindload事件来监听webview的加载&#xff0c;然后通过调用webview的invokeMethod方法来获取内容的高度。 以下是一个示例代码&#xff1a; <te…

Windows系统升级Nodejs版本

什么是nodejs Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境, 它让开发人员能够创建服务器 Web 应用、命令行工具和脚本。 NodeJs官网 网址&#xff1a;Node.js — 在任何地方运行 JavaScript 可以通过网址下载安装&#xff0c;通过官网可以看到现在最新版本为22…