项目模块划分

服务端模块:

持久化数据管理中心模块

在数据管理模块中管理交换机,队列,队列绑定,消息等部分数据数据。

\1. 交换机管理:

a. 管理信息:名称,类型,是否持久化标志,是否(无人使用时)自动删除标志,其他参数,…

b. 管理操作:恢复历史信息,声明,删除,获取,判断是否存在

\2. 队列管理:

a. 管理信息:名称,是否持久化标志,是否独有标志,是否(无人使用时)自动删除标志,其他参数,…

b. 管理操作:恢复历史信息,声明,删除,获取,判断是否存在

\3. 绑定管理:

a. 管理信息:交换机名称,队列名称,绑定主题

b. 管理操作:恢复历史信息,绑定,解绑,解除交换机关联绑定信息,解除队列关联绑定信息,获取交换机关联绑定信息

\4. 消息管理:

a. 管理信息

i. 属性:消息 ID, 路由主题,持久化模式标志

ii. 消息内容

iii. 有效标志(持久化需要)

iv. 持久化位置(内存中)

v. 持久化消息长度(内存中)

b. 管理操作:恢复历史信息,向指定队列新增消息,获取指定队列队首消息,确认移除消息

这几个核心概念数据都需要在内存和硬盘中存储的。

• 以内存存储为主,主要是保证快速查找信息进行处理

• 以硬盘存储为辅,主要是保证服务器重启之后,之前的信息都可以正常保持

虚拟机管理模块

因为交换机/队列/绑定都是基于虚拟机为单元整体进行操作的,因此虚拟机是对以上数据管理模块的整合模块。

\1. 虚拟机管理信息:

a. 交换机数据管理模块句柄

b. 队列数据管理模块句柄

c. 绑定数据管理模块句柄

d. 消息数据管理模块句柄

\2. 虚拟机对外操作:

a. 提供虚拟机内交换机声明,交换机删除操作。

b. 提供虚拟机内队列声明,队列删除操作。

c. 提供虚拟机内交换机-队列绑定,解除绑定操作。

d. 获取交换机相关绑定信息

\3. 虚拟机管理操作:

a. 创建虚拟机

b. 查询虚拟机

c. 删除虚拟机

交换路由模块

当客户端发布一条消息到交换机后,这条消息,应该被入队到该交换机绑定的哪些队列中?交换路由模块就是决定这件事情的。

在绑定信息中有一个 binding_key,而每条发布的消息中有一个 routing_key,能否入队取决于两个要素:交换机类型和 key

\1. 广播:将消息入队到该交换机的所有绑定队列中

\2. 直接:将消息入队到绑定信息中 binding_key 与消息 routing_key 一致的队列中

\3. 主题:将消息入队到绑定信息中 binding_key 与 routing_key 是匹配成功的队列中

binding_key

是由数字字母下划线构成的, 并且使用 . 分成若干部分。

例如:news.music.#,这用于表示交换机绑定的当前队列是一个用于发布音乐新闻的队列。

• 支持 * 和 # 两种通配符, 但是 * # 只能作为 . 切分出来的独立部分, 不能和其他数字字母混用,

○ 比如 a.*.b 是合法的, a.*a.b 是不合法的

○ * 可以匹配任意一个单词(注意是单词不是字母)

○ # 可以匹配任意零个或者多个单词(注意是单词不是字母)

routing_key

是由数据、字母和下划线构成, 并且可以使用 . 划分成若干部分。

例如:news.music.pop,这用于表示当前发布的消息是一个流行音乐的新闻.

消费者管理模块

消费者管理是以队列为单元的,因为每个消费者都会在开始的时候订阅一个队列的消

息,当队列中有消息后,会将队列消息轮询推送给订阅了该队列的消费者。

因此操作流程通常是,从队列关联的消息管理中取出消息,从队列关联的消费者中取

出一个消费者,然后将消息推送给消费者(这就是发布订阅中负载均衡的用法)。

\1. 消费者信息:

a. 标识

b. 订阅队列名称

c. 自动应答标志(决定了一条消息推送给消费者后,是否需要等待收到确认后

再删除消息)

d. 消息处理回调函数指针(一个消息发布后调用回调,选择消费者进行推送…)

