571
社区成员
发帖
与我相关
我的任务
分享本项目将实现一个基于改进Nginx负载均衡算法的高并发集群聊天服务器。项目中将使用muduo网络库进行网络模块设计,基于nginx的tcp负载均衡器配置集群,基于发布-订阅的服务器中间件redis消息队列进行服务器间通信,为了进一步提升服务器并发性能,本项目将采用神经网络及遗传算法对nginx原有的负载均衡算法进行改进,以期望能够比传统的Nginx服务器表现出更好的负载均衡能力。
根据对类似该类的调研,本系统应实现以下的业务功能:
接下来我们从以上需求描述中提取用例,判断以上动名词短语是不是用例,要看它们是否满足以下四个必要条件:
根据以上四个条件,我们可以排除掉一些不是用例的需求描述:比如用户的注册与登录,这一功能是为此后的一系列业务过程服务的,不满足第四个必要条件;用户接受消息不是有某个参与者触发开始,不满足第二个条件;用户撤回消息不是终止于参与者的,不满足第三个条件。综上,我们排除掉“注册”、“登录”、“用户接受消息”和“用户撤回消息”后,剩下的需求描述全部是用例。
得到本系统的用例图如下:

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

结合以上功能及结构分析,得到本系统的数据库表设计如下:
User表,记录系统中用户的基本信息:
| 字段名称 | 字段类型 | 字段说明 | 约束 |
|---|---|---|---|
| id | INT | 用户id | PRIMARY KEY、AUTO_INCREMENT |
| name | VARCHAR(50) | 用户名 | NOT NULL, UNIQUE |
| password | VARCHAR(50) | 用户密码 | NOT NULL |
| state | ENUM('online', 'offline') | 当前登录状态 | DEFAULT 'offline' |
Friend表,记录用户之间的好友关系:
| 字段名称 | 字段类型 | 字段说明 | 约束 |
|---|---|---|---|
| userid | INT | 用户id | NOT NULL、联合主键 |
| friendid | INT | 好友id | NOT NULL、联合主键 |
AllGroup表,记录系统中群组的相关信息:
| 字段名称 | 字段类型 | 字段说明 | 约束 |
|---|---|---|---|
| id | INT | 群组id | PRIMARY KEY、AUTO_INCREMENT |
| groupname | VARCHAR(50) | 群组名称 | NOT NULL, UNIQUE |
| groupdesc | VARCHAR(200) | 组功能描述 | DEFAULT '' |
GroupUser表,是AllGroup表与User表的中间表,记录用户之间的好友关系:
| 字段名称 | 字段类型 | 字段说明 | 约束 |
|---|---|---|---|
| groupid | INT | 组id | NOT NULL、联合主键 |
| userid | INT | 组员id | NOT NULL、联合主键 |
| grouprole | ENUM('creator', 'normal') | 组内角色 | DEFAULT ‘normal’ |
| state | ENUM('online', 'offline') | 当前登录状态 | DEFAULT 'offline' |
OfflineMessage表,记录系统中所有的离线消息:
| 字段名称 | 字段类型 | 字段说明 | 约束 |
|---|---|---|---|
| userid | INT | 用户id | NOT NULL |
| groupid | INT | 消息内容 | NOT NULL |
本系统中用到了单例模式:
本系统的ChatController在任何时候只需要一个实例,所以应该将其设计成单例模式,具体实现如下:首先将构造函数私有化,避免外部创建ChatController实例对象,然后在类中设计一个公有的接口函数instance(),用其判断并且返回这个唯一的ChatController对象实例,UML类图如下:

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

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

学号:176