1、 系统架构特点
1)、系统的数据库是分布式存储设计的,支持海量级数据存储;
2)、引入Session Server和Cache实现,从而来避免频繁数据库访问对系统造成性能瓶颈;
3)、系统是多线程的、异步的
4)、系统是可被实时监控的,可以实时隔离
5)、系统是安全的,用户在登录系统后,系统会生成一个随机的、不可伪做的加密串,
后面操作需要获取用户的信息只有通过些加密串来获取;
6)、系统的扩展是非常灵活的,所有业务功能均可作为组件方式以Webservice标准接口发布出去,
类似 SOA 的作法。
2、 分布式存储设计
2.1 索引数据库表设计
2.1.1、首先建立有规则的,可分段管理的ID段
2.1.2、xxx ,因为涉及到商业秘密,所有先去掉了
2.2 数据库分布式存储设计
数据库是基于分布式存储设计的,可以支持海量级数据存储;
数据库是通过“用户号码段”的定义,对用户的数据进行分散存储;
而号码段表的数据如下:
id_range mysql instance
1000~5555555段 192.168.1.5
5555556~10000000段 192.168.1.6
2.3 Session Server 分布式存储设计
以分区做法存储 Session 的数据,用户在进入游戏之前,先选择一个区再进入。
这样用户的所有数据就存在选择的Session Server上。
每个Sesson Server有用户数量要求,当达到一定的用户数量,将拒绝其他用户进入。
3、 安全性
3.1:存储加密
用户在登录系统后,系统会生成一个随机的、不可伪做的加密串,即生成一个在线用户及此用户对应的Key(加密串),
其他操作通过此Key来获取用户的信息,包括各人物及人物属性;
加密串的生成规则如下:
由ID+客户端ip+随机码+当前时间(毫秒)组成,然后通过由Md5加密生成。
这个加密串只会给一个用户一次登录使用,过期将不再有效。
3.2:防止恶意攻击
用户登录成功游戏之后,所有操作都会异步记录到主库的日志表中,已记录用户每天做了什么操作。
这份数据是每天一份,同样也是分布式存储的(具体实现详见高效性章节)。
防止恶意攻击也是利用这份数据进行统计的,每台Http server的Linux有一定时程序,会定时读取这份数据,
如果发现某号码符合恶意攻击规则,则会将此号码写入到黑名单中,并拒绝操作;
即便被攻破,系统对于关键操作也要留下操作日志到日志文件中,如log4j日志文件,以便事后诸葛;
4、 高效性
4.1 Cache及Session Server的设计
4.1.1:Cache
对于xxx等不会经常变化的实体信息,可放入Cache中(如OSCache),减少对主数据库的访问;
4.1.2:Session Server
对于xxxxx等实时性要求较高的值,可放入到 Session Server中,每次需要读取或更新
值都到Session Server中读取,减少对主数据库的频繁访问。
一个xx第一次登录,会从主数据库中读取它的所有属性出来放到Session Server中,此后只要此xx在线,所有
xx属性的值变更都是与Session Server交互操作,而系统会定时从Session Server取得数据与主数据进行同步。
Session Server使用 Mysql Memory(Engine)来实现;同时 Session Server是集群式,有N台Cluster节点进行数据复制备份,保证Session Server的稳健性;
4.2 异步处理、队列设计、Socket长连接
4.2.1 开发思路介绍
系统使用 wap表现层+中间件,中间件实现所有业务逻辑,是用异步IO Socket实现的,可以减少线程的创建和discard所带来的性能消耗,在同步Socket中,一般做法是创建一定数量的线程组成线程池,如果数量过多,性能是比较低的,因为当Linux OS在处理超过1000线程时,各线程换页的性能是很低下的。使用异步 IO Socket(即Java NIO)的好处是性能高,由中间件统一管理Session、Cache和Database;
Http server只处理显示页面逻辑部分,而业务逻辑部分是在中间件实现的。Http Server与中间件通过TCp Socket进行通信。
4.2.2 异步处理
对于用户每次操作都需要记录日志的功能,可以使用异步处理的方式来处理,Socket客户端把请求异步
发送给Socket服务器端,无需等待结果返回,提高性能
4.2.3 Socket长连接
对于游戏用户,常用的场景是用户长时间停留在系统操作,故客户端应该Keep Socket连接不关闭,减少经常
创建Socket所带来的性能消耗;
4.2.4 队列设计
对于用户的请求,如果中间件处理不过来,会使用一定数量的队列来存放它,当中间件空闲时,会读取队列进行处理,
提高系统吞吐量;
5、 健壮性
5.1 数据库集群和备份
对于基于Memory存储的数据库,可以使用数据库的Cluster机制进行数据实时同步和备份,不会造成单点危险。
对于基于disk存储的数据库,可以使用数据库的Cluster机制或采用C-JDBC中间件进行数据实时同步和备份。
5.2 中间件冗余设计
可以在同一服务器上使用不同端口启动同一中间件,从而实现功能冗余
5.3 Http Server集群
利用 移动DNS功能,搭建N个Http Server来提高应用的吞吐量和性能
6、 扩展性(SOA)
6.1 组件抽象化:
6.1.1 抽象化组件及定义好接口,所以实现基于接口来开发;组件以接口的方式提供,而实现类是可以随意切换的,这部分使用Ioc容器实现;
6.1.2 接口需足够灵活,足够抽象,应包揽系统所有功能,并供外部本地JVM调用或远程调用;
6.2 业务功能可重用:
使用远程调用方式,如使用web service或其他远程调用方式,如基于二进制数据传输的hessian或基于xml的burlap。
7、 自适应性
7.1 模块可测试
应用程序是基于 JDK5.0上开发的,利用JDK5.0自带的JMX功能,可以实时监控到应用程序的运行情况。
7.2 模块自检
对于关键功能和应用,如果发现故障,系统会自动报故障,以email或手机方式发送给维护人员。
8、 独立性
利用 JMX 可以实时、快速且不影响运行的情况下,隔离有问题的接入系统
9、 系统基础平台选型
OS: Redhat Enterprise Linux 4
JDK: Jdk 5.0
Mysql: mysql 5
Servlet Server: tomcat 5
Web Server: Apache 2.0
Database Backup middelware: Mysql Cluster、C-JDBC(备选)
10、 系统软件架构选型
View:Wap1.0/Wap 2.0 + FreeMarker
MVC: Webwork 2.16
IOC/AOP:Spring 2.0
ORM:IBatis、Hibernate(备选)
Java NIO:Cindy