i. void(const std::string& tag, const BasicProperties& p,

const std::string& body)

\2. 消费者管理:添加,删除,轮询获取指定队列的消费者,移除队列所有消费者等

操作

信道管理模块

本质上,在 AMQP 模型中,除了通信连接 Connection 概念外,还有一个 Channel 的

概念,Channel 是针对 Connection 连接的一个更细粒度的通信信道,多个 Channel 可

以使用同一个通信连接 Connection 进行通信,但是同一个 Connection 的 Channel 之

间相互独立。

而信道模块就是再次将上述模块进行整合提供服务的模块

\1. 管理信息:

a. 信道 ID

b. 信道关联的消费者

c. 信道关联的连接d. 信道关联的虚拟机

e. 工作线程池(一条消息被发布到队列后,需要将消息推送给订阅了对应队列

的消费者,过程由线程池完成)

\2. 管理操作:

a. 提供声明&删除交换机操作(删除交换机的同时删除交换机关联的绑定信息)

b. 提供声明&删除队列操作(删除队列的同时,删除队列关联的绑定信息,消息,

消费者信息)

c. 提供绑定&解绑队列操作

d. 提供订阅&取消订阅队列消息操作

e. 提供发布&确认消息操作

连接管理模块

本质上,咱们仿照实现的服务器是通过 muduo 库来实现底层通信的,而这里的连接管理,更多的是对 muduo 库中的 Connection 进行二次封装管理,并额外提供项目所需操作。

\1. 管理信息:

a. 连接关联的信道

b. 连接关联的 muduo 库 Connection

\2. 管理操作:新增连接,删除连接,获取连接,打开信道,关闭信道。

Broker 服务器模块

整合以上所有模块,并搭建网络通信服务器,实现与客户端网络通信,能够识别客户端请求,并提供客户端请求的处理服务。

管理信息:

a. 虚拟机管理模块句柄

b. 消费者管理模块句柄

c. 连接管理模块句柄

d. 工作线程池句柄

e. muduo 库通信所需元素…

客户端模块:

消费者管理

消费者在客户端的存在感比较低,因为在用户的使用角度中,只要创建一个信道后,

就可以通过信道完成所有的操作,因此对于消费者的感官更多是在订阅的时候传入了

一个消费者标识,且当前的简单实现也仅仅是一个信道只能创建订阅一个队列,也就

是只能创建一个消费者,它们一一对应,因此更是弱化了消费者的存在。

\1. 消费者信息:

a. 标识

b. 订阅队列名称

c. 自动应答标志(决定了一条消息推送给消费者后,是否需要等待收到确认后

再删除消息)

d. 消息处理回调函数指针(一个消息发布后调用回调,选择消费者进行推送…)

\2. 消费者管理:添加,删除,轮询获取指定队列的消费者,移除队列所有消费者等

操作

信道请求模块

与服务端的信道类似,客户端这边在 AMQP 模型中,也是除了通信连接 Connection

概念外,还有一个 Channel 的概念,Channel 是针对 Connection 连接的一个更细粒度

的通信信道,多个 Channel 可以使用同一个通信连接 Connection 进行通信,但是同一

个 Connection 的 Channel 之间相互独立。

\1. 信道管理信息:

a. 信道 ID

b. 信道关联的通信连接

c. 信道关联的消费者

d. 请求对应的响应信息队列(这里队列使用 hash 表,以便于查找指定的响应)

e. 互斥锁&条件变量(大部分的请求都是阻塞操作,发送请求后需要等到响应才

能继续,但是 muduo 库的通信是异步的,因此需要我们自己在收到响应后,通过

判断是否是等待的指定响应来进行同步)

\2. 信道管理操作:

a. 提供创建信道操作

b. 提供删除信道操作

c. 提供声明交换机操作(强断言-有则 OK,没有则创建)

d. 提供删除交换机e. 提供创建队列操作(强断言-有则 OK,没有则创建)

f. 提供删除队列操作

g. 提供交换机-队列绑定操作

h. 提供交换机-队列解除绑定操作

i. 提供添加订阅操作

j. 提供取消订阅操作

k. 提供发布消息操作

