C++ - 仿 RabbitMQ 实现消息队列--项目介绍与环境搭建

目录

项目介绍

开发环境

技术选型

环境搭建 

安装 wget(一般情况下默认会自带)

更换国内软件源

安装 lrzsz 传输工具

安装编译器

安装项目构建工具 make

安装调试器

安装 git

安装 cmake

安装 Protobuf

安装 Muduo

安装 SQLite3

安装 Gtest


项目介绍

        首先说一下什么叫做阻塞队列。阻塞队列实际上就是一种生产消费模型,生产者生产数据到队列中,消费者取出数据进行处理。它有很多好处:

        ○ 解耦合 ○ 支持并发 ○ 支持忙闲不均 ○ 削峰填谷

        而在实际的后端开发中, 尤其是分布式系统里, 跨主机之间使用生产者消费者模型, 也是非常普遍的需求。因此, 我们通常会把阻塞队列封装成一个独立的服务器程序, 并且赋予其更丰富的功能。 这样的服务程序我们就称为 消息队列 (Message Queue, MQ)。市面上成熟的消息队列非常多:

        ○ RabbitMQ ○ Kafka ○ RocketMQ ○ ActiveMQ

        其中 RabbitMQ 是一个非常知名、功能强大且广泛使用的消息队列。咱们就仿照RabbitMQ 模拟实现一个简单的消息队列。

开发环境

  • Linux(Ubuntu-22.04)

  • VSCode

  • g++/gdb 

  • Makefile 

技术选型

  • 开发主语言:C++
  • 序列化框架:Protobuf 二进制序列化
  • 网络通信:
    • 自定义应用层协议 + 原生 socket: 复杂度较高
    • 自定义应用层协议 + muduo 库:对 tcp 长连接的封装、并且使用 epoll 的事件驱动模式,实现高并发服务器与客户端
  • 源数据信息数据库: SQLite3
  • 单元测试框架: Gtest

环境搭建 

安装 wget(一般情况下默认会自带)

sudo apt-get install wget

更换国内软件源

        先备份原来的/etc/apt/source.list 文件

sudo cp /etc/apt/sources.list  /etc/apt/sources.list.bak

        添加软件源文件内容,新增以下内容

deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
#添加清华源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse

         新增完毕后,更新源

sudo apt-get update

安装 lrzsz 传输工具

sudo apt-get install lrzsz

安装编译器

sudo apt-get install gcc g++

安装项目构建工具 make

sudo apt-get install make

安装调试器

sudo apt-get install gdb

安装 git

sudo apt-get install git

安装 cmake

sudo apt-get install cmake

安装 Protobuf

# 更新软件包列表
sudo apt update# 安装 protobuf 编译器和运行时库
sudo apt install protobuf-compiler# 验证安装
protoc --version

安装 Muduo

wget https://gitee.com/hansionz/mq/raw/master/resource/muduo-master.zip
# 安装依赖环境
sudo apt-get install libz-dev libboost-all-dev
# 运行脚本编译安装
unzip muduo-master.zip
./build.sh
./build.sh install

安装 SQLite3

sudo apt-get install sqlite3 libsqlite3-dev

安装 Gtest

sudo apt-get install libgtest-dev

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

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

相关文章

《目标检测模块实践手册:从原理到落地的尝试与分享》第一期

大家好,欢迎来到《目标检测模块实践手册》系列的第一篇。从今天开始,我想以一种 “实践记录者” 的身份,和大家聊聊在目标检测任务中那些形形色色的模块。这些内容没有权威结论,更多的是我在实际操作中的一些尝试、发现和踩过的坑…

C++11笑传之引用

C11前言列表初始化{}进行初始化initializer_list右值引用和移动语义左值与右值左值引用与右值引用引用延长生命周期右值引用和移动语义的使用场景左值引用移动构造和移动赋值右值引用在容器插入的提效引用折叠万能折叠完美转发前言 C11是C继98后的更新,其更新了许多…

瀚高数据库提交数据后,是否需要COMMIT(APP)

文章目录环境症状问题原因解决方案报错编码环境 系统平台: 版本:5.6.5,4.5 症状 瀚高数据库提交数据后,是否需要commit,瀚高数据库是否有配置项。 问题原因 瀚高数据库默认自动COMMIT(提交数据)&#…

深大计算机游戏开发实验三

主要步骤主角飞船的创建和移动边界设置以及护盾设置创建敌机自动生成敌机图层设置弹丸设置武器创建不同发射模式管理竞态条件击败敌机掉落升级道具不同敌机的生成分值显示实现退出游戏界面之后进入游戏的最高记录重置游戏界面失败后重新加载最记录不会重置任何时候在游戏界面按…

详解缓存淘汰策略:LRU

