集群聊天服务器——逻辑梳理

网络聊天服务器项目,该项目分为4个模块:

  1. 首先是网络模块:我使用了muduo高性能网络库,解耦合网络与业务之间这两部分代码,可以更加专注与业务的功能开发
  2. 其次是服务层模块:我使用了基于C++11的技术比如绑定器和map,绑定器实现了用户发送的消息id类型回调业务功能函数的机制(当网络i/o发送消息请求后,通过解析json消息获取消息id 回调业务功能函数)
  3. 然后是数据存储模块:我使用了MySQL数据库存储关键的信息(用户账户、离线消息列表、群组信息、好友列表等)由客户端的功能请求进行增删改查

以上是单机服务器的模块设计,但是单机服务器的并发数量是有限的,所以我采用了集群服务器经行并发能力扩展

    4.最后在多台服务器部署,基于Tcp 协议搭建的C/S 通信,所以我使用了Nginx Tcp负载均衡,保持长连接状态,并且引入Redis 的发布订阅功能实现跨服务器间通信

1. 客户端:

1.1. 两个模块:

1.1.1. 负责用户登录、注册、退出功能

作为客户端连接服务器成功后的首界面展示:提供以上三种服务

客户端设计模式:主线线程专注于信息的发送、子线程负责接受信息

将具体功能的所需参数进行json(key-value键值对存储文本形式)序列化发送给服务器

个别服务需要服务器返回方法返回值状态信息,(登录成功、信息注册成功)?多线程协调实现

由主线程发送后,阻塞获取信号量,子线程此时接受服务器返回的json对象,由json中的服务方法枚举id,分类细化具体的功能实现业务逻辑,将服务方法调用的状态写入最后将信号量释放,主函数则可以通过子线程写入的状态进行下一步工作

登陆成功后进入功能菜单:

1.1.2. 负责聊天服务器业务功能:添加好友信息、创建群组、加入群组、单人聊天、群组聊天

将功能函数处理为map表形式<存储函数方法名称,方法绑定器>,循环处理客户端的输入的方法请求,在循环中未使用switch_case而是map+bind回调,适应于程序开发中的开闭原则,对修改关闭,对开发扩展开放;

该部分函数主要处理用户的功能以及输入的参数,封装为json 对象(服务器协商的通信规则:方法枚举id的标识,与方法请求一致的参数列表)发送给服务器

auto it = commandHandlerMap.find(command);
if (it == commandHandlerMap.end())
//error// 调用相应命令的事件处理回调,mainMenu对修改封闭,添加新功能不需要修改该函数
it->second(clientfd, commandbuf.substr(idx + 1, commandbuf.size() - idx));
// 调用命令处理方法

 

 

2. 服务器:

2.1. 服务器需要处理信息转发、功能性数据的存储、查询、更新服务

解决基于数据库的功能服务问题:MySQL

解决高并发场景下数据收发问题:muduo 静态网络库

解决跨服务器通信问题 :Redis发布订阅问题

解决负载均衡问题:Nginx_基于Tcp长连接的负载均衡问题

2.2. 主要基于以上内容将服务器划分出:

server、service、db、model、redis、public 六个模块

2.2.1. server——muduo网络:

基于epoll+多线程的机制实现高并发需求

在该模块中设置四个工作线程,其中一个处理连接回调,在连接异常的场景下关闭连接,余下三个线程为工作线程,完成将接收的字符基于json-parse反序列化发送给service,基于服务方法id,回调具体的处理函数

2.2.2. db:

数据库的接口API ,创建初始化、数据库连接、

数据更新、数据查询query

// 初始化数据库连接_conn = mysql_init(nullptr);// 释放数据库连接资源
if (_conn != nullptr)mysql_close(_conn);// 连接数据库MYSQL *p = mysql_real_connect(_conn, server.c_str(), user.c_str(),password.c_str(), dbname.c_str(), 3306, nullptr, 0);// 更新操作
mysql_query(_conn, sql.c_str())// 查询操作
mysql_query(_conn, sql.c_str())return mysql_use_result(_conn);
2.2.3. model:

该模块用来实现用户需求与服务器数据库交互增、删、改、查问题

以举例:

// 添加好友关系,在好友数据表中添加一条记录
sprintf(sql, "insert into friend values(%d, %d)", userid, friendid);// 返回用户好友列表,联合查询用户表和好友表,将结果插入vector并用返回
sprintf(sql, "select a.id,a.name,a.state from user a /
inner join friend b on b.friendid = a.id where b.userid=%d", userid);// 删除用户的离线消息,删除离线列表的一条信息
sprintf(sql, "delete from offlinemessage where userid=%d", userid);// 更新用户的状态信息
sprintf(sql, "update user set state = '%s' where id = %d",/user.getState().c_str(), user.getId());
2.2.4. redis:

基于Redis发布订阅问题,解决跨服务器通信问题:

初始化发布上下文、订阅上下文,进行连接、向指定chennel 发布、订阅,结束订阅、断开连接

2.2.5. service:

设置方法map集合<方法id,方法handler绑定器>

设置用户连接map集合<用户id,连接TcpConnectionPtr接口>,将所有方法的枚举值,函数方法绑定器插入map表,连接Redis服务器、MySQL 数据库

基于具体的方法选择,结合底层存储的用户数据(查询、插入、删除)完成登录、注册、注销用户;

结合model模块下的函数具体结合用户需求完善功能函数;

聊天服务:查询用户的连接信息,在本服务器时转发聊天信息,不在本台服务器,检查数据库的用户登陆状态,未登录存储离线信息表,登录则发布到Redis的发布队列

登录问题:(最复杂)

从json对象解析得到登录id、密码

在用户信息表中查询该id的所属对象并比对密码,不一致将封装json返回原因;

一致时检查登陆状态避免重复登陆,继而更新用户的登陆状态;

在用户登录map中插入其连接信息;

订阅Redis对该id 为chennel的消息;

打印该用户的离线消息;

将该对象的好友信息封装为vector存储的json序列化文本信息,作为返回的json-response对象key-value 存储的对象之一;群组信息如上;

最后返回最后的json-response序列化内容。

2.2.6. public:

保存服务方法的枚举信息,将每一服务名称与id一一对应

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

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

相关文章

前沿技术与未来发展第一节:C++与机器学习

第六章&#xff1a;前沿技术与未来发展 第一节&#xff1a;C与机器学习 1. C在机器学习中的应用场景 C在机器学习中的应用优势主要体现在高效的内存管理、强大的计算能力和接近底层硬件的灵活性等方面。以下是 C 在机器学习领域的几个主要应用场景&#xff1a; 1.1 深度学习…

项目解决方案:在弱网(低带宽、高延迟、有丢包的网络)环境下建设视频监控平台的设计方案(下)

目录 一、需求分析 1、业务需求分析 2、功能需求分析 二、建设目标 三、设计原则 四、标准规范建设 五、系统架构 1、视频接入管理系统 2、资源管理调度平台 3、视频转码解码服务器 4、媒体输出引擎 5、媒体录制引擎 6、智能联动引擎 7、API开发引擎 六、部署架构 七、产…

操作系统笔记(四)进程间通信,竞争条件与解决方案

进程间通信(IPC) 如何在进程间传递信息? 如何防止两个进程冲突&#xff1f; 如何实现进程执行的先后顺序&#xff1f; 竞争条件&#xff08;Race conditions&#xff09; 竞争条件&#xff08;Race conditions&#xff09; 多个进程访问一个共享数据&#xff0c;而数据最…

jmeter的基本使用

Jmeter基本使用 一、变量 1.用户定义变量 2.用户参数 二、函数 1.计数器${__counter(,)} 2.时间函数 3.加密函数${__digest(,,,,)} 4. 整数相加${__intSum(,,)} 5.属性函数&#xff0c;${__P(,)}、${__property(,,)}、${__setProperty(,,)} 6.V函数 三、获取响应数据…

Go语言基础教程:指针

在 Go 中&#xff0c;函数参数默认是按值传递的。若要改变变量的原始值&#xff0c;可以使用指针。本教程将通过示例代码来演示如何使用值传递和指针传递。 package mainimport "fmt"// 传值方式 - 函数内改变 ival 的值不会影响原始变量 func zeroval(ival int) {i…

2024年优秀的天气预测API

准确、可操作的天气预报对于许多组织的成功至关重要。 事实上&#xff0c;在整个行业中&#xff0c;天气条件会直接影响日常运营&#xff0c;包括航运、按需、能源和供应链&#xff08;仅举几例&#xff09;。 以公用事业为例。根据麦肯锡的数据&#xff0c;在 1.4 年的时间里…

HCIP-HarmonyOS Application Developer V1.0 笔记(二)

类Web开发范式自定义组件基本用法 自定义组件通过element引入到宿主页面。 Props自定义属性 自定义属性支持类型 String&#xff0c;Number&#xff0c;Boolean&#xff0c;Array&#xff0c;Object。 命名规范&#xff1a; 命名时禁止以on、、on:、grab:等保留关键字为开头…

天润融通突破AI客服局限,三大关键提升文本机器人问答效果

近期&#xff0c;AI客服再次登上热搜&#xff0c;引发网友集体吐槽&#xff0c;比如AI客服虽然态度客气&#xff0c;但听不懂客户诉求&#xff0c;回答问题驴唇不对马嘴&#xff0c;解决不了问题...... 更有网友将这些问题升级到&#xff0c;企业就是不想解决问题才交给AI客服…

aarch64-opencv341交叉编译,并在arm上部署helloopencv

背景 当需要在jetson xavier nx或者rk 3562等平台上开发关于视觉检测的工程时&#xff0c;由于arm板子资源不足或者不能联网等原因&#xff0c;通常在虚拟机上利用交叉编译器编译得到可执行程序&#xff0c;然后部署到arm板上。 aarch64-opencv341交叉编译 ubuntu虚拟机中先…

mysql中redolog、binlog

我们中说删库跑路&#xff0c;那么数据库删除后&#xff0c;里面的数据怎么恢复呢&#xff1f; 这里就涉及到了redolog和binlog了 一、什么是存储引擎和缓冲池 存储引擎是 MySQL 中直接与磁盘交互部分。也是存储引擎读写数据的最小单位&#xff0c;一个页里可以有一条或多条…

【分布式技术】分布式事务深入理解

文章目录 概述产生原因关键点 分布式事务解决方案3PC3PC的三个阶段&#xff1a;3PC相比于2PC的改进&#xff1a;3PC的缺点&#xff1a; TCCTCC事务的三个阶段&#xff1a;TCC事务的设计原则&#xff1a;TCC事务的适用场景&#xff1a;TCC事务的优缺点&#xff1a;如何解决TCC模…

字节青训-找出最长的神奇数列

问题描述 小F是一个好学的中学生&#xff0c;今天他学习了数列的概念。他在纸上写下了一个由 0 和 1 组成的正整数序列&#xff0c;长度为 n。这个序列中的 1 和 0 交替出现&#xff0c;且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。例如&#xff0c;10101 是一…

华为配置BFD状态与接口状态联动实验

组网图形 图1 配置BFD状态与接口状态联动组网图 BFD简介配置注意事项组网需求配置思路操作步骤配置文件 BFD简介 为了减小设备故障对业务的影响&#xff0c;提高网络的可靠性&#xff0c;网络设备需要能够尽快检测到与相邻设备间的通信故障&#xff0c;以便及时采取措施&…

解压缩工具详解:ZArchive对比解压专家

ZArchiver 和解压专家在手机版解压缩工具市场中都占据着重要地位&#xff0c;深受用户喜爱。 ZArchiver 是一款功能强大的解压缩文件应用程序。它支持创建多种格式的压缩文件&#xff0c;如 7z (7zip)、zip、bzip2 (bz2)、gzip (gz)、XZ、tar 等&#xff1b;同时支持解压众多格…

CPU算法分析LiteAIServer视频智能分析平台噪声检测功能在视频监控中的应用与优势

在视频监控系统中&#xff0c;噪声问题一直是影响视频画面清晰度和可用性的关键因素。这些噪声可能源于多种因素&#xff0c;如低光环境、摄像机传感器的高灵敏度或编码压缩过程中的失真等。为了应对这些挑战&#xff0c;CPU算法分析LiteAIServer引入了噪声检测功能&#xff0c…

MATLAB实现蝙蝠算法(BA)

MATLAB实现蝙蝠算法(BA) 1.算法介绍 蝙蝠算法&#xff08;简称BA&#xff09;是一种受微型蝙蝠回声定位机制启发的群体智能算法&#xff0c;由Xin-She Yang于2010年提出。这种算法模拟了微型蝙蝠通过向周围环境发出声音并监听回声来识别猎物、避开障碍物以及追踪巢穴的行为。…

git push到远程怎么回退

git push到远程服务器想继续修改&#xff0c;你必须要回退然后在此提交。而且需要保留本地的修改文件。 下面给你一些git命令&#xff0c;回退很简单。 按照下面的流程操作就行&#xff1a; 1.查看提交历史 首先&#xff0c;使用git log命令查看提交历史。可以使用以下命令显…

邮件系统SSL加密传输,保护你的电子邮件免受网络威胁

在互联网的浪潮中&#xff0c;企业数字化转型的步伐不断加快。企业邮箱作为数字化应用的重要组成部分&#xff0c;已成为员工沟通、协同工作和企业管理的关键工具。但是在公共网络安全性普遍较弱的背景下&#xff0c;黑客容易侵入企业网络&#xff0c;监控流量&#xff0c;截获…

跨平台开发支付组件,实现支付宝支付

效果图&#xff1a; custom-payment &#xff1a; 在生成预付订单之后页面中需要弹出一个弹层&#xff0c;弹层中展示的内容为支付方式&#xff08;渠道&#xff09;&#xff0c;由用户选择一种支付方式进行支付。 该弹层组件是以扩展组件 uni-popup 为核心的&#xff0c;关于…

usb学习笔记

1 学习链接 https://zhuanlan.zhihu.com/p/683251257https://zhuanlan.zhihu.com/p/683251257控制传输固定使用端点0 &#xff0c;枚举过程使用大量的控制传输&#xff0c;可参考后文中枚举过程的实际报文。控制传输为了保证配置数据的传输的有效性&#xff0c;使用了指令再确…