通信连接模块

向用户提供一个用于实现网络通信的 Connection 对象,从其内部可创建出粒度更轻的

Channel 对象,用于与服务端进行网络通信。

\1. 管理信息:

a. 连接关联的实际用于通信的 muduo::net::Connection 连接

b. 连接关联的信管理句柄(实现信道的增删查)

c. 连接关联的 EventLoop 异步循环工作线程

d. 异步工作线程池(用于对收到服务器推送过来的消息进行处理的线程池)

\2. 管理操作:

a. 提供创建 Channel 信道的操作

b. 提供删除 Channel 信道的操作

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

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

相关文章

小白也能看懂!OpenCV 从零开始安装配置全教程(包含Windows / Ubuntu / 树莓派)系统详细操作配置教程

小白也能看懂!OpenCV 从零开始安装配置全教程(包含Windows / Ubuntu / 树莓派)系统详细操作配置教程 摘要 本教程是面向“小白也能懂”的OpenCV安装与配置全攻略,涵盖Windows、Ubuntu和树莓派三大平台,真正实现“从零…

【华为云】容器镜像服务 SWR 详解:从上传下载到 ModelArts 应用

前言 华为云容器镜像服务(Software Repository for Container,简称 SWR)是华为云提供的企业级容器镜像仓库服务。它支持 Docker 镜像的存储、管理和分发,为容器化应用提供安全可靠的镜像托管服务。本文将详细介绍 SWR 的核心功能…

计算机网络知识点梳理(一)概述:组成、发展、性能、体系结构等

目录 一、互联网 (1)特点 (2)网络的组成 (3)网络、互连网、因特网 (4)互联网发展的三个阶段 (5)标准化 (6)组成 二、计算机网…

不同行业视角下的数据分析

声明:以下部分内容含AI生成 基于行业维度来划分数据分析岗位,可以帮助我们更好地理解不同行业对数据分析技能、业务知识和职业发展的独特要求。 目录 一、总体框架:为什么行业维度如此重要? 二、主要行业划分及详细讲解 1. 互联…

「CTF」青少年CTF·雏形系统

题目&#xff1a; 解题过程 尝试随便输入点什么&#xff0c;没有结果 使用dirsearch扫描网址目录 可以看到有扫描到一个www.zip&#xff0c;zip文件大概率有需要的东西 网址后加上www.zip就能对该文件进行下载 文件解压缩后如下 打开qsnctf.php&#xff0c;代码内容如下 <…

Java实战项目演示代码及流的使用

