【RabbitMQ 项目】项目概述
项目概述
- 一.角色划分
- 二.服务器模块概述
- 1.本地模块
- 2.网络模块
- 3.服务器模块
- 三.模块详细划分
- 1.服务端
- 2.客户端
一.角色划分
该项目的模型是一个跨主机的生产消费模型,有三种角色:生产者,消费者,中间人。对应就要实现三个大模块:服务端,消息生产客户端,消息消费客户端。服务端要完成一个消息队列服务器模块,这个模块是整个项目的核心
二.服务器模块概述
服务器模块又可以划分成三个模块:
- 本地模块:服务器的核心模块,也可以叫业务模块,对本地消息的增删查,完全自主实现
- 协议模块:数据序列化和反序列化,报文封装与解包。使用 Protobuf 完成前者,使用 muduo 库实例代码中提供的自定义协议完成后者
- 网络模块:字节流接受和发送,以及连接管理。前者由 muduo 库完成,后者自己封装实现
1.本地模块
核心概念:
- 虚拟机:虚拟机是逻辑上的概念,就好比 MySQL 中的数据库,一台 MySQL 服务器上可以有多个数据库,那么一台消息队列服务器上也可以有多台虚拟机。虚拟机是一个逻辑上的集合,里面有很多对象,有哪些呢?有以下这些:
- 消息队列:一个虚拟机中可以有很多不同类型的消息队列,用来存储不同类型的消息
- 交换机:生产者的目的是要将消息发布到指服务器的消息队列中,但有时候想要把一条消息发布到多个队列,比如我现在有一份素材,想要交给消息队列服务器,推送给消费者,去加工素材形成新闻。服务器上有很多类型的队列,比如和音乐素材队列,体育素材队列,我的素材是某体育明星创作了一首歌曲,我想要同时发布到音乐和体育队列,那么我就就要去发布两次,比较繁琐。所以引出了交换机的概念,我不会直接把把消息给消息队列,而是先给交换机,让交换机使用交换路由算法,把消息发布到音乐和体育素材队列中去。
- 绑定:交换机要把消息发送到队列,那么一定要和队列建立联系,Binding 对象就代表它们之间的关联关系。Binding 和交换机的交换路由算法有关,这里不展开谈
- 消息:要传递的内容,需要持久化,除了消息,上述的对象都需要持久化,只不过消息直接写到文件,其它对象用的是 sqlite 数据库
核心接口:
该项目简是了 RabbitMQ 的简化版,服务器上只有一台虚拟机,所以本地模块的核心接口就是虚拟机的核心接口,有如下这些:
- 交换机,消息队列,绑定的创建与销毁
- 发布消息
- 订阅队列和取消订阅
- 确认消息:消息发送给消费者后暂时不会删除,直到消费者手动调用应答的接口,发送应答请求,服务器收到后,调用确认应答的接口,把消息删除
2.网络模块
网络模块主要是进行网络 IO,除此之外,还要还要管理 Connection 和 Channel
核心概念:
Connection 和 Channel:Connection 对应一个 TCP 连接,Channel 是一个逻辑上的信道,一个 Connection 可以包含多个 Channel,Channel 之间数据是独立的。服务器和客户端建立的连接,不是一个个 Connection,而是逻辑上的 Channel,当然 Channel 本质上还是使用 Connection 通信。
为什么要把 Connection 细分:达到长连接的效果,更好地复用 TCP 连接,避免频繁创建和关闭 TCP 连接。我们使用的是 muduo 库来搭建服务器,所以 IO 相关的接口就不用自己实现了,我们要实现的是:
- Connection,Channel 的连接和关闭
网络模块
3.服务器模块
核心接口:
- Connection,Channel 的连接和关闭
- 交换机,队列,绑定的创建和销毁
- 发布消息
- 订阅队列和取消订阅
- 确认消息
你会发现,服务器提供的几个接口,本地模块,网络模块不是也有吗?实际上,这几个接口实现就是使用的是网络模块和本地模块,这就是分层设计的思想。
网络模块,协议模块和本地模块怎么关联起来的呢?muduo 库中的回调机制:TCP 连接建立成功了,回调,创建 Connection,创建信道;TCP 连接关闭,回调,销毁 Connection,销毁信道;缓冲区中的数据读取上来了,回调,去用协议处理器解析字节流,得到结构化的请求,再分发给相应的业务回调函数,业务回调函数中,做增删查,然后构建响应报文,给客户端返回过去
三.模块详细划分
1.服务端
本地模块:
- 数据管理模块
准确的说是虚拟机数据管理模块,因为一台服务器上只有一个虚拟机。包含以下子模块:
- 交换机管理模块
- 队列管理模块
- 绑定管理模块
- 消息管理模块
以上的四种数据都要持久化管理,所以数据管理包含内存和磁盘两方面管理- 路由交换模块
生产者把消息发布给交换机,交换机决定放入哪些队列,这个决定就由路由交换模块提供的算法来完成。路由交换算法,要结合交换机的类型,以及消息中的 routing key,绑定中的 binding key 做规则匹配- 消费者管理模块
这里的消费者是指订阅了某个消息队列的对象,一个用户可能通过消费客户端订阅了多个队列,所以虽然这些订阅都来自同一客户端,但在我服务端看来,有多个消费者。服务端为什么要管理消费者?是因为当有消息发布到队列中,就需要推送给订阅该队列消息的客户端,所以要把消费者管理起来网络模块:
- 信道管理模块
信道是比连接粒度更细的通信通道,一个连接中有一个或多个信道,客户端关闭通信,关闭的是信道而不是连接,信道关闭后,就要把客户端的一个或多个订阅取消- 连接管理模块
Connection 是对 muduo 库中 TcpConnectionPtr 的封装,而后者是对套接字的封装,所以一个 Connection 对应一个 TCP 连接。当连接关闭后,与之关联的信道也要随之关闭。服务器模块:
- 服务器模块
对以上所有模块的整合,并且还使用了 muduo 库,Protobuf,应用层协议等,搭建的一个高并发服务器
2.客户端
- 消费者管理模块——消息订阅客户端才会用到
- 信道管理模块
- 连接管理模块
基于以上三个模块,就可以分别实现发布客户端和订阅客户端
相关文章:
【RabbitMQ 项目】项目概述
项目概述 一.角色划分二.服务器模块概述1.本地模块2.网络模块3.服务器模块 三.模块详细划分1.服务端2.客户端 一.角色划分 该项目的模型是一个跨主机的生产消费模型,有三种角色:生产者,消费者,中间人。对应就要实现三个大模块&…...
【VSCode】VSCode Background 背景插件辅助窗口程序
前排贴上Github项目链接 GitHub窗口项目链接 这是一个基于VSCode上由shalldie上传的background扩展制作的windows窗口程序。 该程序旨在通过窗口程序尽可能的完善该扩展原有的功能。 background - shalldie 的最大优势是我目前仅在其扩展上发现了UseFront的选项,这…...
gdb 前端:kdbg 安装使用
文章目录 1. 前言2. kdbg 安装使用2.1 安装 kdbg2.2 使用 kdbg 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. kdbg 安装使用 2.1 安装 kdbg kdbg 是 gdb 的图形化界面的前端,在 …...
UDP_SOCKET编程实现
文章目录 socket编程接口认识struct sockaddr类 编写一个server服务Client代码查看启动结果代码修正1.获取内核分配给客户端的信息2.修正不匹配ip不能访问的问题 不同机器之间的通信利用xftp将udp_client传给wsl的ubuntu机器进行演示现在模拟在windows下的udp_client代码: 对方…...
【网络】高级IO——阻塞IO和非阻塞IO的实现
目录 一.文件描述符的默认行为——阻塞IO 二.非阻塞IO 2.1.在打开文件或创建套接字时设置非阻塞模式: 2.2.在使用网络I/O接口时请求非阻塞行为: 2.3.fcntl函数 一.文件描述符的默认行为——阻塞IO 在Linux系统中,无论是通过open系统调用…...
ASPICE培训:打造卓越的汽车软件开发能力
随着汽车行业的快速发展和智能化技术的不断演进,汽车软件开发已成为汽车制造过程中不可或缺的一部分。为了确保汽车软件的质量、可靠性和安全性,ASPICE(Automotive SPICE)作为一种国际公认的汽车软件开发过程评估标准,…...
基于Python的人工智能应用案例系列(2):分类
在本篇文章中,我们将探讨分类问题,具体的应用场景是贷款审批预测。通过该案例,我们将学习如何使用Python处理分类问题,训练模型并预测贷款是否会被批准。 案例背景 该数据集包含贷款申请的相关信息,目标是预测贷款是否…...
演示:基于WPF自绘的中国省份、城市、区县矢量地图
一、目的:演示一个基于WPF自绘的中国省份、城市、区县矢量地图 二、效果 国 省 市 三、功能 支持实际经纬度显示 支持平移,缩放等功能 显示中国地图 显示各个省份地图 显示各个省份地图(包含在表格中,包含缩率图) 显…...
同时拥有独显和核显,怎么让应用程序选择使用哪个GPU?
看你现在使用的是核显还是独显 勾选上GPU引擎选项,后面便会标识你所使用的是哪种显卡,如果是独立显卡,就可以免去后续的操作;如果不是,那么请继续接下来的操作。 将你需要使用独显的程序换成gpu1(独显&am…...
C++八股文之面向对象篇
🤖个人主页:晚风相伴-CSDN博客 思维导图链接:面向对象的性质 持续更新中…… 💖如果觉得内容对你有帮助的话,还请给博主一键三连(点赞💜、收藏🧡、关注💚)吧 …...
点云深度学习系列:Sam2Point——基于提示的点云分割
文章:SAM2POINT:Segment Any 3D as Videos in Zero-shot and Promptable Manners 代码:https://github.com/ZiyuGuo99/SAM2Point Demo:https://huggingface.co/spaces/ZiyuG/SAM2Point 1)摘要 文章介绍了SAM2POINT,这是…...
mysql学习教程,从入门到精通,TOP 和MySQL LIMIT 子句(15)
1、TOP 和MySQL LIMIT 子句内容 在SQL中,不同的数据库系统对于限制查询结果的数量有不同的实现方式。TOP 关键字主要用于 SQL Server 和 Access 数据库中,而 LIMIT 子句则主要用于 MySQL、PostgreSQL(通过 LIMIT/OFFSET 语法)、S…...
备战软考Day02-数据结构与算法
1.基本概念与三要素 1.什么是数据 数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 2.数据元素、数据项 数据元素是数据的基本单位,通常作为一个整体进行…...
COMP 6714-Info Retrieval and Web Search笔记week1
哭了哭了,这周唯一能听懂的就这门 目录 IR(Information Retrieval)是什么?IR的基本假设Unstructured (text) vs. structuredDocuments vs. Database Records比较文本(Comparing Text)IR的范围(Dimensions of IR)IR的任…...
C++在Linux实现多线程和多进程的TCP服务器和客户端通信
多进程版本 服务器 #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/wait.h> #include <signal.h> #include <string&…...
音视频开发常见的开源项目汇总
FFmpeg 地址:https://ffmpeg.org/介绍:FFmpeg 是一个非常强大的开源多媒体框架,它可以用来处理视频和音频文件。它支持多种格式的转换、编码、解码、转码、流处理等。FFmpeg 包括了 libavformat、libavcodec、libavutil、libswscale、libpos…...
Java操控Redis (面经之 使用Redis)
操控Redis的工具 ReactiveRedisTemplate 和 RedisTemplate : RedisTemplate: 它是一个通用的模板类,可以使用任何序列化策略来序列化和反序列化键和值。默认情况下,它使用 JdkSerializationRedisSerializer 序列化值,并使用 Strin…...
【计网】从零开始使用UDP进行socket编程 --- 服务端业务实现
在我们每个人都曾经历过“沮丧”时刻里, 如果我们不能对别人说有益的好话, 那我们最好还是什么也别说。 --- 卡耐基 《人性的弱点》--- 从零开始使用UDP进行socket编程 1 前情提要2 单词翻译2.1 业务需求2.2 设计字典类2.3 服务端与客户端逻辑2.4 运…...
正式发售!《黑神话:悟空》背后的技术力量——UE5与实时云渲染
千呼万唤始出来,《黑神话:悟空》终于在今年8月发售了,相信大家都已经玩起来了! 作为国产游戏的画质巅峰之作,《黑神话:悟空》凭借其令人叹为观止的画面质量和游戏体验,赢得了广泛的好评。这一切…...
qt-creator-10.0.2之后版本的jom.exe编译速度慢下来了
1、Qt的IDE一直在升级,qt-creator的新版本下载地址 https://download.qt.io/official_releases/qtcreator/ 2、本人一直用的是qt-creator-10.0.2版本,官网历史仓库可以下载安装包qt-creator-opensource-windows-x86_64-10.0.2.exe https://download.qt…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
