基于动态反馈负载均衡算法的集群聊天服务器--需求分析与设计

F+T 2022-01-09 17:52:25

1. 概述

本项目将实现一个基于改进Nginx负载均衡算法的高并发集群聊天服务器。项目中将使用muduo网络库进行网络模块设计,基于nginx的tcp负载均衡器配置集群,基于发布-订阅的服务器中间件redis消息队列进行服务器间通信,为了进一步提升服务器并发性能,本项目将采用神经网络及遗传算法对nginx原有的负载均衡算法进行改进,以期望能够比传统的Nginx服务器表现出更好的负载均衡能力。

2. 业务概念原型

2.1 业务功能分析

根据对类似该类的调研,本系统应实现以下的业务功能:

  • 用户的注册与登录
  • 用户添加好友以及删除好友
  • 用户创建以及删除群组
  • 用户加入以及退出群组
  • 用户之间的聊天,其中包括:用户发送离线消息,用户发送普通消息,用户发送群聊消息,用户接受消息,用户撤回消息等

接下来我们从以上需求描述中提取用例,判断以上动名词短语是不是用例,要看它们是否满足以下四个必要条件:

  1. 是业务过程
  2. 由某个参与者触发开始
  3. 显式地或隐式地终止于某个参与者
  4. 为某个参与者完成了有用的业务工作

根据以上四个条件,我们可以排除掉一些不是用例的需求描述:比如用户的注册与登录,这一功能是为此后的一系列业务过程服务的,不满足第四个必要条件;用户接受消息不是有某个参与者触发开始,不满足第二个条件;用户撤回消息不是终止于参与者的,不满足第三个条件。综上,我们排除掉“注册”、“登录”、“用户接受消息”和“用户撤回消息”后,剩下的需求描述全部是用例。

得到本系统的用例图如下:

系统用例图

2.2 业务结构分析

业务领域建模是为了让开发团队获取业务领域知识,通过对业务领域的概念进行抽象和分类,区别出类和属性以及它们之间的关系。本项目通过收集领域相关信息、小组成员头脑风暴、对相关知识进行分类等步骤,最后完成业务领域建模,UML类图如下:

在这里插入图片描述

2.3 数据模型设计

结合以上功能及结构分析,得到本系统的数据库表设计如下:

User表,记录系统中用户的基本信息:

字段名称字段类型字段说明约束
idINT用户idPRIMARY KEY、AUTO_INCREMENT
nameVARCHAR(50)用户名NOT NULL, UNIQUE
passwordVARCHAR(50)用户密码NOT NULL
stateENUM('online', 'offline')当前登录状态DEFAULT 'offline'

Friend表,记录用户之间的好友关系:

字段名称字段类型字段说明约束
useridINT用户idNOT NULL、联合主键
friendidINT好友idNOT NULL、联合主键

AllGroup表,记录系统中群组的相关信息:

字段名称字段类型字段说明约束
idINT群组idPRIMARY KEY、AUTO_INCREMENT
groupnameVARCHAR(50)群组名称NOT NULL, UNIQUE
groupdescVARCHAR(200)组功能描述DEFAULT ''

GroupUser表,是AllGroup表与User表的中间表,记录用户之间的好友关系:

字段名称字段类型字段说明约束
groupidINT组idNOT NULL、联合主键
useridINT组员idNOT NULL、联合主键
grouproleENUM('creator', 'normal')组内角色DEFAULT ‘normal’
stateENUM('online', 'offline')当前登录状态DEFAULT 'offline'

OfflineMessage表,记录系统中所有的离线消息:

字段名称字段类型字段说明约束
useridINT用户idNOT NULL
groupidINT消息内容NOT NULL

3. 软件设计方案

3.1 设计模式

本系统中用到了单例模式:
本系统的ChatController在任何时候只需要一个实例,所以应该将其设计成单例模式,具体实现如下:首先将构造函数私有化,避免外部创建ChatController实例对象,然后在类中设计一个公有的接口函数instance(),用其判断并且返回这个唯一的ChatController对象实例,UML类图如下:

在这里插入图片描述

3.2 项目架构

3.2.1 MVC架构

整个系统设计采用MVC架构,实现了视图层与模型层的解耦合,UML类图如下(以UserModel为例):

在这里插入图片描述

3.2.1 基于发布-订阅的消息队列

当ChatServer集群部署多台服务器以后,当登录在不同服务器上的用户进行通信时,如果让各个ChatServer服务器互相之间直接建立TCP连接进行通信,相当于在服务器网络之间进行广播。这样的设计使得各个服务器之间耦合度太高,不利于系统扩展,并且会占用系统大量的socket资源,各服务器之间的带宽压力很大,不能够节省资源给更多的客户端提供服务。

本项目引入中间件消息队列,解耦各个服务器,使整个系统松耦合,提高服务器的响应能力,节省服务器的带宽资源,如下图所示:

在这里插入图片描述

学号:176

...全文
271 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