project 准备牌->洗牌->发牌 import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.TreeSet;public class PokerGameplus {static HashMap<Integer,String> hs new HashMap<>();static ArrayList<Int…

使用 OpenLayers + 高德瓦片源实现旅游足迹地图

作为一个热爱旅行的开发者&#xff0c;我一直想要一个能够记录和展示自己旅游足迹的功能。市面上虽然有很多地图应用&#xff0c;但大多功能复杂&#xff0c;而我只需要一个简单直观的方式来标记去过的地方和想去的地方。 于是我决定在自己的个人网站上实现一个旅游足迹地图功…

Redis基础(含常用命令等以快速入门)

一、初步认识 1、NoSQL SQL 关系型数据库&#xff08;表结构&#xff0c;强一致&#xff09;NoSQL 非关系型数据库&#xff08;灵活结构&#xff0c;最终一致&#xff0c;水平扩展爽&#xff09; 维度SQL&#xff08;关系型&#xff09;NoSQL&#xff08;非关系型&#xf…

OSPF特殊区域、路由汇总及其他特性

OSPF路由器需要同时维护域内路由、域间路由、外部路由信息数据库。当网络规模不断扩大时&#xff0c;LSDB规模也不断增长。如果某区域不需要为其他区域提供流量中转服务&#xff0c;那么该区域内的路由器就没有必要维护本区域外的链路状态数据库。OSPF通过划分区域可以减少网络…

在缓存Cacheable注解中Key值如何使用常量

1.在常量类中定义商品缓存空间和商品缓存KEY public interface CacheConstants {/*** Goods Cache Name*/String QNA_GOODS_CACHE "qna-goods";/*** Goods Cache key*/String QNA_GOODS_CACHE_KEY "qna_goods:";/*** Order Cache Name*/String QNA_ORDER…

sklearn聚类

在此将sklearn官网的一张关于聚类算法比较的图片放过来。 下面的表格是根据sklearn官网翻译而来。 方法名称 参数 可扩展性 应用场景 几何度量(距离) MiniBatchKMeans 簇的数量 非常适合处理大量样本和中等数量的簇(使用MiniBatch时) 通用型,适用于簇大小均匀、几何形状平…

Recharts:React图表库,组件化设计助力高效数据可视化开发

你写前端项目时有没有卡过数据可视化的坑&#xff1f;比如要做个用户增长折线图&#xff0c;查了半天原生 JS 教程&#xff0c;写了几十行代码&#xff0c;结果要么坐标轴对不上&#xff0c;要么数据渲染不出来&#xff1b;或者用了某个图表库&#xff0c;文档全是英文&#xf…

Java 中String类的常用方法

Java 中的 String 类提供了丰富的方法用于字符串操作&#xff0c;以下是最常用的一些方法分类总结&#xff1a; 一、获取字符串信息length()&#xff1a;返回字符串长度&#xff08;字符个数&#xff09; String s "hello"; int len s.length(); // len 5charAt(i…

【记录】Docker|Docker内部访问LInux主机上的Ollama服务

部分内容参考自&#xff1a;使得 docker 容器内部可以访问宿主机的 ollama 服务_docker 访问 ollama-CSDN 博客&#xff0c;补充添加了更多的细节&#xff0c;也补充了一个更加简单的方案。 我测试的系统版本&#xff1a;Ubuntu 24.04.2 LTS noble&#xff0c;查看方式是指令 l…

数据库物理外键与逻辑外键全解析

一、核心概念 1. 物理外键 (Physical Foreign Key) 物理外键是数据库层面通过语法明确创建的外键约束。它是由数据库管理系统&#xff08;DBMS&#xff09;本身&#xff08;如 MySQL, PostgreSQL, Oracle&#xff09;来强制实现的。 它是什么&#xff1a;数据库表结构的一部分&…

Vue3入门到实战,最新版vue3+TypeScript前端开发教程,创建Vue3工程,笔记03

笔记03 一、创建Vue3项目 1.1、创建方式 使用vue-cli创建使用vite创建&#xff08;推荐&#xff09;Vue3官网创建项目文档 两种创建方式&#xff0c;推荐使用第二种。vue-cli是基于webpack实现的&#xff0c;vite是新一代前端构建工具。 2.1、vue3项目结构

企业如何利用群晖 NAS 构建高效数据备份与容灾体系

在数字化转型的过程中&#xff0c;企业数据已成为核心资产。然而&#xff0c;勒索病毒攻击、硬件故障、操作失误以及自然灾害等风险&#xff0c;都可能导致数据丢失甚至业务中断。如何构建一个高效、安全、可恢复的数据备份与容灾体系&#xff0c;已成为企业 IT 管理的关键课题…

关于在pycharm终端连接服务器

1、先为每个项目创建一个虚拟环境2、使用命令下载torchpip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple安装之后发现安装在了本地&#xff0c;我需要安装到服务器里面&#xff0c;此时可以把本地的删除&#xff0c;因为是默认安装到c盘&#xff0c;除非你指定路…

CSS 继承 (Inheritance)

一、核心概念CSS 继承是指某些 CSS 属性如果被设置在父元素上&#xff0c;其值会自动流向&#xff08;应用到&#xff09;其所有后代元素&#xff08;子、孙元素等&#xff09;的特性。核心价值&#xff1a;通过将样式声明应用于祖先元素&#xff0c;可以避免在所有后代元素上重…

UGUI源码剖析(15):Slider的运行时逻辑与编辑器实现

UGUI源码剖析&#xff08;第十五章&#xff09;&#xff1a;Slider的运行时逻辑与编辑器实现 在之前的章节中&#xff0c;我们已经深入了UGUI众多核心组件的运行时源码。然而&#xff0c;一个完整的Unity组件&#xff0c;通常由两部分构成&#xff1a;定义其在游戏世界中行为的…