核心内容摘要
画质天花板追觅AI电视,春晚出圈真相:Dreamind Pro AI引擎太能打
文章目录
服务端模块
1 持久化数据管理中心模块
2 虚拟机管理模块
3 交换路由模块
4 消费者管理模块
5 信道管理模块
6 连接管理模块
7 Broker 服务器模块
客户端模块
1 消费者管理
2 信道请求模块
3 通信连接模块
项目模块关系图
项目创建大致思路如下
服务端模块
1 持久化数据管理中心模块在数据管理模块中管理交换机队列队列绑定消息等部分数据数据。
交换机管理管理信息名称类型是否持久化标志是否(无人使用时)自动删除标志 其他参数…管理操作恢复历史信息声明删除获取判断是否存在如下图队列管理管理信息名称是否持久化标志是否独有标志是否(无人使用时)自动删除标志其他参数…管理操作恢复历史信息声明删除获取判断是否存在如下图绑定管理管理信息交换机名称队列名称绑定主题管理操作恢复历史信息绑定解绑解除交换机关联绑定信息解除队列关联绑定信息获取交换机关联绑定信息如下图消息管理管理信息属性消息 ID 路由主题持久化模式标志消息内容有效标志持久化需要持久化位置内存中持久化消息长度内存中管理操作恢复历史信息向指定队列新增消息获取指定队列队首消息确认移除消息如下图这几个核心概念数据都需要在内存和硬盘中存储的。
以内存存储为主主要是保证快速查找信息进行处理以硬盘存储为辅主要是保证服务器重启之后之前的信息都可以正常保持
2 虚拟机管理模块因为交换机/队列/绑定都是基于虚拟机为单元整体进行操作的因此虚拟机是对以上数据管理模块的整合模块。
虚拟机管理信息交换机数据管理模块句柄队列数据管理模块句柄绑定数据管理模块句柄消息数据管理模块句柄虚拟机对外操作提供虚拟机内交换机声明交换机删除操作。
提供虚拟机内队列声明队列删除操作。
提供虚拟机内交换机-队列绑定解除绑定操作。
获取交换机相关绑定信息虚拟机管理操作创建虚拟机查询虚拟机删除虚拟机
3 交换路由模块当客户端发布一条消息到交换机后这条消息应该被入队到该交换机绑定的哪些队列中交换路由模块就是决定这件事情的。
在绑定信息中有一个binding_key而每条发布的消息中有一个routing_key能否入队取决于两个要素交换机类型和 key广播将消息入队到该交换机的所有绑定队列中直接将消息入队到绑定信息中binding_key与消息routing_key一致的队列中主题将消息入队到绑定信息中binding_key与routing_key是匹配成功的队列中binding_key是由数字字母下划线构成的, 并且使用 . 分成若干部分。
例如news.music.#这用于表示交换机绑定的当前队列是一个用于发布音乐新闻的队列。
支持 * 和 # 两种通配符 但是 * # 只能作为 . 切分出来的独立部分, 不能和其他 数字字母混用,比如a.*.b是合法的a.*a.b是不合法的* 可以匹配任意一个单词注意是单词不是字母# 可以匹配任意零个或者多个单词注意是单词不是字母routing_key是由数据、字母和下划线构成 并且可以使用 . 划分成若干部分。
例如news.music.pop这用于表示当前发布的消息是一个流行音乐的新闻.
4 消费者管理模块消费者管理是以队列为单元的因为每个消费者都会在开始的时候订阅一个队列的消息当队列中有消息后会将队列消息轮询推送给订阅了该队列的消费者。
因此操作流程通常是从队列关联的消息管理中取出消息从队列关联的消费者中取出一个消费者然后将消息推送给消费者这就是发布订阅中负载均衡的用法。
消费者信息标识订阅队列名称自动应答标志决定了一条消息推送给消费者后是否需要等待收到确认后再删除消息消息处理回调函数指针一个消息发布后调用回调选择消费者进行推送…void(const std::string tag, const BasicProperties p, const std::string body)消费者管理添加删除轮询获取指定队列的消费者移除队列所有消费者等操作
5 信道管理模块本质上在 AMQP 模型中除了通信连接 Connection 概念外还有一个 Channel 的概念Channel 是针对 Connection 连接的一个更细粒度的通信信道多个 Channel 可以使用同一个通信连接 Connection 进行通信但是同一个 Connection 的 Channel 之间相互独立。
而信道模块就是再次将上述模块进行整合提供服务的模块管理信息信道 ID信道关联的消费者信道关联的连接信道关联的虚拟机工作线程池一条消息被发布到队列后需要将消息推送给订阅了对应队列的消费者过程由线程池完成管理操作提供声明删除交换机操作删除交换机的同时删除交换机关联的绑定信息提供声明删除队列操作删除队列的同时删除队列关联的绑定信息消息 消费者信息提供绑定解绑队列操作提供订阅取消订阅队列消息操作提供发布确认消息操作
6 连接管理模块本质上咱们仿照实现的服务器是通过 muduo 库来实现底层通信的而这里的连接管理更多的是对 muduo 库中的 Connection 进行二次封装管理并额外提供项目所需操作。
管理信息连接关联的信道连接关联的 muduo 库 Connection管理操作新增连接删除连接获取连接打开信道关闭信道。
7 Broker 服务器模块整合以上所有模块并搭建网络通信服务器实现与客户端网络通信能够识别客户端请求并提供客户端请求的处理服务。
管理信息虚拟机管理模块句柄消费者管理模块句柄连接管理模块句柄工作线程池句柄muduo 库通信所需元素…
客户端模块
1 消费者管理消费者在客户端的存在感比较低因为在用户的使用角度中只要创建一个信道后就可以通过信道完成所有的操作因此对于消费者的感官更多是在订阅的时候传入了一个消费者标识且当前的简单实现也仅仅是一个信道只能创建订阅一个队列也就是只能创建一个消费者它们一一对应因此更是弱化了消费者的存在。
消费者信息标识订阅队列名称自动应答标志决定了一条消息推送给消费者后是否需要等待收到确认后再删除消息消息处理回调函数指针一个消息发布后调用回调选择消费者进行推送…消费者管理添加删除轮询获取指定队列的消费者移除队列所有消费者等操作
2 信道请求模块与服务端的信道类似客户端这边在 AMQP 模型中也是除了通信连接 Connection 概念外还有一个 Channel 的概念Channel 是针对 Connection 连接的一个更细粒度的通信信道多个 Channel 可以使用同一个通信连接 Connection 进行通信但是同一个 Connection 的 Channel 之间相互独立。
信道管理信息信道 ID信道关联的通信连接信道关联的消费者请求对应的响应信息队列这里队列使用 hash 表以便于查找指定的响应互斥锁条件变量大部分的请求都是阻塞操作发送请求后需要等到响应才能继续但是 muduo 库的通信是异步的因此需要我们自己在收到响应后通过判断是否是等待的指定响应来进行同步信道管理操作提供创建信道操作提供删除信道操作提供声明交换机操作强断言-有则 OK没有则创建提供删除交换机e. 提供创建队列操作强断言-有则 OK没有则创建提供删除队列操作提供交换机-队列绑定操作提供交换机-队列解除绑定操作提供添加订阅操作提供取消订阅操作提供发布消息操作
3 通信连接模块向用户提供一个用于实现网络通信的 Connection 对象从其内部可创建出粒度更轻的 Channel 对象用于与服务端进行网络通信。
管理信息连接关联的实际用于通信的 muduo::net::Connection 连接连接关联的信管理句柄实现信道的增删查连接关联的 EventLoop 异步循环工作线程异步工作线程池用于对收到服务器推送过来的消息进行处理的线程池管理操作提供创建 Channel 信道的操作提供删除 Channel 信道的操作客户端模块
总结
项目模块关系图
项目创建Linux 机器上创建 mq 项目 并且规划开发目录 使用 Makefile 组织项目。
mqdemo编写一些功能用例时所在的目录mqcommon 公共模块代码线程池数据库访问文件访问日志打印pb 相关以及其他的一些琐碎功能模块代码mqclient: 客户端模块代码mqserver: 服务器模块代码mqtest 单元测试mqthird: 用到的第三方库存放目录