文章目录缓存淘汰策略LRU核心结构核心操作流程局限性源码走读AddGet缓存淘汰策略 缓存淘汰策略的存在是为了解决 缓存容量有限性 和 高缓存命中率 之间的矛盾。其核心目标是在有限的缓存空间内,尽可能提高缓存命中率 缓存容量有限性:缓存(例…

什么是 Bootloader?怎么把它移植到 STM32 上?

一、Bootloader 是啥?它都干了些啥?想象一下你的 MCU(比如 STM32)是一个小机器人,上电之后第一件事,它不会立马开始“干正事”(运行你的主程序),而是先去运行一个“开场引…

无人机避障——感知篇(Ego_Planner_v2中的滚动窗口实现动态实时感知建图grid_map ROS节点理解与参数调整影响)

处理器:Orin nx 双目视觉传感器:ZED2 实时感知建图方法:Vins Fusion Raycast (VIO与射线投影法感知定位加建图方法) 项目地址:https://github.com/ZJU-FAST-Lab/EGO-Planner-v2 【注意】:建…

26-计组-寻址方式

指令寻址与PC自增一、指令寻址方式定义:寻找下一条将要执行的指令地址的过程。 核心部件:程序计数器(PC),用于指示待执行指令的地址。 执行流程:CPU根据PC值从主存取指令。取指后,PC自动自增&am…

生成式对抗网络(GAN)模型原理概述

生成对抗网络(Generative Adversarial Network, GAN)是一种通过对抗训练生成数据的深度学习模型,由生成器(Generator)和判别器(Discriminator)两部分组成,其核心思想源于博弈论中的零…

Vue和Element的使用

文章目录1.vue 脚手架创建步骤2.vue项目开发流程3.vue路由4.Element1.vue 脚手架创建步骤 创建一个文件夹 vue双击进入文件夹,在路径上输入cmd输入vue ui, 目的:调出图形化用户界面点击创建 9. 10.在vscode中打开 主要目录介绍 src目录介绍 vue项目启动 图形化界面中没有npm…

如何设置直播间的观看门槛,让直播间安全有效地运行?

文章目录前言一、直播间观看门槛有哪几种形式?二、设置直播间的观看门槛,对直播的好处是什么三、如何一站式实现上述功能?总结前言 打造一个安全、高效、互动良好的直播间并非易事。面对海量涌入的观众,如何有效识别并阻挡潜在的…

【SkyWalking】配置告警规则并通过 Webhook 推送钉钉通知

🧭 本文为 【SkyWalking 系列】第 3 篇 👉 系列导航:点击跳转 【SkyWalking】配置告警规则并通过 Webhook 推送钉钉通知 简介 介绍 SkyWalking 告警机制、告警规则格式以及如何通过 webhook 方式将告警信息发送到钉钉。 引入 服务响应超时…

关于 验证码系统 详解

验证码系统的目的是:阻止自动化脚本访问网页资源,验证访问者是否为真实人类用户。它通过各种测试(图像、行为、计算等)判断请求是否来自机器人。一、验证码系统的整体架构验证码系统通常由 客户端 服务端 风控模型 数据采集 四…

微服务集成snail-job分布式定时任务系统实践

前言 从事开发工作的同学,应该对定时任务的概念并不陌生,就是我们的系统在运行过程中能够自动执行的一些任务、工作流程,无需人工干预。常见的使用场景包括:数据库的定时备份、文件系统的定时上传云端服务、每天早上的业务报表数…

依赖注入的逻辑基于Java语言

对于一个厨师,要做一道菜。传统的做法是:你需要什么食材,就自己去菜市场买什么。这意味着你必须知道去哪个菜市场、怎么挑选食材、怎么讨价还价等等。你不仅要会做菜,还要会买菜,职责变得复杂了。 而依赖注入就像是有一…

skywalking镜像应用springboot的例子

目录 1、skywalking-ui连接skywalking-oap服务失败问题 2、k8s环境 检查skywalking-oap服务状态 3、本地iidea启动服务连接skywalking oap服务 4、基于apache-skywalking-java-agent-9.4.0.tgz构建skywalking-agent镜像 4.1、Dockerfile内容如下 4.2、AbstractBuilder.M…

3. java 堆和 JVM 内存结构

1. JVM介绍和运行流程-CSDN博客 2. 什么是程序计数器-CSDN博客 3. java 堆和 JVM 内存结构-CSDN博客 4. 虚拟机栈-CSDN博客 5. JVM 的方法区-CSDN博客 6. JVM直接内存-CSDN博客 7. JVM类加载器与双亲委派模型-CSDN博客 8. JVM类装载的执行过程-CSDN博客 9. JVM垃圾回收…

UnityShader——SSAO

目录 1.是什么 2.原理 3.各部分解释 2.1.从屏幕空间到视图空间 2.2.以法线半球为基,获取随机向量 2.3.应用偏移,并将其转换为uv坐标 2.4.获取深度 2.5.比较并计算贡献 2.6.最后计算 4.改进 4.1.平滑过渡 4.2.模糊 5.变量和语句解释 5.1._D…

【设计模式】外观模式(门面模式)

外观模式(Facade Pattern)详解一、外观模式简介 外观模式(Facade Pattern) 是一种 结构型设计模式,它为一个复杂的子系统提供一个统一的高层接口,使得子系统更容易使用。 外观模式又称为门面模式&#xff0…

【6.1.1 漫画分库分表】

漫画分库分表 “数据量大了不可怕,可怕的是不知道如何优雅地拆分。” 🎭 人物介绍 架构师老王:资深数据库架构专家,精通各种分库分表方案Java小明:对分库分表充满疑问的开发者ShardingSphere师傅:Apache S…